后台找回密码功能

This commit is contained in:
TL 2022-07-14 15:05:52 +08:00
parent 3500482767
commit 41f163edf1
5 changed files with 251 additions and 0 deletions

View File

@ -0,0 +1,51 @@
<?php
/**
* ForgottenController.php
*
* @copyright 2022 opencart.cn - All Rights Reserved
* @link http://www.guangdawangluo.com
* @author TL <mengwb@opencart.cn>
* @created 2022-07-14 11:39:08
* @modified 2022-07-14 11:39:08
*/
namespace Beike\Admin\Http\Controllers;
use Beike\Admin\Http\Requests\ForgottenRequest;
use Beike\Admin\Services\UserService;
use Illuminate\Http\Request;
class ForgottenController
{
/**
* 找回密码页面
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
*/
public function index()
{
return view('account/forgotten');
}
/**
* 接收email地址生成验证码发送到邮件地址
* @param Request $request
* @return array
*/
public function sendVerifyCode(Request $request)
{
UserService::sendVerifyCodeForForgotten($request->get('email'));
return json_success('验证码已发送,请查看并输入验证码');
}
/**
* 接收验证码和新密码、确认密码,验证验证码是否正确、密码和确认密码是否相等,然后修改密码
* @param Request $request
* @return array
*/
public function changePassword(ForgottenRequest $request)
{
UserService::verifyAndChangePassword($request->get('code'), $request->get('email'), $request->get('password'));
return json_success('密码已修改');
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace Beike\Admin\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ForgottenRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'password' => 'required|confirmed',
];
}
public function attributes()
{
return [
'password' => '密码'
];
}
}

View File

@ -51,6 +51,9 @@ Route::prefix($adminName)
Route::get('logout', [Controllers\LogoutController::class, 'index'])->name('logout.index');
Route::get('forgotten', [\Beike\Admin\Http\Controllers\ForgottenController::class, 'index'])->name('forgotten.index');
Route::post('forgotten/send_code', [\Beike\Admin\Http\Controllers\ForgottenController::class, 'sendVerifyCode'])->name('forgotten.send_code');
Route::post('forgotten/password', [\Beike\Admin\Http\Controllers\ForgottenController::class, 'changePassword'])->name('forgotten.password');
});
});

View File

@ -0,0 +1,70 @@
<?php
/**
* UserService.php
*
* @copyright 2022 opencart.cn - All Rights Reserved
* @link http://www.guangdawangluo.com
* @author TL <mengwb@opencart.cn>
* @created 2022-07-14 12:12:57
* @modified 2022-07-14 12:12:57
*/
namespace Beike\Admin\Services;
use Beike\Libraries\Notification;
use Beike\Repositories\UserRepo;
use Beike\Repositories\VerifyCodeRepo;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Log;
class UserService
{
/**
* 发送验证码通过$type方式type为email或telephone
* @param $email
* @param $type
* @return void
*/
public static function sendVerifyCodeForForgotten($email, $type) {
$code = str_pad(mt_rand(10, 999999), 6, '0', STR_PAD_LEFT);
VerifyCodeRepo::deleteByAccount($email);
VerifyCodeRepo::create([
'account' => $email,
'code' => $code,
]);
Log::info("找回密码验证码:{$code}");
Notification::verifyCode($code, "您的验证码是%s,该验证码仅用于找回密码。", $type);
}
/**
* 验证验证码是否正确,并修改密码为新密码
* @param $code
* @param $account
* @param $password
* @return void
*/
public static function verifyAndChangePassword($code, $account, $password)
{
$verifyCode = VerifyCodeRepo::findByAccount($account);
if ($verifyCode->created_at->addMinutes(10) < Carbon::now()) {
$verifyCode->delete();
throw new \Exception("您的验证码已过期10分钟请重新获取");
}
if ($verifyCode->code != $code) {
throw new \Exception("您的验证码错误");
}
$user = UserRepo::findByEmail($account);
if (!$user) {
throw new \Exception("账号不存在");
}
UserRepo::update($user, ['password' => $password]);
$verifyCode->delete();
}
}

View File

@ -0,0 +1,90 @@
<?php
/**
* UserRepo.php
*
* @copyright 2022 opencart.cn - All Rights Reserved
* @link http://www.guangdawangluo.com
* @author TL <mengwb@opencart.cn>
* @created 2022-07-14 11:45:41
* @modified 2022-07-14 11:45:41
*/
namespace Beike\Repositories;
use Beike\Models\AdminUser;
use Illuminate\Support\Facades\Hash;
class UserRepo
{
/**
* 创建一个记录
* @param $data
* @return int
*/
public static function create($data)
{
$data['password'] = Hash::make($data['password']);
return AdminUser::query()->create($data);
}
/**
* @param $user
* @param $data
* @return bool|int
*/
public static function update($user, $data)
{
if (!$user instanceof AdminUser) {
$user = AdminUser::query()->findOrFail($user);
}
if (isset($data['password'])) {
$data['password'] = Hash::make($data['password']);
}
return $user->update($data);
}
public static function findByEmail($email)
{
return AdminUser::query()->where('email', $email)->first();
}
/**
* @param $id
* @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Model|null
*/
public static function find($id)
{
return AdminUser::query()->find($id);
}
/**
* @param $id
* @return void
*/
public static function delete($id)
{
AdminUser::query()->find($id)->delete();
}
/**
* @param $data
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*/
public static function list($data)
{
$builder = AdminUser::query();
if (isset($data['name'])) {
$builder->where('admin_users.name', 'like', "%{$data['name']}%");
}
if (isset($data['email'])) {
$builder->where('admin_users.email', 'like', "%{$data['email']}%");
}
if (isset($data['active'])) {
$builder->where('admin_users.active', $data['active']);
}
return $builder->paginate(20)->withQueryString();
}
}