From 718d6901ac48c1c0cbc0b3e751a36e40088571b9 Mon Sep 17 00:00:00 2001 From: lkddi Date: Thu, 26 Feb 2026 23:49:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=BF=83=E8=B7=B3?= =?UTF-8?q?=E5=AD=98=E7=82=B9=E7=BB=8F=E9=AA=8C=E5=A2=9E=E5=8A=A0=E5=8A=A0?= =?UTF-8?q?=E5=85=A530=E7=A7=92=E5=86=B7=E5=8D=B4=E9=97=B4=E9=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 用 Redis setex 设置30秒冷却,防止频繁点击存点刷经验 - 冷却期内点击存点仍正常保存数据,但不增加经验 --- app/Http/Controllers/ChatController.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/ChatController.php b/app/Http/Controllers/ChatController.php index ff7597c..d0f3cee 100644 --- a/app/Http/Controllers/ChatController.php +++ b/app/Http/Controllers/ChatController.php @@ -149,10 +149,18 @@ class ChatController extends Controller return response()->json(['status' => 'error'], 401); } - // 1. 每次心跳增加经验(可在 sysparam 后台配置),VIP 倍率加成 - $expGain = (int) Sysparam::getValue('exp_per_heartbeat', '1'); - $expMultiplier = $this->vipService->getExpMultiplier($user); - $user->exp_num += (int) round($expGain * $expMultiplier); + // 1. 心跳经验:通过 Redis 限制最小间隔(默认30秒),防止频繁点击刷经验 + $expCooldownKey = "heartbeat_exp:{$user->id}"; + $canGainExp = ! Redis::exists($expCooldownKey); + + if ($canGainExp) { + $expGain = (int) Sysparam::getValue('exp_per_heartbeat', '1'); + $expMultiplier = $this->vipService->getExpMultiplier($user); + $user->exp_num += (int) round($expGain * $expMultiplier); + + // 设置冷却(30秒内不再给经验) + Redis::setex($expCooldownKey, 30, 1); + } // 2. 使用 sysparam 表中可配置的等级-经验阈值计算等级 // 管理员(superlevel 及以上)不参与自动升降级,等级由后台手动设置