修复新人等级被降为零

This commit is contained in:
pllx
2026-04-27 14:23:34 +08:00
parent 277cb617da
commit 3c749969b4
2 changed files with 38 additions and 1 deletions
+5 -1
View File
@@ -15,6 +15,9 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
/**
* 类功能:读取和计算系统参数,提供等级经验阈值等全局配置能力。
*/
class Sysparam extends Model
{
/** @var string 表名 */
@@ -74,7 +77,8 @@ class Sysparam extends Model
// 不超过最大等级
$maxLevel = (int) static::getValue('maxlevel', '99');
return min($level, $maxLevel);
// 聊天室普通用户最低等级为 1,避免低经验新人被自动存点降成 0 后无法进入默认房间。
return max(1, min($level, $maxLevel));
}
/**
+33
View File
@@ -801,6 +801,39 @@ class ChatControllerTest extends TestCase
$this->assertGreaterThanOrEqual(0, $user->exp_num); // Might be 1 depending on sysparam
}
/**
* 测试低经验新人心跳后不会被降到 0 级,刷新后仍可进入默认房间。
*/
public function test_low_exp_newbie_keeps_minimum_level_after_heartbeat(): void
{
Sysparam::updateOrCreate(['alias' => 'exp_per_heartbeat'], ['body' => '0']);
Sysparam::updateOrCreate(['alias' => 'jjb_per_heartbeat'], ['body' => '0']);
Sysparam::updateOrCreate(['alias' => 'auto_event_chance'], ['body' => '0']);
Cache::flush();
$room = Room::create([
'room_name' => 'newhb',
'permit_level' => 1,
'door_open' => true,
]);
$user = User::factory()->create([
'user_level' => 1,
'exp_num' => 0,
'has_received_new_gift' => true,
]);
$this->actingAs($user)->get(route('chat.room', $room->id))->assertOk();
$heartbeatResponse = $this->actingAs($user)->postJson(route('chat.heartbeat', $room->id));
$heartbeatResponse->assertOk();
$heartbeatResponse->assertJsonPath('data.user_level', 1);
$this->assertSame(1, $user->fresh()->user_level);
Redis::del("room:{$room->id}:alive:{$user->username}");
$this->actingAs($user)->get(route('chat.room', $room->id))->assertOk();
}
/**
* 测试显式退房会清理 Redis 在线状态。
*/