diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 4db4888..f40ec7b 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -105,6 +105,16 @@ class AuthController extends Controller return response()->json(['status' => 'error', 'message' => '该用户名已被系统禁止注册,请更换其他名称。'], 422); } + // --- 提取邀请人 Cookie --- + $inviterIdCookie = $request->cookie('inviter_id'); + $inviterId = null; + if ($inviterIdCookie && is_numeric($inviterIdCookie)) { + // 简单校验邀请人是否存在,防止脏数据 + if (User::where('id', $inviterIdCookie)->exists()) { + $inviterId = (int) $inviterIdCookie; + } + } + $newUser = User::create([ 'username' => $username, 'password' => Hash::make($password), @@ -113,10 +123,16 @@ class AuthController extends Controller 'user_level' => 1, // 默认普通用户等级 'sex' => $sex, 'usersf' => '1.gif', // 默认头像 + 'inviter_id' => $inviterId, // 记录邀请人 ]); $this->performLogin($newUser, $ip); + // 如果是通过邀请注册的,响应成功后建议清除 Cookie,防止污染后续注册 + if ($inviterId) { + \Illuminate\Support\Facades\Cookie::queue(\Illuminate\Support\Facades\Cookie::forget('inviter_id')); + } + return response()->json(['status' => 'success', 'message' => '注册并登录成功!']); } diff --git a/app/Http/Controllers/InviteController.php b/app/Http/Controllers/InviteController.php new file mode 100644 index 0000000..a22ab4e --- /dev/null +++ b/app/Http/Controllers/InviteController.php @@ -0,0 +1,46 @@ +id, 10080); + } + + // 重定向回聊天室首页进行注册/登录 + return redirect()->route('home'); + } + + /** + * 独立展示邀请全站排行榜页面 + */ + public function leaderboard() + { + // 邀请达人榜 (Top 50) + $topInviters = User::withCount('invitees') + ->with(['activePosition.position.department']) + ->having('invitees_count', '>', 0) + ->orderByDesc('invitees_count') + ->limit(50) + ->get(); + + return view('invite.leaderboard', compact('topInviters')); + } +} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index b622383..3bfe1d7 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -66,6 +66,12 @@ class UserController extends Controller $data['meili'] = $targetUser->meili ?? 0; } + // 仅当自己看自己时,附加邀请相关信息,用于展示专属邀请链接 + if ($operator && $operator->id === $targetUser->id) { + $data['id'] = $targetUser->id; + $data['invitees_count'] = $targetUser->invitees()->count(); + } + // 职务履历(所有任职记录,按任命时间倒序;positions() 关系已含 with) $data['position_history'] = $targetUser->positions ->map(fn ($up) => [ diff --git a/app/Models/User.php b/app/Models/User.php index fb9f4ce..d17f6df 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -36,6 +36,7 @@ class User extends Authenticatable 'sex', 'sign', 'user_level', + 'inviter_id', 'room_id', 'first_ip', 'previous_ip', @@ -183,4 +184,20 @@ class User extends Authenticatable { return $this->activePosition()->exists(); } + + /** + * 关联:邀请当前用户的人 + */ + public function inviter(): BelongsTo + { + return $this->belongsTo(self::class, 'inviter_id'); + } + + /** + * 关联:当前用户邀请的所有人 + */ + public function invitees(): HasMany + { + return $this->hasMany(self::class, 'inviter_id'); + } } diff --git a/database/migrations/2026_03_12_092039_add_inviter_id_to_users_table.php b/database/migrations/2026_03_12_092039_add_inviter_id_to_users_table.php new file mode 100644 index 0000000..5560bdc --- /dev/null +++ b/database/migrations/2026_03_12_092039_add_inviter_id_to_users_table.php @@ -0,0 +1,30 @@ +unsignedBigInteger('inviter_id')->nullable()->after('id')->comment('邀请人ID'); + $table->foreign('inviter_id')->references('id')->on('users')->nullOnDelete(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropForeign(['inviter_id']); + $table->dropColumn('inviter_id'); + }); + } +}; diff --git a/resources/views/chat/partials/user-actions.blade.php b/resources/views/chat/partials/user-actions.blade.php index a452fe9..db359ae 100644 --- a/resources/views/chat/partials/user-actions.blade.php +++ b/resources/views/chat/partials/user-actions.blade.php @@ -648,6 +648,30 @@ + {{-- 邀请贡献卡片 (仅查看自己资料时显示) --}} +
+ {{-- 管理员可见区域 (IP 与 归属地) --}}