功能:VIP 赞助会员系统

- 新建 vip_levels 表(名称、图标、颜色、经验/金币倍率、专属进入/离开模板)
- 默认4个等级种子:白银🥈(×1.5)、黄金🥇(×2.0)、钻石💎(×3.0)、至尊👑(×5.0)
- 后台 VIP 等级 CRUD 管理(新增/编辑/删除,配置模板和倍率)
- 后台用户编辑弹窗支持设置 VIP 等级和到期时间
- ChatController 心跳经验按 VIP 倍率加成
- FishingController 正向奖励按 VIP 倍率加成(负面惩罚不变)
- 在线名单显示 VIP 图标和管理员🛡️标识
- VIP 用户进入/离开使用专属颜色和标题
- 后台侧栏新增「👑 VIP 会员等级」入口
This commit is contained in:
2026-02-26 21:30:07 +08:00
parent ea06328885
commit fd3214eaff
22 changed files with 2293 additions and 19 deletions
+19 -10
View File
@@ -21,6 +21,7 @@ use App\Models\Room;
use App\Models\Sysparam;
use App\Services\ChatStateService;
use App\Services\MessageFilterService;
use App\Services\VipService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@@ -32,6 +33,7 @@ class ChatController extends Controller
public function __construct(
private readonly ChatStateService $chatState,
private readonly MessageFilterService $filter,
private readonly VipService $vipService,
) {}
/**
@@ -48,19 +50,21 @@ class ChatController extends Controller
// 房间人气 +1(每次访问递增,复刻原版人气计数)
$room->increment('visit_num');
// 1. 将当前用户加入到 Redis 房间在线列表
$this->chatState->userJoin($id, $user->username, [
// 1. 将当前用户加入到 Redis 房间在线列表(包含 VIP 和管理员信息)
$superLevel = (int) Sysparam::getValue('superlevel', '100');
$userData = [
'level' => $user->user_level,
'sex' => $user->sex,
'headface' => $user->headface,
]);
'vip_icon' => $user->vipIcon(),
'vip_name' => $user->vipName(),
'vip_color' => $user->isVip() ? ($user->vipLevel?->color ?? '') : '',
'is_admin' => $user->user_level >= $superLevel,
];
$this->chatState->userJoin($id, $user->username, $userData);
// 2. 广播 UserJoined 事件,通知房间内的其他人
broadcast(new UserJoined($id, $user->username, [
'level' => $user->user_level,
'sex' => $user->sex,
'headface' => $user->headface,
]))->toOthers();
broadcast(new UserJoined($id, $user->username, $userData))->toOthers();
// 3. 获取历史消息用于初次渲染
// TODO: 可在前端通过请求另外的接口拉取历史记录,或者直接在这里 attach
@@ -145,9 +149,10 @@ class ChatController extends Controller
return response()->json(['status' => 'error'], 401);
}
// 1. 每次心跳增加经验(可在 sysparam 后台配置)
// 1. 每次心跳增加经验(可在 sysparam 后台配置)VIP 倍率加成
$expGain = (int) Sysparam::getValue('exp_per_heartbeat', '1');
$user->exp_num += $expGain;
$expMultiplier = $this->vipService->getExpMultiplier($user);
$user->exp_num += (int) round($expGain * $expMultiplier);
// 2. 使用 sysparam 表中可配置的等级-经验阈值计算等级
// 管理员(superlevel 及以上)不参与自动升降级,等级由后台手动设置
@@ -171,6 +176,10 @@ class ChatController extends Controller
'level' => $user->user_level,
'sex' => $user->sex,
'headface' => $user->headface,
'vip_icon' => $user->vipIcon(),
'vip_name' => $user->vipName(),
'vip_color' => $user->isVip() ? ($user->vipLevel?->color ?? '') : '',
'is_admin' => $user->user_level >= $superLevel,
]);
// 4. 如果突破境界,向全房系统喊话广播!