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 与 归属地) --}}
diff --git a/resources/views/invite/leaderboard.blade.php b/resources/views/invite/leaderboard.blade.php new file mode 100644 index 0000000..eadaf16 --- /dev/null +++ b/resources/views/invite/leaderboard.blade.php @@ -0,0 +1,139 @@ +{{-- + 文件功能:邀请排行达人榜 + 展示全站前 50 名邀请人数最多的用户 +--}} +@extends('layouts.app') + +@section('title', '新星邀请达人榜 - 飘落流星') + +@section('nav-icon', '🏆') +@section('nav-title', '邀请风云排行榜') + +@section('content') +
+ + {{-- 顶部说明区域 --}} +
+
+

+ 新星崛起·邀请达人榜 +

+

+ 欢迎来到漂落流星星光榜单!在房间里打开您的个人名片,复制专属推广链接去邀请新朋友吧! + 每成功邀请一位并完成注册,即可积累一次战绩,赶快向着全站 Top 50 进发! +

+
+ +
+ + {{-- 榜单主体区域 --}} +
+ @if ($topInviters->isNotEmpty()) + {{-- 表头 --}} +
+
排行
+
头像
+
用户昵称
+
在职职务
+
+ 邀请记录
+
+ + {{-- 列表项 --}} +
+ @foreach ($topInviters as $index => $inviter) +
+ + {{-- 移动端显示的收徒数 (紧凑模式) --}} +
+ {{ $inviter->invitees_count }} + +
+ + {{-- 1. 排名徽标 --}} +
+ @if ($index === 0) +
+ 1
+ @elseif ($index === 1) +
+ 2
+ @elseif ($index === 2) +
+ 3
+ @elseif ($index < 10) +
+ {{ $index + 1 }}
+ @else +
+ {{ $index + 1 }}
+ @endif +
+ + {{-- 2. 头像 --}} +
+
+ +
+
+ + {{-- 3. 用户名 --}} +
+ + {{ $inviter->username }} + +
+ + {{-- 4. 职务徽章 --}} +
+ @if ($inviter->activePosition) +
+ {{ $inviter->activePosition->position->icon }} + {{ $inviter->activePosition->position->name }} +
+ @else + + @endif +
+ + {{-- 5. 收徒数 (PC 端) --}} + +
+ @endforeach +
+ @else + {{-- 空白提示区 --}} +
+
🚀
+

全站排行榜暂无数据

+

+ 目前还没有达人拉取到足够的新用户入驻。成为第一个霸榜的人吧! +

+ 提示: 在聊天室左上角或右侧的在线列表中点击您自己的名字,即可获取并复制专属推广链接。 +

+
+ @endif +
+
+@endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 5aa2fd8..ff16dfa 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -73,6 +73,10 @@ class="text-indigo-200 hover:text-white font-bold flex items-center transition hidden sm:flex"> 大厅 +