CategoryController.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. namespace App\Module\GameItems\AdminControllers;
  3. use App\Module\GameItems\Repositorys\ItemCategoryRepository;
  4. use App\Module\GameItems\Models\ItemCategory;
  5. use Dcat\Admin\Form;
  6. use Dcat\Admin\Grid;
  7. use Dcat\Admin\Show;
  8. use Dcat\Admin\Layout\Row;
  9. use Dcat\Admin\Tree;
  10. use Dcat\Admin\Layout\Content;
  11. use Spatie\RouteAttributes\Attributes\Resource;
  12. use UCore\DcatAdmin\AdminController;
  13. use App\Module\GameItems\AdminControllers\Helper\FilterHelper;
  14. use App\Module\GameItems\AdminControllers\Helper\FormHelper;
  15. use App\Module\GameItems\AdminControllers\Helper\GridHelper;
  16. use App\Module\GameItems\AdminControllers\Helper\ShowHelper;
  17. /**
  18. * 物品分类管理控制器
  19. *
  20. * @package App\Module\GameItems\AdminControllers
  21. */
  22. #[Resource('game-items-categories', names: 'dcat.admin.game-items-categories')]
  23. class CategoryController extends AdminController
  24. {
  25. /**
  26. * 标题
  27. *
  28. * @var string
  29. */
  30. protected $title = '物品分类管理';
  31. /**
  32. * 首页
  33. *
  34. * @param Content $content
  35. * @return Content
  36. */
  37. public function index(Content $content)
  38. {
  39. return $content
  40. ->header($this->title)
  41. ->description('分类列表')
  42. ->body(function (Row $row) {
  43. $tree = new Tree(new ItemCategoryRepository());
  44. $tree->branch(function ($branch) {
  45. $icon = $branch['icon'] ? "<img src='{$branch['icon']}' width='30' height='30'>" : '';
  46. return "{$icon} {$branch['name']} ({$branch['code']})";
  47. });
  48. $row->column(12, $tree);
  49. });
  50. }
  51. /**
  52. * 列表页
  53. *
  54. * @return Grid
  55. */
  56. protected function grid()
  57. {
  58. return Grid::make(new ItemCategoryRepository(), function (Grid $grid) {
  59. $helper = new GridHelper($grid, $this);
  60. $helper->columnId();
  61. $grid->column('name', '名称');
  62. $grid->column('code', '编码');
  63. $grid->column('icon', '图标')->image('', 50, 50);
  64. $grid->column('sort', '排序')->sortable();
  65. $grid->column('parent.name', '父分类');
  66. $grid->column('created_at', '创建时间');
  67. $grid->column('updated_at', '更新时间');
  68. // 筛选
  69. $grid->filter(function ($filter) {
  70. $helper = new FilterHelper($filter, $this);
  71. $helper->equal('id', 'ID');
  72. $filter->like('name', '名称');
  73. $filter->like('code', '编码');
  74. $filter->equal('parent_id', '父分类')->select(
  75. (new ItemCategoryRepository())->pluck('name', 'id')
  76. );
  77. });
  78. });
  79. return $grid;
  80. }
  81. /**
  82. * 详情页
  83. *
  84. * @param mixed $id
  85. * @return Show
  86. */
  87. protected function detail($id)
  88. {
  89. return Show::make($id, new ItemCategoryRepository(), function (Show $show) {
  90. $helper = new ShowHelper($show, $this);
  91. $helper->field('id', 'ID');
  92. $helper->field('name', '名称');
  93. $helper->field('code', '编码');
  94. $show->field('icon', '图标')->image();
  95. $helper->field('sort', '排序');
  96. $show->field('parent.name', '父分类');
  97. $helper->field('created_at', '创建时间');
  98. $helper->field('updated_at', '更新时间');
  99. // 显示子分类
  100. $show->children('子分类', function ($children) {
  101. $children->resource('/admin/game-items-categories');
  102. $children->id('ID');
  103. $children->name('名称');
  104. $children->code('编码');
  105. $children->icon('图标')->image('', 50, 50);
  106. $children->sort('排序');
  107. });
  108. // 显示分类下的物品
  109. $show->items('物品', function ($items) {
  110. $items->resource('/admin/game-items');
  111. $items->id('ID');
  112. $items->name('名称');
  113. $items->icon('图标')->image('', 50, 50);
  114. $items->type('类型');
  115. });
  116. });
  117. }
  118. /**
  119. * 表单
  120. *
  121. * @return Form
  122. */
  123. protected function form()
  124. {
  125. return Form::make(new ItemCategoryRepository(), function (Form $form) {
  126. $helper = new \App\Module\GameItems\AdminControllers\Helper\FormHelper($form, $this);
  127. $helper->text('name')->required();
  128. $helper->text('code')->required()->help('用于系统识别的唯一编码');
  129. $form->image('icon', '图标')
  130. ->uniqueName()
  131. ->autoUpload();
  132. $helper->number('sort')
  133. ->default(0)
  134. ->help('数字越小越靠前');
  135. // 父分类选择,排除自己及其子分类
  136. $form->select('parent_id', '父分类')
  137. ->options(function () use ($form) {
  138. $categories = (new ItemCategory())->all();
  139. $options = [ 0 => '顶级' ];
  140. foreach ($categories as $category) {
  141. $options[$category->id] = $category->name;
  142. }
  143. return $options;
  144. })
  145. ->default(0);
  146. });
  147. }
  148. /**
  149. * 获取所有子分类ID
  150. *
  151. * @param int $categoryId
  152. * @return array
  153. */
  154. protected function getChildrenIds(int $categoryId): array
  155. {
  156. $ids = [];
  157. $children = (new ItemCategory())->where('parent_id', $categoryId)->get();
  158. foreach ($children as $child) {
  159. $ids[] = $child->id;
  160. $ids = array_merge($ids, $this->getChildrenIds($child->id));
  161. }
  162. return $ids;
  163. }
  164. }