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 @@
+
+ {{$L('您的邮箱已通过验证')}} {{$L('今后您可以通过此邮箱重置您的账号密码')}}