From 68f5b30f7d62ed51a518360a8f4370240f36781d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9F=A6=E8=8D=A3=E8=B6=85?= <302645122@qq.com> Date: Wed, 2 Mar 2022 18:11:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=82=AE=E7=AE=B1=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/UsersController.php | 58 +++++++++++++ app/Models/User.php | 2 + app/Models/UserEmailVerification.php | 69 +++++++++++++++ app/Models/WebSocketDialogUser.php | 2 + ...02_161123_add_is_email_verity_to_users.php | 32 +++++++ ..._create_user_email_verifications_table.php | 35 ++++++++ .../assets/js/pages/email/validEmail.vue | 84 +++++++++++++++++++ resources/assets/js/routes.js | 6 ++ resources/views/email.blade.php | 15 ++++ 9 files changed, 303 insertions(+) create mode 100644 app/Models/UserEmailVerification.php create mode 100644 database/migrations/2022_03_02_161123_add_is_email_verity_to_users.php create mode 100644 database/migrations/2022_03_02_172504_create_user_email_verifications_table.php create mode 100644 resources/assets/js/pages/email/validEmail.vue create mode 100644 resources/views/email.blade.php diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 03f921959..af42bfc85 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -3,12 +3,17 @@ namespace App\Http\Controllers\Api; use App\Models\User; +use App\Models\UserEmailVerification; use App\Module\Base; use Arr; use Cache; use Captcha; use Carbon\Carbon; +use Config; +use Mail; use Request; +use Exception; +use Validator; /** * @apiDefine users @@ -53,6 +58,10 @@ class UsersController extends AbstractController } } $user = User::reg($email, $password); + $isRegVerify = false;//Base::settingFind('emailSetting', 'reg_verify') === 'open' ? true : false; + if ($isRegVerify) { + UserEmailVerification::userEmailSend($user); + } } else { $needCode = !Base::isError(User::needCode($email)); if ($needCode) { @@ -559,4 +568,53 @@ class UsersController extends AbstractController // return Base::retSuccess('修改成功', $userInfo); } + + /** + * @api {get} api/users/email/verification 13. 邮箱验证 + * + * @apiDescription 不需要token身份 + * @apiVersion 1.0.0 + * @apiGroup users + * @apiName email__verification + * + * @apiParam {String} code 验证参数 + * + * @apiSuccess {Number} ret 返回状态码(1正确、0错误) + * @apiSuccess {String} msg 返回信息(错误描述) + * @apiSuccess {Object} data 返回数据(同"获取我的信息"接口) + */ + public function email__verification() + { + $data = Request::input(); + // 表单验证 + $validator = Validator::make($data, [ + "code" => ["required"], + ], [ + "code.required" => "required字段非法", + ]); + if ($validator->fails()) + return Base::retError($validator->errors()->first()); + $res = UserEmailVerification::where('code', $data['code'])->first(); + if (empty($res)) { + return Base::retError('链接已失效'); + } + // 如果已经校验过 + if (intval($res->status) === 1) + return Base::retError('链接已经使用过'); + + $oldTime = strtotime($res->created_at); + $time = time(); + //24个小时失效 + if (abs($time - $oldTime) > 86400) { + return Base::retError("链接已失效"); + } + UserEmailVerification::where('code', $data['code']) + ->update([ + 'status' => 1 + ]); + User::where('userid', $res->userid)->update([ + 'is_email_verity' => 1 + ]); + return Base::retSuccess('绑定邮箱成功'); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 2c647a873..b039e2cd3 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -29,6 +29,7 @@ use Carbon\Carbon; * @property int|null $task_dialog_id 最后打开的任务会话ID * @property string|null $created_ip 注册IP * @property string|null $disable_at 禁用时间 + * @property int $is_email_verity 邮箱是否已验证 * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at * @method static \Database\Factories\UserFactory factory(...$parameters) @@ -43,6 +44,7 @@ use Carbon\Carbon; * @method static \Illuminate\Database\Eloquent\Builder|User whereEmail($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereEncrypt($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereIdentity($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereIsEmailVerity($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereLastAt($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereLastIp($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereLineAt($value) diff --git a/app/Models/UserEmailVerification.php b/app/Models/UserEmailVerification.php new file mode 100644 index 000000000..7ce22ab82 --- /dev/null +++ b/app/Models/UserEmailVerification.php @@ -0,0 +1,69 @@ +userid)->delete(); + $info['created_at'] = date("Y-m-d H:i:s"); + $info['userid'] = $user->userid; + $info['email'] = $user->email; + $info['code'] = md5(uniqid(md5(microtime(true)), true)) . md5($user->userid . md5('lddsgagsgkdiid' . microtime(true))); + $url = Base::fillUrl('valid/email') . '?code=' . $info['code']; + $info['status'] = 0; + $userEmailVerification = self::createInstance($info); + $userEmailVerification->save(); + try { + // 15秒后超时 + Mail::send('email', ['url' => $url], function ($m) use ($user) { + $m->from(Base::settingFind('emailSetting', 'account') ?? Config::get("mail.mailers.smtp.username"), env('APP_NAME')); + $m->to($user->email); + $m->subject("绑定邮箱验证"); + }); + } catch (Exception $exception) { + // 一般是请求超时 + if (strpos($exception->getMessage(), "Timed Out") !== false) + throw new ApiException("language.TimedOut"); + else + throw new ApiException($exception->getMessage()); + } + } +} diff --git a/app/Models/WebSocketDialogUser.php b/app/Models/WebSocketDialogUser.php index 8b1952f14..28ff9dcd1 100644 --- a/app/Models/WebSocketDialogUser.php +++ b/app/Models/WebSocketDialogUser.php @@ -8,6 +8,7 @@ namespace App\Models; * @property int $id * @property int|null $dialog_id 对话ID * @property int|null $userid 会员ID + * @property int|null $top 是否置顶:0否,1是 * @property string|null $top_at 置顶时间 * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at @@ -17,6 +18,7 @@ namespace App\Models; * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereDialogId($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereTop($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereTopAt($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereUserid($value) diff --git a/database/migrations/2022_03_02_161123_add_is_email_verity_to_users.php b/database/migrations/2022_03_02_161123_add_is_email_verity_to_users.php new file mode 100644 index 000000000..adc698cfe --- /dev/null +++ b/database/migrations/2022_03_02_161123_add_is_email_verity_to_users.php @@ -0,0 +1,32 @@ +boolean('is_email_verity')->default(0)->nullable(false)->after('disable_at')->comment('邮箱是否已验证'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn("is_email_verity"); + }); + } +} diff --git a/database/migrations/2022_03_02_172504_create_user_email_verifications_table.php b/database/migrations/2022_03_02_172504_create_user_email_verifications_table.php new file mode 100644 index 000000000..ea2bfebe6 --- /dev/null +++ b/database/migrations/2022_03_02_172504_create_user_email_verifications_table.php @@ -0,0 +1,35 @@ +id(); + $table->integer('userid')->nullable()->default(0)->comment('用户id'); + $table->string('code')->nullable()->default('')->comment('验证参数'); + $table->string('email')->nullable()->default('')->comment('电子邮箱'); + $table->integer('status')->nullable()->default(0)->comment('0-未验证,1-已验证'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_email_verifications'); + } +} diff --git a/resources/assets/js/pages/email/validEmail.vue b/resources/assets/js/pages/email/validEmail.vue new file mode 100644 index 000000000..010047150 --- /dev/null +++ b/resources/assets/js/pages/email/validEmail.vue @@ -0,0 +1,84 @@ + + + + diff --git a/resources/assets/js/routes.js b/resources/assets/js/routes.js index 1793f258b..080853628 100755 --- a/resources/assets/js/routes.js +++ b/resources/assets/js/routes.js @@ -100,4 +100,10 @@ export default [ path: '*', component: () => import('./pages/404.vue') }, + { + name: 'validEmail', + path: '/valid/email', + meta: {title: '验证绑定邮箱'}, + component: () => import('./pages/email/validEmail.vue') + }, ] diff --git a/resources/views/email.blade.php b/resources/views/email.blade.php new file mode 100644 index 000000000..c96227e3b --- /dev/null +++ b/resources/views/email.blade.php @@ -0,0 +1,15 @@ + + + + + + + + +你好,你正在绑定 {{env('APP_NAME') }} 的邮箱,请于24小时之内点击该链接完成验证 : +
+ {{$url}} +
+ + +