GameConditionItemController.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. namespace App\Module\Game\AdminControllers;
  3. use App\Module\Game\Enums\CONDITION_OPERATOR;
  4. use App\Module\Game\Enums\CONDITION_TYPE;
  5. use App\Module\Game\Models\GameConditionGroup;
  6. use App\Module\Game\Repositorys\GameConditionItemRepository;
  7. use Dcat\Admin\Admin;
  8. use Dcat\Admin\Form;
  9. use Dcat\Admin\Grid;
  10. use Dcat\Admin\Show;
  11. use Dcat\Admin\Http\Controllers\AdminController;
  12. use Spatie\RouteAttributes\Attributes\Resource;
  13. /**
  14. * 条件项管理控制器
  15. */
  16. #[Resource('game-condition-items', names: 'dcat.admin.game-condition-items')]
  17. class GameConditionItemController extends AdminController
  18. {
  19. /**
  20. * 标题
  21. *
  22. * @return string
  23. */
  24. protected function title()
  25. {
  26. return '条件项管理';
  27. }
  28. /**
  29. * 创建表格
  30. *
  31. * @return Grid
  32. */
  33. protected function grid()
  34. {
  35. return Grid::make(new GameConditionItemRepository(), function (Grid $grid) {
  36. $grid->column('id', 'ID')->sortable();
  37. $grid->column('group_id', '条件组')->display(function ($groupId) {
  38. $group = GameConditionGroup::find($groupId);
  39. return $group ? "{$group->name} ({$group->code})" : "未知 ({$groupId})";
  40. });
  41. $grid->column('condition_type', '条件类型')->display(function ($type) {
  42. return CONDITION_TYPE::getName($type);
  43. });
  44. $grid->column('target_id', '目标ID')->display(function () {
  45. return $this->getTargetName();
  46. });
  47. $grid->column('operator', '比较运算符')->display(function ($operator) {
  48. return CONDITION_OPERATOR::getSymbol($operator);
  49. });
  50. $grid->column('value', '比较值');
  51. $grid->column('created_at', '创建时间');
  52. $grid->column('updated_at', '更新时间');
  53. $grid->filter(function (Grid\Filter $filter) {
  54. $filter->equal('id', 'ID');
  55. $filter->equal('group_id', '条件组')->select(
  56. GameConditionGroup::pluck('name', 'id')
  57. );
  58. $filter->equal('condition_type', '条件类型')->select(CONDITION_TYPE::getAll());
  59. $filter->equal('target_id', '目标ID');
  60. });
  61. });
  62. }
  63. /**
  64. * 创建详情页
  65. *
  66. * @param mixed $id
  67. * @return Show
  68. */
  69. protected function detail($id)
  70. {
  71. return Show::make($id, new GameConditionItemRepository(), function (Show $show) {
  72. $show->field('id', 'ID');
  73. $show->field('group_id', '条件组')->as(function ($groupId) {
  74. $group = GameConditionGroup::find($groupId);
  75. return $group ? "{$group->name} ({$group->code})" : "未知 ({$groupId})";
  76. });
  77. $show->field('condition_type', '条件类型')->as(function ($type) {
  78. return CONDITION_TYPE::getName($type);
  79. });
  80. $show->field('target_id', '目标ID')->as(function () {
  81. return $this->getTargetName();
  82. });
  83. $show->field('operator', '比较运算符')->as(function ($operator) {
  84. return CONDITION_OPERATOR::getName($operator) . ' (' . CONDITION_OPERATOR::getSymbol($operator) . ')';
  85. });
  86. $show->field('value', '比较值');
  87. $show->field('param1', '参数1');
  88. $show->field('param2', '参数2');
  89. $show->field('extra_data', '额外数据')->json();
  90. $show->field('created_at', '创建时间');
  91. $show->field('updated_at', '更新时间');
  92. });
  93. }
  94. /**
  95. * 创建表单
  96. *
  97. * @return Form
  98. */
  99. protected function form()
  100. {
  101. return Form::make(new GameConditionItemRepository(), function (Form $form) {
  102. $form->display('id', 'ID');
  103. $form->select('group_id', '条件组')
  104. ->options(GameConditionGroup::pluck('name', 'id'))
  105. ->required();
  106. // 简化表单,不使用when方法
  107. $form->select('condition_type', '条件类型')
  108. ->options(CONDITION_TYPE::getAll())
  109. ->required()->default(request()->input('condition_type'));
  110. // 根据条件类型显示不同的提示信息
  111. $form->select('target_id', '目标ID')
  112. ->options(function () {
  113. $conditionType = request()->input('condition_type', 0);
  114. // 使用统一的条件类型描述器获取目标选项
  115. return \App\Module\Game\Services\ConditionTypeDescriptor::getTargetOptions($conditionType);
  116. })
  117. ->help('根据条件类型不同,表示土地类型ID、宠物ID、物品ID、代币ID等。房屋等级条件可填0。');
  118. $form->select('operator', '比较运算符')
  119. ->options(CONDITION_OPERATOR::getAll())
  120. ->default(CONDITION_OPERATOR::GREATER_THAN_OR_EQUAL->value)
  121. ->required()
  122. ->help('选择比较运算符,如等于、大于等于等');
  123. $form->number('value', '比较值')
  124. ->default(0)
  125. ->required()
  126. ->help('设置比较的目标值');
  127. $form->number('param1', '参数1')
  128. ->default(0)
  129. ->help('根据条件类型不同含义,可选');
  130. $form->number('param2', '参数2')
  131. ->default(0)
  132. ->help('根据条件类型不同含义,可选');
  133. $form->textarea('extra_data', '额外数据')
  134. ->help('JSON格式,可存储特定条件类型的额外参数,可选');
  135. $form->display('created_at', '创建时间');
  136. $form->display('updated_at', '更新时间');
  137. // 添加简单的JavaScript代码,处理条件类型变化
  138. Admin::script(<<<JS
  139. $(function() {
  140. // 监听条件类型变化
  141. $('select[name="condition_type"]').on('change', function() {
  142. // 刷新页面,传递条件类型参数
  143. var url = new URL(window.location.href);
  144. url.searchParams.set('condition_type', $(this).val());
  145. window.location.href = url.toString();
  146. });
  147. });
  148. JS);
  149. });
  150. }
  151. }