Files
chatroom/app/Models/FishingEvent.php
lkddi 03ec3a9fbb 功能:钓鱼游戏后台管理系统
一、钓鱼全局开关
- 钓鱼纳入 GameConfig(game_key=fishing),游戏管理页可一键开关
- cast() 接口加开关校验,关闭时返回 403 友好提示
- GameConfigSeeder 新增 fishing 配置(含4个参数)

二、钓鱼事件数据库化
- 新建 fishing_events 表(emoji/name/message/exp/jjb/weight/is_active/sort)
- FishingEvent 模型含 rollOne() 加权随机方法
- FishingEventSeeder 填充7条初始事件(经验降低、金币提升)
- FishingController::randomFishResult() 改为读数据库事件

三、钓鱼参数迁移至 GameConfig
- fishing_cost/wait_min/wait_max/cooldown 改为 GameConfig::param() 读取
- 保留 Sysparam fallback 兼容旧数据

四、后台管理页面
- 新建 FishingEventController(CRUD + AJAX toggle)
- 新建 admin/fishing/index.blade.php(事件列表+概率显示+编辑弹窗)
- 侧边栏「游戏管理」下方新增「🎣 钓鱼事件」入口
- 游戏管理视图 gameParamLabels 新增钓鱼参数标签
2026-03-03 16:46:36 +08:00

90 lines
2.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 文件功能:钓鱼事件模型
*
* 对应 fishing_events 表,每条记录是一个钓鱼随机奖惩事件。
* 概率由 weight权重字段决定权重越大被选中概率越高。
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class FishingEvent extends Model
{
/**
* 可批量赋值字段
*
* @var array<int, string>
*/
protected $fillable = [
'emoji',
'name',
'message',
'exp',
'jjb',
'weight',
'is_active',
'sort',
];
/**
* 字段类型转换
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'exp' => 'integer',
'jjb' => 'integer',
'weight' => 'integer',
'is_active' => 'boolean',
'sort' => 'integer',
];
}
/**
* 作用域:只查询已启用的事件
*/
public function scopeActive(Builder $query): Builder
{
return $query->where('is_active', true);
}
/**
* 根据权重随机抽取一个激活的钓鱼事件
*
* 实现加权随机:权重越大,被选中概率越高。
* 若无任何激活事件,返回 null。
*/
public static function rollOne(): ?static
{
$events = static::active()->orderBy('sort')->get();
if ($events->isEmpty()) {
return null;
}
// 计算总权重后加权随机
$totalWeight = $events->sum('weight');
$roll = random_int(1, max($totalWeight, 1));
$cumulative = 0;
foreach ($events as $event) {
$cumulative += $event->weight;
if ($roll <= $cumulative) {
return $event;
}
}
// 兜底:返回最后一个
return $events->last();
}
}