Skip to content

Commit

Permalink
Added:注册需要验证短信验证码
Browse files Browse the repository at this point in the history
  • Loading branch information
Qsnh committed Oct 17, 2018
1 parent eaaffd7 commit 7ec02d3
Show file tree
Hide file tree
Showing 15 changed files with 169 additions and 98 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@

## 2018/10/17

+ Added:注册需要验证短信验证码

## 2018/10/16

+ Added:API接口的单元测试

## 2018/10/11

+ Added:基本完成meedu的API接口
Expand Down
14 changes: 2 additions & 12 deletions app/Http/Controllers/Auth/ForgotPasswordController.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Session;
use App\Http\Requests\Frontend\PasswordResetRequest;

class ForgotPasswordController extends Controller
Expand All @@ -25,25 +24,16 @@ public function showPage()

public function handler(PasswordResetRequest $request)
{
$captcha = Session::get('password_reset_captcha');
if (! $captcha || $captcha != $request->input('sms_captcha')) {
flash('短信验证码错误');

return back();
}

$user = User::whereMobile($request->input('mobile'))->first();
$user = User::whereMobile($request->post('mobile'))->first();
if (! $user) {
flash('用户不存在');

return back();
}

$user->password = bcrypt($request->input('password'));
$user->password = bcrypt($request->post('password'));
$user->save();

Session::forget('password_reset_captcha');

flash('密码修改成功', 'success');

return redirect(route('login'));
Expand Down
62 changes: 41 additions & 21 deletions app/Http/Controllers/Frontend/SmsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace App\Http\Controllers\Frontend;

use Exception;
use App\Models\SmsRecord;
use Overtrue\EasySms\EasySms;
use App\Http\Requests\Frontend\SmsSendRequest;
Expand All @@ -21,35 +22,54 @@ public function send(SmsSendRequest $request)
{
$data = $request->filldata();
$method = 'send'.$data['method'];
try {
throw_if(! method_exists($this, $method), new Exception('参数错误'));

return $this->{$method}($data['mobile']);
} catch (Exception $exception) {
exception_record($exception);

return $this->{$method}($request, $data['mobile']);
return exception_response($exception, '短信验证码发送失败');
}
}

public function sendPasswordReset($request, $mobile)
public function sendRegister($mobile)
{
$code = mt_rand(1000, 10000);
return $this->sendHandler($mobile, 'sms_register', 'register');
}

session(['password_reset_captcha' => $code]);
public function sendPasswordReset($mobile)
{
return $this->sendHandler($mobile, 'sms_password_reset', 'password_reset');
}

/**
* 发送验证码逻辑.
*
* @param $mobile
* @param $sessionKey
* @param $templateId
*
* @return array
*
* @throws \Overtrue\EasySms\Exceptions\InvalidArgumentException
* @throws \Overtrue\EasySms\Exceptions\NoGatewayAvailableException
*/
protected function sendHandler($mobile, $sessionKey, $templateId)
{
$code = mt_rand(1000, 10000);
session([$sessionKey => $code]);
$config = config('sms');
$easySms = new EasySms($config);
$data = [
'content' => "您的验证码为:{$code}",
'template' => $config['gateways'][$config['default']['gateways'][0]]['template'][$templateId],
'data' => ['code' => $code],
];
$sendResponse = $easySms->send($mobile, $data);
// Log
SmsRecord::createData($mobile, $data, $sendResponse);

try {
$data = [
'content' => "您的验证码为:{$code}",
'template' => $config['gateways'][$config['default']['gateways'][0]]['template']['password_reset'],
'data' => [
'code' => $code,
],
];
$sendResponse = $easySms->send($mobile, $data);

// Log
SmsRecord::createData($mobile, $data, $sendResponse);

return $this->success('验证码发送成功');
} catch (\Exception $exception) {
return exception_response($exception, '验证码发送失败');
}
return $this->success('验证码发送成功');
}
}
4 changes: 4 additions & 0 deletions app/Http/Kernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
namespace App\Http;

use App\Http\Middleware\UserShareMiddleware;
use App\Http\Middleware\CheckSmsCodeMiddleware;
use App\Http\Middleware\CheckImageCaptchaMiddleware;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
use App\Http\Middleware\AdministratorLoginCheckMiddleware;

Expand Down Expand Up @@ -71,5 +73,7 @@ class Kernel extends HttpKernel

'backend.login.check' => AdministratorLoginCheckMiddleware::class,
'user.share' => UserShareMiddleware::class,
'sms.check' => CheckSmsCodeMiddleware::class,
'image.captcha.check' => CheckImageCaptchaMiddleware::class,
];
}
36 changes: 36 additions & 0 deletions app/Http/Middleware/CheckImageCaptchaMiddleware.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

/*
* This file is part of the Qsnh/meedu.
*
* (c) XiaoTeng <616896861@qq.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/

namespace App\Http\Middleware;

use Closure;

class CheckImageCaptchaMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @return mixed
*/
public function handle($request, Closure $next)
{
if (! captcha_check($request->post('captcha'))) {
flash('图形验证码错误');

return back();
}

return $next($request);
}
}
44 changes: 44 additions & 0 deletions app/Http/Middleware/CheckSmsCodeMiddleware.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

/*
* This file is part of the Qsnh/meedu.
*
* (c) XiaoTeng <616896861@qq.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/

namespace App\Http\Middleware;

use Closure;

class CheckSmsCodeMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @return mixed
*/
public function handle($request, Closure $next)
{
if (! captcha_check($request->post('captcha', ''))) {
flash('图形验证码错误');

return back();
}
$sessionKey = 'sms_'.$request->post('sms_captcha_key', '');
$captcha = session($sessionKey);
if (! $captcha || $captcha != $request->post('sms_captcha', '')) {
flash('短信验证码错误');

return back();
}
session()->forget($sessionKey);

return $next($request);
}
}
4 changes: 2 additions & 2 deletions app/Http/Requests/Frontend/SmsSendRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public function rules()
return [
'captcha' => 'required|captcha',
'mobile' => 'required',
'method' => ['required', Rule::in(['passwordReset'])],
'method' => ['required', Rule::in(['password_reset', 'register'])],
];
}

Expand All @@ -38,7 +38,7 @@ public function filldata()
{
return [
'mobile' => $this->input('mobile'),
'method' => ucfirst($this->input('method')),
'method' => implode('', array_map('ucfirst', explode('_', $this->input('method')))),
];
}
}
4 changes: 2 additions & 2 deletions app/Models/SmsRecord.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ public static function createData(string $mobile, array $sendData, array $respon
{
$self = new self();
$self->mobile = $mobile;
$self->send_date = $sendData;
$self->response_data = $response;
$self->send_data = json_encode($sendData);
$self->response_data = json_encode($response);
$self->save();
}
}
4 changes: 2 additions & 2 deletions app/Repositories/IndexRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class IndexRepository
*/
public function recentPublishedAndShowCourses()
{
if (config('meedu.system.cache.status')) {
if (config('meedu.system.cache.status', false)) {
return Cache::remember('index_recent_course', config('meedu.system.cache.expire', 60), function () {
return Course::published()->show()->orderByDesc('created_at')->limit(3)->get();
});
Expand All @@ -40,7 +40,7 @@ public function recentPublishedAndShowCourses()
*/
public function roles()
{
if (config('meedu.system.cache.status')) {
if (config('meedu.system.cache.status', false)) {
return Cache::remember('index_roles', config('meedu.system.cache.expire', 60), function () {
return Role::orderByDesc('weight')->limit(3)->get();
});
Expand Down
1 change: 1 addition & 0 deletions config/sms.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
'sign_name' => '微菲系统',
'template' => [
'password_reset' => 'SMS_81985082',
'register' => 'SMS_81985082',
],
],
],
Expand Down
2 changes: 1 addition & 1 deletion resources/views/auth/passwords/find.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<h3 class="text-center login-box-title">重置密码</h3>
<form class="form-horizontal" method="POST">
@csrf
@include('components.frontend.mobile_captcha')
@include('components.frontend.mobile_captcha', ['smsCaptchaKey' => 'password_reset'])
<div class="form-group">
<label for="password">密码</label>
<input id="password" type="password" placeholder="请输入新密码" class="form-control" name="password" required>
Expand Down
5 changes: 1 addition & 4 deletions resources/views/auth/register.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@
<label for="nick_name">昵称</label>
<input id="nick_name" type="text" class="form-control" placeholder="昵称" name="nick_name" value="{{ old('nick_name') }}" required>
</div>
<div class="form-group">
<label for="mobile">手机号</label>
<input id="mobile" type="mobile" class="form-control" placeholder="手机号" name="mobile" value="{{ old('mobile') }}" required>
</div>
@include('components.frontend.mobile_captcha', ['smsCaptchaKey' => 'register'])
<div class="form-group">
<label for="password">密码</label>
<input id="password" type="password" class="form-control" placeholder="密码" name="password" required>
Expand Down
30 changes: 19 additions & 11 deletions resources/views/components/frontend/mobile_captcha.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,27 @@
<div class="form-group">
<label>验证码</label>
<div class="row">
<div class="col-sm-6">
<input type="text" name="captcha" placeholder="验证码" class="form-control" required>
</div>
<div class="col-sm-6">
<img src="{{ captcha_src() }}" class="captcha" width="120" height="36">
<div class="col-sm">
<div class="input-group">
<input type="text" name="captcha" placeholder="验证码" class="form-control" required>
<div class="input-group-append">
<img src="{{ captcha_src() }}" class="captcha" width="120" height="36">
</div>
</div>
</div>
</div>
</div>
<div class="form-group">
<label>手机验证码</label>
<div class="row">
<div class="col-sm-6">
<input type="text" name="sms_captcha" placeholder="手机验证码" class="form-control" required>
</div>
<div class="col-sm-6">
<button type="button" class="send-sms-captcha btn btn-primary">发送验证码</button>
<div class="col-sm">
<div class="input-group">
<input type="text" name="sms_captcha" placeholder="手机验证码" class="form-control" required>
<input type="hidden" name="sms_captcha_key" value="{{$smsCaptchaKey ?? ''}}">
<div class="input-group-append">
<button type="button" style="width: 120px;" class="send-sms-captcha btn btn-primary">发送验证码</button>
</div>
</div>
</div>
</div>
</div>
Expand All @@ -44,24 +49,27 @@
$.post('{{ route('sms.send') }}', {
mobile: mobile,
captcha: captcha,
method: 'passwordReset',
method: '{{$smsCaptchaKey}}',
_token: '{{ csrf_token() }}'
}, function (res) {
if (res.code != 200) {
alert(res.message);
$('.captcha').click();
return false;
}
$('.captcha').click();
SMS_CURRENT_TIME = SMS_CYCLE_TIME;
var smsInterval = setInterval(function () {
if (SMS_CURRENT_TIME <= 1) {
$('.send-sms-captcha').text('发送验证码');
$('.send-sms-captcha').attr('disabled', false);
clearInterval(smsInterval);
return;
}
SMS_CURRENT_TIME = SMS_CURRENT_TIME - 1;
$('.send-sms-captcha').text(SMS_CURRENT_TIME + 's');
$('.send-sms-captcha').attr('disabled', true);
}, 1000);
}, 'json');
Expand Down
4 changes: 3 additions & 1 deletion routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@
Route::get('/', 'Frontend\IndexController@index')->name('index');

Auth::routes();
Route::get('/register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('/register', 'Auth\RegisterController@register')->middleware('sms.check');
Route::get('/password/reset', 'Auth\ForgotPasswordController@showPage')->name('password.request');
Route::post('/password/reset', 'Auth\ForgotPasswordController@handler');
Route::post('/password/reset', 'Auth\ForgotPasswordController@handler')->middleware('sms.check');
Route::post('/sms/send', 'Frontend\SmsController@send')->name('sms.send');

Route::get('/courses', 'Frontend\CourseController@index')->name('courses');
Expand Down
Loading

0 comments on commit 7ec02d3

Please sign in to comment.