修复新人等级被降为零
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 在线状态。
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user