1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-08-06 22:41:39 +08:00

完成登录和重置密码

This commit is contained in:
xiaochong0302 2020-06-03 19:21:04 +08:00
parent 533b0eaad5
commit be8937ddcf
24 changed files with 209 additions and 153 deletions

View File

@ -23,7 +23,7 @@
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block"> <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="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="verify-btn" class="layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide kg-verify-btn"><i class="layui-icon layui-icon-ok"></i>验证成功</span> <span id="verify-btn" class="kg-verify-btn-ok 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> </div>
{% endif %} {% endif %}
@ -31,7 +31,8 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"></label> <label class="layui-form-label"></label>
<div class="layui-input-block"> <div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" {% if captcha.enabled %}disabled="disabled"{% endif %} lay-submit="true" lay-filter="go">登录</button> {% set disabled = captcha.enabled ? 'disabled="disabled"' : '' %}
<button id="submit-btn" class="layui-btn layui-btn-fluid layui-btn-disabled" {{ disabled }} lay-submit="true" lay-filter="go">登录</button>
<input type="hidden" name="ticket"> <input type="hidden" name="ticket">
<input type="hidden" name="rand"> <input type="hidden" name="rand">
</div> </div>
@ -61,8 +62,8 @@
$('input[name=ticket]').val(res.ticket); $('input[name=ticket]').val(res.ticket);
$('input[name=rand]').val(res.randstr); $('input[name=rand]').val(res.randstr);
$('#captcha-btn').remove(); $('#captcha-btn').remove();
$('#submit-btn').removeAttr('disabled');
$('#verify-btn').removeClass('layui-hide'); $('#verify-btn').removeClass('layui-hide');
$('#submit-btn').removeClass('layui-btn-disabled').removeAttr('disabled');
} }
} }
); );

View File

@ -4,6 +4,7 @@ namespace App\Http\Web\Controllers;
use App\Http\Web\Services\Account as AccountService; use App\Http\Web\Services\Account as AccountService;
use App\Services\Frontend\Account\EmailUpdate as EmailUpdateService; 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\PasswordUpdate as PasswordUpdateService;
use App\Services\Frontend\Account\PhoneUpdate as PhoneUpdateService; use App\Services\Frontend\Account\PhoneUpdate as PhoneUpdateService;
@ -18,6 +19,10 @@ class AccountController extends Controller
*/ */
public function registerAction() public function registerAction()
{ {
if ($this->authUser->id > 0) {
$this->response->redirect('/');
}
$service = new AccountService(); $service = new AccountService();
$captcha = $service->getSectionSettings('captcha'); $captcha = $service->getSectionSettings('captcha');
@ -33,7 +38,18 @@ class AccountController extends Controller
*/ */
public function doRegisterAction() public function doRegisterAction()
{ {
$service = new AccountService();
$service->register();
$returnUrl = $this->request->getPost('return_url');
$content = [
'location' => $returnUrl ?: '/',
'msg' => '注册成功',
];
return $this->jsonSuccess($content);
} }
/** /**
@ -41,6 +57,10 @@ class AccountController extends Controller
*/ */
public function loginAction() public function loginAction()
{ {
if ($this->authUser->id > 0) {
$this->response->redirect('/');
}
$service = new AccountService(); $service = new AccountService();
$captcha = $service->getSectionSettings('captcha'); $captcha = $service->getSectionSettings('captcha');
@ -60,7 +80,14 @@ class AccountController extends Controller
$service->loginByPassword(); $service->loginByPassword();
return $this->jsonSuccess(); $returnUrl = $this->request->getPost('return_url');
$content = [
'location' => $returnUrl ?: '/',
'msg' => '登录成功',
];
return $this->jsonSuccess($content);
} }
/** /**
@ -72,7 +99,14 @@ class AccountController extends Controller
$service->loginByVerify(); $service->loginByVerify();
return $this->jsonSuccess(); $returnUrl = $this->request->getPost('return_url');
$content = [
'location' => $returnUrl ?: '/',
'msg' => '登录成功',
];
return $this->jsonSuccess($content);
} }
/** /**
@ -92,6 +126,10 @@ class AccountController extends Controller
*/ */
public function forgetPasswordAction() public function forgetPasswordAction()
{ {
if ($this->authUser->id > 0) {
$this->response->redirect('/');
}
$service = new AccountService(); $service = new AccountService();
$captcha = $service->getSectionSettings('captcha'); $captcha = $service->getSectionSettings('captcha');
@ -105,7 +143,18 @@ class AccountController extends Controller
*/ */
public function resetPasswordAction() public function resetPasswordAction()
{ {
$service = new PasswordResetService();
$service->handle();
$loginUrl = $this->url->get(['for' => 'web.account.login']);
$content = [
'location' => $loginUrl,
'msg' => '重置密码成功',
];
return $this->jsonSuccess($content);
} }
/** /**

View File

@ -5,8 +5,6 @@ namespace App\Http\Web\Services;
use App\Repos\User as UserRepo; use App\Repos\User as UserRepo;
use App\Services\Auth as AuthService; use App\Services\Auth as AuthService;
use App\Services\Frontend\Account\Register as RegisterService; 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; use App\Validators\Account as AccountValidator;
use App\Validators\Captcha as CaptchaValidator; use App\Validators\Captcha as CaptchaValidator;
@ -34,24 +32,8 @@ class Account extends Service
$user = $userRepo->findById($account->id); $user = $userRepo->findById($account->id);
$this->auth->saveAuthInfo($user); $this->auth->saveAuthInfo($user);
}
public function registerByEmail() return $user;
{
$service = new RegisterByEmailService();
$user = $service->handle();
$this->auth->saveAuthInfo($user);
}
public function registerByPhone()
{
$service = new RegisterByPhoneService();
$user = $service->handle();
$this->auth->saveAuthInfo($user);
} }
public function loginByPassword() public function loginByPassword()

View File

@ -8,7 +8,7 @@
</div> </div>
<div class="register-container"> <div class="register-container">
<form class="layui-form" method="POST" action="{{ url({'for':'web.account.reset_pwd'}) }}"> <form class="layui-form account-form" method="POST" action="{{ url({'for':'web.account.reset_pwd'}) }}">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block"> <div class="layui-input-block">
@ -23,19 +23,24 @@
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block"> <div class="layui-inline verify-input-inline">
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required"> <input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div> </div>
<div class="layui-inline verify-btn-inline">
<button id="cv-verify-emit" class="layui-btn layui-btn-primary layui-btn-disabled" type="button">获取验证码</button>
</div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">
<span id="cv-captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span> <span id="cv-captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="cv-verify-btn" class="layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide verify-btn"><i class="layui-icon layui-icon-ok"></i>验证成功</span> <span id="cv-verify-btn" class="verify-btn-ok 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> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">
<button id="cv-submit-btn" class="layui-btn layui-btn-fluid" disabled="disabled" lay-submit="true" lay-filter="go">立即重置</button> <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-ticket" type="hidden" name="ticket">
<input id="cv-rand" type="hidden" name="rand">
</div> </div>
</div> </div>
</form> </form>

View File

@ -7,19 +7,25 @@
<a><cite>登录</cite></a> <a><cite>登录</cite></a>
</div> </div>
<div class="layui-tab layui-tab-brief login-tab"> <div class="login-container module">
<ul class="layui-tab-title kg-tab-title"> <div class="layui-tab layui-tab-brief login-tab">
<li class="layui-this">密码登录</li> <ul class="layui-tab-title kg-tab-title">
<li>验证码登录</li> <li class="layui-this">密码登录</li>
</ul> <li>验证码登录</li>
<div class="layui-tab-content"> </ul>
<div class="layui-tab-item layui-show"> <div class="layui-tab-content">
{{ partial('account/login_by_password') }} <div class="layui-tab-item layui-show">
</div> {{ partial('account/login_by_password') }}
<div class="layui-tab-item"> </div>
{{ partial('account/login_by_verify') }} <div class="layui-tab-item">
{{ partial('account/login_by_verify') }}
</div>
</div> </div>
</div> </div>
<div class="text-center">
<a class="login-link" href="{{ url({'for':'web.account.register'}) }}">免费注册</a>
<a class="forget-link" href="{{ url({'for':'web.account.forget_pwd'}) }}">忘记密码</a>
</div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -1,4 +1,4 @@
<form class="layui-form" method="POST" action="{{ url({'for':'web.account.pwd_login'}) }}"> <form class="layui-form account-form" method="POST" action="{{ url({'for':'web.account.pwd_login'}) }}">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block"> <div class="layui-input-block">
@ -15,15 +15,15 @@
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block"> <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="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="verify-btn" class="layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide verify-btn"><i class="layui-icon layui-icon-ok"></i>验证成功</span> <span id="verify-btn" class="verify-btn-ok layui-btn layui-btn-primary layui-btn-fluid layui-btn-disabled layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" disabled="disabled" lay-submit="true" lay-filter="go">立即登录</button> <button id="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 type="hidden" name="return_url" value="{{ return_url }}">
<input type="hidden" name="ticket"> <input id="ticket" type="hidden" name="ticket">
<input type="hidden" name="rand"> <input id="rand" type="hidden" name="rand">
</div> </div>
</div> </div>
</form> </form>

View File

@ -1,4 +1,4 @@
<form class="layui-form" method="POST" action="{{ url({'for':'web.account.verify_login'}) }}"> <form class="layui-form account-form" method="POST" action="{{ url({'for':'web.account.verify_login'}) }}">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block"> <div class="layui-input-block">
@ -7,21 +7,26 @@
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block"> <div class="layui-inline verify-input-inline">
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required"> <input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div> </div>
<div class="layui-inline verify-btn-inline">
<button id="cv-verify-emit" class="layui-btn layui-btn-primary layui-btn-disabled" type="button">获取验证码</button>
</div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block"> <div class="layui-input-block">
<span id="cv-captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span> <span id="cv-captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="cv-verify-btn" class="verify-btn layui-btn layui-btn-primary layui-btn-disabled layui-btn-fluid layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span> <span id="cv-verify-btn" class="verify-btn-ok layui-btn layui-btn-primary layui-btn-fluid layui-btn-disabled layui-hide"><i class="layui-icon layui-icon-ok"></i>验证成功</span>
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">
<button id="cv-submit-btn" class="layui-btn layui-btn-fluid" disabled="disabled" lay-submit="true" lay-filter="go">立即登录</button> <button id="cv-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 type="hidden" name="return_url" value="{{ return_url }}">
<input id="cv-ticket" type="hidden" name="ticket">
<input id="cv-rand" type="hidden" name="rand">
</div> </div>
</div> </div>
</form> </form>

View File

@ -8,11 +8,11 @@
</div> </div>
<div class="register-container"> <div class="register-container">
<form class="layui-form" method="POST" action="{{ url({'for':'web.account.do_register'}) }}"> <form class="layui-form account-form" method="POST" action="{{ url({'for':'web.account.do_register'}) }}">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机 / 邮箱" lay-verify="required"> <input id="cv-account" class="layui-input" type="text" name="account" autocomplete="off" placeholder="手机 / 邮箱" lay-verify="required">
</div> </div>
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
@ -23,20 +23,25 @@
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label> <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
<div class="layui-input-block"> <div class="layui-inline verify-input-inline">
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required"> <input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
</div> </div>
</div> <div class="layui-inline verify-btn-inline">
<div class="layui-form-item"> <button id="cv-verify-emit" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
<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> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <div class="layui-input-block">
<button id="submit-btn" class="layui-btn layui-btn-fluid" disabled="disabled" lay-submit="true" lay-filter="go">立即注册</button> <span id="cv-captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" data-app-id="{{ captcha.app_id }}">点击完成验证</span>
<span id="cv-verify-btn" class="verify-btn-ok 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="cv-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 type="hidden" name="return_url" value="{{ return_url }}">
<input id="cv-ticket" type="hidden" name="ticket">
<input id="cv-rand" type="hidden" name="rand">
</div> </div>
</div> </div>
</form> </form>
@ -47,6 +52,6 @@
{% block include_js %} {% block include_js %}
{{ js_include('https://ssl.captcha.qq.com/TCaptcha.js',false) }} {{ js_include('https://ssl.captcha.qq.com/TCaptcha.js',false) }}
{{ js_include('web/js/captcha.js') }} {{ js_include('web/js/captcha.verify.js') }}
{% endblock %} {% endblock %}

View File

@ -28,18 +28,18 @@
</div> </div>
<div class="user layui-layout-right"> <div class="user layui-layout-right">
{% if auth_user %} {% if auth_user.id > 0 %}
<ul class="layui-nav"> <ul class="layui-nav">
<li class="layui-nav-item"><a href="{{ url({'for':'web.my.courses'}) }}">消息</a></li> <li class="layui-nav-item"><a href="{{ url({'for':'web.my.courses'}) }}">消息</a></li>
<li class="layui-nav-item"> <li class="layui-nav-item">
<a href="javascript:">{{ auth_user.name }}</a> <a href="javascript:">{{ auth_user.name }}</a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<dd><a href="{{ url({'for':'web.my.courses'}) }} }}">我的课程</a></dd> <dd><a href="{{ url({'for':'web.my.courses'}) }}">我的课程</a></dd>
<dd><a href="{{ url({'for':'web.my.courses'}) }} }}">我的收藏</a></dd> <dd><a href="{{ url({'for':'web.my.courses'}) }}">我的收藏</a></dd>
<dd><a href="{{ url({'for':'web.my.courses'}) }} }}">我的咨询</a></dd> <dd><a href="{{ url({'for':'web.my.courses'}) }}">我的咨询</a></dd>
<dd><a href="{{ url({'for':'web.my.courses'}) }} }}">我的订单</a></dd> <dd><a href="{{ url({'for':'web.my.courses'}) }}">我的订单</a></dd>
<dd><a href="{{ url({'for':'web.my.courses'}) }} }}">个人设置</a></dd> <dd><a href="{{ url({'for':'web.my.courses'}) }}">个人设置</a></dd>
<dd><a href="{{ url({'for':'web.my.courses'}) }} }}">退出登录</a></dd> <dd><a href="{{ url({'for':'web.account.logout'}) }}">退出登录</a></dd>
</dl> </dl>
</li> </li>
</ul> </ul>

View File

@ -66,7 +66,7 @@ class Common
public static function phone($str) public static function phone($str)
{ {
$pattern = '/^(13[0-9]|15[0-3]|15[5-9]|180|18[5-9])[0-9]{8}$/'; $pattern = '/^1(3|4|5|6|7|9)[0-9]{9}$/';
return preg_match($pattern, $str) ? true : false; return preg_match($pattern, $str) ? true : false;
} }

View File

@ -15,7 +15,7 @@ class PasswordReset extends FrontendService
$accountValidator = new AccountValidator(); $accountValidator = new AccountValidator();
$account = $accountValidator->checkLoginName($post['account']); $account = $accountValidator->checkAccount($post['account']);
$accountValidator->checkPassword($post['new_password']); $accountValidator->checkPassword($post['new_password']);

View File

@ -15,7 +15,7 @@ class PasswordResetByEmail extends FrontendService
$accountValidator = new AccountValidator(); $accountValidator = new AccountValidator();
$account = $accountValidator->checkAccountByEmail($post['email']); $account = $accountValidator->checkAccount($post['email']);
$accountValidator->checkPassword($post['new_password']); $accountValidator->checkPassword($post['new_password']);

View File

@ -15,7 +15,7 @@ class PasswordResetByPhone extends FrontendService
$accountValidator = new AccountValidator(); $accountValidator = new AccountValidator();
$account = $accountValidator->checkAccountByPhone($post['phone']); $account = $accountValidator->checkAccount($post['phone']);
$accountValidator->checkPassword($post['new_password']); $accountValidator->checkPassword($post['new_password']);

View File

@ -21,6 +21,8 @@ class Register extends FrontendService
$accountValidator = new AccountValidator(); $accountValidator = new AccountValidator();
$accountValidator->checkLoginName($post['account']);
$data = []; $data = [];
if (CommonValidator::phone($post['account'])) { if (CommonValidator::phone($post['account'])) {

View File

@ -34,9 +34,9 @@ class ChapterInfo extends FrontendService
public function handle($id) public function handle($id)
{ {
$chapter = $this->checkChapter($id); $chapter = $this->checkChapterCache($id);
$course = $this->checkCourse($chapter->course_id); $course = $this->checkCourseCache($chapter->course_id);
$this->course = $course; $this->course = $course;

View File

@ -35,17 +35,7 @@ class ChapterList extends FrontendService
return []; return [];
} }
if ($user->id == 0) { if ($user->id > 0 && $this->courseUser) {
foreach ($chapters as &$chapter) {
foreach ($chapter['children'] as &$lesson) {
$lesson['me'] = [
'owned' => $this->ownedCourse || $lesson['free'] ? 1 : 0,
'progress' => 0,
'duration' => 0,
];
}
}
} else {
$mappings = $this->getLearningMappings($course->id, $user->id, $this->courseUser->plan_id); $mappings = $this->getLearningMappings($course->id, $user->id, $this->courseUser->plan_id);
foreach ($chapters as &$chapter) { foreach ($chapters as &$chapter) {
foreach ($chapter['children'] as &$lesson) { foreach ($chapter['children'] as &$lesson) {
@ -56,6 +46,16 @@ class ChapterList extends FrontendService
]; ];
} }
} }
} else {
foreach ($chapters as &$chapter) {
foreach ($chapter['children'] as &$lesson) {
$lesson['me'] = [
'owned' => $this->ownedCourse || $lesson['free'] ? 1 : 0,
'progress' => 0,
'duration' => 0,
];
}
}
} }
return $chapters; return $chapters;

View File

@ -22,7 +22,7 @@ class Verify extends MailerService
$minutes = 5; $minutes = 5;
$code = $verify->getSmsCode($email, 60 * $minutes); $code = $verify->getEmailCode($email, 60 * $minutes);
$subject = '邮件验证码'; $subject = '邮件验证码';

View File

@ -15,10 +15,10 @@ class Account extends Validator
public function checkAccount($name) public function checkAccount($name)
{ {
$accountRepo = new AccountRepo();
$account = null; $account = null;
$accountRepo = new AccountRepo();
if (CommonValidator::email($name)) { if (CommonValidator::email($name)) {
$account = $accountRepo->findByEmail($name); $account = $accountRepo->findByEmail($name);
} elseif (CommonValidator::phone($name)) { } elseif (CommonValidator::phone($name)) {
@ -34,38 +34,14 @@ class Account extends Validator
return $account; return $account;
} }
public function checkAccountByEmail($email)
{
$accountRepo = new AccountRepo();
$account = $accountRepo->findByEmail($email);
if (!$account) {
throw new BadRequestException('account.not_found');
}
return $account;
}
public function checkAccountByPhone($phone)
{
$accountRepo = new AccountRepo();
$account = $accountRepo->findByPhone($phone);
if (!$account) {
throw new BadRequestException('account.not_found');
}
return $account;
}
public function checkLoginName($name) public function checkLoginName($name)
{ {
$isPhone = CommonValidator::phone($name); $isPhone = CommonValidator::phone($name);
$isEmail = CommonValidator::email($name); $isEmail = CommonValidator::email($name);
if (!$isPhone && !$isEmail) { $loginNameOk = $isPhone || $isEmail;
if (!$loginNameOk) {
throw new BadRequestException('account.invalid_login_name'); throw new BadRequestException('account.invalid_login_name');
} }
} }

View File

@ -9,7 +9,7 @@ use Phalcon\Mvc\User\Component;
class Validator extends Component class Validator extends Component
{ {
public function checkAuthUser(array $authUser) public function checkAuthUser($authUser)
{ {
if (empty($authUser['id'])) { if (empty($authUser['id'])) {
throw new UnauthorizedException('sys.unauthorized'); throw new UnauthorizedException('sys.unauthorized');

View File

@ -27,12 +27,14 @@ class Verify extends Validator
return $email; return $email;
} }
public function checkCode($name, $code) public function checkCode($identity, $code)
{ {
if (CommonValidator::email($name)) { if (CommonValidator::email($identity)) {
$this->checkEmailCode($name, $code); $this->checkEmailCode($identity, $code);
} elseif (CommonValidator::phone($name)) { } elseif (CommonValidator::phone($identity)) {
$this->checkSmsCode($name, $code); $this->checkSmsCode($identity, $code);
} else {
throw new BadRequestException('verify.unsupported_identity');
} }
} }

View File

@ -42,7 +42,7 @@
margin-right: 10px; margin-right: 10px;
} }
.kg-btn-verify { .kg-verify-btn-ok {
color: green; color: green;
} }

View File

@ -419,7 +419,7 @@ body {
} }
.package-item { .package-item {
margin-bottom: 25px; margin-bottom: 20px;
border-bottom: 1px dashed #ccc; border-bottom: 1px dashed #ccc;
} }
@ -469,7 +469,7 @@ body {
.package-course-list { .package-course-list {
width: 580px; width: 580px;
height: 170px; height: 180px;
overflow-x: auto; overflow-x: auto;
white-space: nowrap; white-space: nowrap;
} }
@ -484,9 +484,11 @@ body {
.package-course-card { .package-course-card {
width: 175px; width: 175px;
height: 160px;
display: inline-block; display: inline-block;
margin-right: 8px; margin-right: 8px;
vertical-align: top; vertical-align: top;
box-shadow: 0 4px 8px 0 rgba(7, 17, 27, 0.1);
} }
.package-course-card .cover { .package-course-card .cover {
@ -502,6 +504,8 @@ body {
.package-course-card .title { .package-course-card .title {
font-size: 12px; font-size: 12px;
padding: 0 3px;
text-align: center;
white-space: normal; white-space: normal;
} }
@ -785,28 +789,30 @@ body {
text-align: center; text-align: center;
} }
.verify-tips-btn { .verify-btn-ok {
color: green; color: green;
} }
.register-container { .account-form {
padding: 40px 30px; width: 540px;
background-color: #fff;
} }
.register-container .layui-form { .account-form .verify-input-inline {
width: 50%; width: 308px;
}
.account-form .verify-btn-inline {
margin-right: 0;
}
.login-container {
} }
.login-tab { .login-tab {
padding: 20px 30px; margin: 0;
background-color: #fff;
} }
.login-tab .layui-tab-content { .login-tab .layui-tab-content {
padding-top: 30px; padding-top: 30px;
} }
.login-tab .layui-form {
width: 50%;
}

View File

@ -5,11 +5,11 @@ var captcha = new TencentCaptcha(
$('#captcha-btn').attr('data-app-id'), $('#captcha-btn').attr('data-app-id'),
function (res) { function (res) {
if (res.ret === 0) { if (res.ret === 0) {
$('input[name=ticket]').val(res.ticket); $('#ticket').val(res.ticket);
$('input[name=rand]').val(res.randstr); $('#rand').val(res.randstr);
$('#captcha-btn').remove(); $('#captcha-btn').remove();
$('#submit-btn').removeAttr('disabled');
$('#verify-btn').removeClass('layui-hide'); $('#verify-btn').removeClass('layui-hide');
$('#submit-btn').removeClass('layui-btn-disabled').removeAttr('disabled');
} }
} }
); );

View File

@ -5,24 +5,41 @@ var captcha = new TencentCaptcha(
$('#cv-captcha-btn').attr('data-app-id'), $('#cv-captcha-btn').attr('data-app-id'),
function (res) { function (res) {
if (res.ret === 0) { if (res.ret === 0) {
$.ajax({ $('#cv-ticket').val(res.ticket);
type: 'POST', $('#cv-rand').val(res.randstr);
url: '/verify/code',
data: {
account: $('#cv-account').val(),
ticket: res.ticket,
rand: res.randstr
},
success: function (res) {
var icon = res.code === 0 ? 1 : 2;
if (res.msg) {
layer.msg(res.msg, {icon: icon});
}
}
});
$('#cv-captcha-btn').remove(); $('#cv-captcha-btn').remove();
$('#cv-submit-btn').removeAttr('disabled');
$('#cv-verify-btn').removeClass('layui-hide'); $('#cv-verify-btn').removeClass('layui-hide');
$('#cv-verify-emit').removeClass('layui-btn-disabled').removeAttr('disabled');
} }
} }
); );
$('#cv-verify-emit').on('click', function () {
var account = $('#cv-account').val();
var regEmail = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/;
var regPhone = /^1(3|4|5|6|7|8|9)\d{9}$/;
var isEmail = regEmail.test(account);
var isPhone = regPhone.test(account);
if (isEmail || isPhone) {
var postUrl = null;
var postData = {
ticket: $('#cv-ticket').val(),
rand: $('#cv-rand').val(),
};
if (isPhone) {
postData.phone = account;
postUrl = '/verify/sms/code';
} else if (isEmail) {
postData.email = account;
postUrl = '/verify/email/code';
}
$.post(postUrl, postData, function (res) {
if (res.code === 0) {
$('#cv-submit-btn').removeClass('layui-btn-disabled').removeAttr('disabled');
layer.msg('发送验证码成功', {icon: 1});
} else {
layer.msg('发送验证码失败', {icon: 2});
}
});
}
});