diff --git a/app/Console/Commands/ResetPassword.php b/app/Console/Commands/ResetPassword.php index 86e14a5..3e131f2 100644 --- a/app/Console/Commands/ResetPassword.php +++ b/app/Console/Commands/ResetPassword.php @@ -43,7 +43,7 @@ class ResetPassword extends Command public function handle() { $password = $this->argument('password') ; - $user = User::where('email', $this->argument('email'))->first(); + $user = User::byEmail($this->argument('email'))->first(); if (!$user) abort(500, '邮箱不存在'); $password = $password ?? Helper::guid(false); $user->password = password_hash($password, PASSWORD_DEFAULT); diff --git a/app/Http/Controllers/V1/Passport/CommController.php b/app/Http/Controllers/V1/Passport/CommController.php index 65365d8..663badf 100644 --- a/app/Http/Controllers/V1/Passport/CommController.php +++ b/app/Http/Controllers/V1/Passport/CommController.php @@ -29,7 +29,7 @@ class CommController extends Controller // 检查白名单后缀限制 if ((int) admin_setting('email_whitelist_enable', 0)) { - $isRegisteredEmail = User::where('email', $email)->exists(); + $isRegisteredEmail = User::byEmail($email)->exists(); if (!$isRegisteredEmail) { $allowedSuffixes = Helper::getEmailSuffix(); $emailSuffix = substr(strrchr($email, '@'), 1); diff --git a/app/Http/Controllers/V2/Admin/OrderController.php b/app/Http/Controllers/V2/Admin/OrderController.php index 1d3ad3d..c06c7c8 100644 --- a/app/Http/Controllers/V2/Admin/OrderController.php +++ b/app/Http/Controllers/V2/Admin/OrderController.php @@ -199,7 +199,7 @@ class OrderController extends Controller public function assign(OrderAssign $request) { $plan = Plan::find($request->input('plan_id')); - $user = User::where('email', $request->input('email'))->first(); + $user = User::byEmail($request->input('email'))->first(); if (!$user) { return $this->fail([400202, '该用户不存在']); diff --git a/app/Http/Controllers/V2/Admin/UserController.php b/app/Http/Controllers/V2/Admin/UserController.php index 68cc05b..45bd9b7 100644 --- a/app/Http/Controllers/V2/Admin/UserController.php +++ b/app/Http/Controllers/V2/Admin/UserController.php @@ -220,7 +220,7 @@ class UserController extends Controller return $this->fail([400202, '用户不存在']); } if (isset($params['email'])) { - if (User::where('email', $params['email'])->first() && $user->email !== $params['email']) { + if (User::byEmail($params['email'])->first() && $user->email !== $params['email']) { return $this->fail([400201, '邮箱已被使用']); } } @@ -240,7 +240,7 @@ class UserController extends Controller $params['group_id'] = $plan->group_id; } // 处理邀请用户 - if ($request->input('invite_user_email') && $inviteUser = User::where('email', $request->input('invite_user_email'))->first()) { + if ($request->input('invite_user_email') && $inviteUser = User::byEmail($request->input('invite_user_email'))->first()) { $params['invite_user_id'] = $inviteUser->id; } else { $params['invite_user_id'] = null; @@ -365,7 +365,7 @@ class UserController extends Controller if ($request->input('email_prefix')) { $email = $request->input('email_prefix') . '@' . $request->input('email_suffix'); - if (User::where('email', $email)->exists()) { + if (User::byEmail($email)->exists()) { return $this->fail([400201, '邮箱已存在于系统中']); } diff --git a/app/Models/User.php b/app/Models/User.php index 4d6aad2..a826e4a 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -3,6 +3,8 @@ namespace App\Models; use App\Utils\Helper; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Foundation\Auth\User as Authenticatable; use Laravel\Sanctum\HasApiTokens; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -81,6 +83,20 @@ class User extends Authenticatable public const COMMISSION_TYPE_SYSTEM = 0; public const COMMISSION_TYPE_PERIOD = 1; public const COMMISSION_TYPE_ONETIME = 2; + protected function email(): Attribute + { + return Attribute::make( + set: fn (string $value) => strtolower(trim($value)), + ); + } + + /** + * 按邮箱查询(大小写不敏感,兼容所有数据库) + */ + public function scopeByEmail(Builder $query, string $email): Builder + { + return $query->where('email', strtolower(trim($email))); + } // 获取邀请人信息 public function invite_user(): BelongsTo diff --git a/app/Services/Auth/LoginService.php b/app/Services/Auth/LoginService.php index bd8a6cd..363e82b 100644 --- a/app/Services/Auth/LoginService.php +++ b/app/Services/Auth/LoginService.php @@ -36,7 +36,7 @@ class LoginService } // 查找用户 - $user = User::where('email', $email)->first(); + $user = User::byEmail($email)->first(); if (!$user) { return [false, [400, __('Incorrect email or password')]]; } @@ -99,7 +99,7 @@ class LoginService } // 查找用户 - $user = User::where('email', $email)->first(); + $user = User::byEmail($email)->first(); if (!$user) { return [false, [400, __('This email is not registered in the system')]]; } diff --git a/app/Services/Auth/MailLinkService.php b/app/Services/Auth/MailLinkService.php index e2351e0..259ced7 100644 --- a/app/Services/Auth/MailLinkService.php +++ b/app/Services/Auth/MailLinkService.php @@ -27,7 +27,7 @@ class MailLinkService return [false, [429, __('Sending frequently, please try again later')]]; } - $user = User::where('email', $email)->first(); + $user = User::byEmail($email)->first(); if (!$user) { return [true, true]; // 成功但用户不存在,保护用户隐私 } diff --git a/app/Services/Auth/RegisterService.php b/app/Services/Auth/RegisterService.php index a87b56a..78d207e 100644 --- a/app/Services/Auth/RegisterService.php +++ b/app/Services/Auth/RegisterService.php @@ -91,8 +91,7 @@ class RegisterService } // 检查邮箱是否存在 - $email = $request->input('email'); - $exist = User::where('email', $email)->first(); + $exist = User::byEmail($request->input('email'))->first(); if ($exist) { return [false, [400201, __('Email already exists')]]; } diff --git a/database/migrations/2026_03_28_050000_lowercase_existing_emails.php b/database/migrations/2026_03_28_050000_lowercase_existing_emails.php new file mode 100644 index 0000000..07eee3d --- /dev/null +++ b/database/migrations/2026_03_28_050000_lowercase_existing_emails.php @@ -0,0 +1,38 @@ +whereNotNull('email') + ->whereRaw('email != LOWER(email)') + ->count(); + + if ($count > 0) { + Log::info("Converting {$count} email(s) to lowercase"); + DB::table('v2_user') + ->whereNotNull('email') + ->whereRaw('email != LOWER(email)') + ->update(['email' => DB::raw('LOWER(email)')]); + + Log::info("Email lowercase conversion completed"); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // 无法恢复原始大小写 + } +};