model()->with(['consumeGroup.consumeItems', 'rewardGroup.rewardItems', 'conditionGroup.conditionItems']); $helper = new GridHelper($grid, $this); $helper->columnId(); $grid->column('name', '配方名称'); $grid->column('code', '配方编码'); $grid->column('description', '描述')->limit(50); // 消耗组列 - 可点击跳转 $grid->column('consumeGroup.name', '消耗组')->display(function ($name) { if (!$name || !$this->consume_group_id) { return '无消耗'; } return $name; })->link(function () { if (!$this->consume_group_id) { return ''; } return admin_url('game-consume-groups/' . $this->consume_group_id); }); // 奖励组列 - 可点击跳转 $grid->column('rewardGroup.name', '奖励组')->display(function ($name) { if (!$name || !$this->reward_group_id) { return '未配置'; } return $name; })->link(function () { if (!$this->reward_group_id) { return ''; } return admin_url('game-reward-groups/' . $this->reward_group_id); }); // 条件组列 - 可点击跳转 $grid->column('conditionGroup.name', '条件组')->display(function ($name) { if (!$name || !$this->condition_group_id) { return '无条件'; } return $name; })->link(function () { if (!$this->condition_group_id) { return ''; } return admin_url('game-condition-groups/' . $this->condition_group_id); }); // 消耗组详情列 $grid->column('consume_group_details', '消耗组详情')->display(function () { return $this->formatConsumeDetails(); })->width('200px'); // 奖励组详情列 $grid->column('reward_group_details', '奖励组详情')->display(function () { return $this->formatRewardDetails(); })->width('200px'); // 条件组详情列 $grid->column('condition_group_details', '条件组详情')->display(function () { return $this->formatConditionDetails(); })->width('200px'); // 展示属性列 $grid->column('display_attributes', '展示属性')->display(function ($value) { if (empty($value)) { return '-'; } if (is_string($value)) { $value = json_decode($value, true); } $html = '
'; foreach ((array)$value as $key => $val) { if (empty($val)) continue; $html .= "
{$key}: {$val}
"; } $html .= '
'; return $html; })->width('200px'); $grid->column('success_rate', '成功率')->display(function ($value) { return $value . '%'; }); $grid->column('cooldown_seconds', '冷却时间(秒)'); $grid->column('is_active', '是否激活')->switch(); $grid->column('created_at', '创建时间'); $grid->column('updated_at', '更新时间'); // 筛选 $grid->filter(function ($filter) { $helper = new FilterHelper($filter, $this); $helper->equal('id', 'ID'); $filter->like('name', '配方名称'); $filter->like('code', '配方编码'); $filter->equal('consume_group_id', '消耗组')->select( \App\Module\Game\Models\GameConsumeGroup::pluck('name', 'id') ); $filter->equal('reward_group_id', '奖励组')->select( \App\Module\Game\Models\GameRewardGroup::pluck('name', 'id') ); $filter->equal('condition_group_id', '条件组')->select( \App\Module\Game\Models\GameConditionGroup::pluck('name', 'id') ); $filter->equal('is_active', '是否激活')->radio([ 1 => '是', 0 => '否', ]); }); // 行操作 $grid->actions(function (Grid\Displayers\Actions $actions) { // 添加复制按钮 $actions->append(new DuplicateItemRecipeAction()); }); }); } /** * 详情页 * * @param mixed $id * @param Content $content * @return Content */ public function show($id, Content $content) { return $content ->header($this->title) ->description('详情') ->body($this->detail($id)); } /** * 详情页 * * @param mixed $id * @return Show */ protected function detail($id) { return Show::make($id, new ItemRecipeRepository(), function (Show $show) { $helper = new ShowHelper($show, $this); $helper->field('id', 'ID'); $helper->field('name', '配方名称'); $helper->field('code', '配方编码'); $helper->field('description', '配方描述'); // 展示属性 $show->field('display_attributes', '展示属性')->as(function ($value) { if (empty($value)) { return '无'; } if (is_string($value)) { $value = json_decode($value, true); } $html = '
'; $html .= ''; foreach ((array)$value as $key => $val) { if (empty($val)) continue; $html .= ""; } $html .= '
属性
{$key}{$val}
'; return $html; }); $show->field('success_rate', '成功率')->as(function ($value) { return $value . '%'; }); $helper->field('cooldown_seconds', '冷却时间(秒)'); $show->field('is_active', '是否激活')->as(function ($value) { return $value ? '是' : '否'; }); // 显示消耗组 $show->divider('消耗组'); $show->field('consumeGroup.name', '消耗组名称'); $show->field('consumeGroup.description', '消耗组描述'); // 显示奖励组 $show->divider('奖励组'); $show->field('rewardGroup.name', '奖励组名称'); $show->field('rewardGroup.description', '奖励组描述'); // 显示条件组 $show->divider('条件组'); $show->field('conditionGroup.name', '条件组名称'); $show->field('conditionGroup.description', '条件组描述'); $helper->field('created_at', '创建时间'); $helper->field('updated_at', '更新时间'); }); } /** * 创建页 * * @param Content $content * @return Content */ public function create(Content $content) { return $content ->header($this->title) ->description('创建') ->body($this->form()); } /** * 编辑页 * * @param mixed $id * @param Content $content * @return Content */ public function edit($id, Content $content) { return $content ->header($this->title) ->description('编辑') ->body($this->form()->edit($id)); } /** * 表单 * * @return Form */ protected function form() { return Form::make(new ItemRecipeRepository(), function (Form $form) { $helper = new \App\Module\GameItems\AdminControllers\Helper\FormHelper($form, $this); $helper->text('name', '配方名称')->required(); $helper->text('code', '配方编码') ->help('唯一的配方编码,用于程序识别'); $form->textarea('description', '配方描述') ->help('配方的详细描述'); // 消耗组选择 $form->select('consume_group_id', '消耗组') ->options(\App\Module\Game\Models\GameConsumeGroup::pluck('name', 'id')) ->help('选择合成时需要消耗的材料组'); // 奖励组选择 $form->select('reward_group_id', '奖励组') ->options(\App\Module\Game\Models\GameRewardGroup::pluck('name', 'id')) ->help('选择合成成功后获得的奖励组') ->required(); // 条件组选择 $form->select('condition_group_id', '条件组') ->options(\App\Module\Game\Models\GameConditionGroup::pluck('name', 'id')) ->help('选择解锁该配方需要满足的条件组(可选)'); // 展示属性 $helper->embedsCats('display_attributes', '展示属性'); $form->rate('success_rate', '成功率') ->default(100) ->help('合成成功的概率,100表示100%成功率'); $form->number('cooldown_seconds', '冷却时间(秒)') ->default(0) ->min(0) ->help('两次合成之间的冷却时间,0表示无冷却'); $form->number('sort_order', '排序权重') ->default(0) ->help('数值越大排序越靠前'); $form->switch('is_active', '是否激活') ->default(true) ->help('是否激活该配方'); }); } }