PermissionController.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <?php
  2. namespace App\Admin\Controllers\Admin;
  3. use App\Models\Admin\AdminMenu;
  4. use App\Models\Admin\AdminPermission;
  5. use App\Models\Subsite;
  6. use Encore\Admin\Controllers\HasResourceActions;
  7. use Encore\Admin\Facades\Admin;
  8. use Encore\Admin\Form;
  9. use Encore\Admin\Grid;
  10. use Encore\Admin\Layout\Content;
  11. use Encore\Admin\Layout\Row;
  12. use Encore\Admin\Show;
  13. use Encore\Admin\Tree;
  14. use Illuminate\Routing\Controller;
  15. use Illuminate\Support\Str;
  16. class PermissionController extends Controller
  17. {
  18. use HasResourceActions;
  19. /**
  20. * Index interface.
  21. *
  22. * @param Content $content
  23. *
  24. * @return Content
  25. */
  26. public function index(Content $content)
  27. {
  28. // return $content
  29. // ->header(trans('admin.menu'))
  30. // ->description(trans('admin.list'))
  31. // ->row(function (Row $row) {
  32. // $row->column(6, $this->treeView()->render());
  33. //
  34. // });
  35. if (request()->has('_expand_')) {
  36. $permission=AdminPermission::find(request()->get('_expand_'));
  37. if (!$permission || $permission->children->isEmpty()) {
  38. $data['has_children'] =0;
  39. return response()->json($data);
  40. }
  41. $data['has_children'] =1;
  42. $data['html']=view(
  43. 'admin.grid.permission_expand',
  44. [
  45. 'parent_group'=>implode(" ", explode(",", request()->get('parent_group'))),
  46. 'key'=>request()->get('_expand_'),
  47. 'list'=>$permission->children,
  48. 'level'=>request()->get('level')+1,
  49. 'menu_array'=>AdminMenu::menuArr()
  50. ]
  51. )->render();
  52. return response()->json($data);
  53. }
  54. return $content
  55. ->header(trans('admin.permissions'))
  56. ->description(trans('admin.list'))
  57. ->body($this->grid()->render());
  58. }
  59. /**
  60. * @return \Encore\Admin\Tree
  61. */
  62. protected function treeView()
  63. {
  64. return AdminPermission::tree(function (Tree $tree) {
  65. $tree->disableCreate();
  66. $menu_array=AdminMenu::menuArr();
  67. $tree->branch(function ($branch) use ($menu_array) {
  68. $payload = "&nbsp;<strong>{$branch['name']}</strong>------{$branch['slug']}";
  69. if (isset($menu_array[$branch['menu_id']])) {
  70. $payload.="------<code>{$menu_array[$branch['menu_id']]}</code>";
  71. }
  72. return $payload;
  73. });
  74. });
  75. }
  76. /**
  77. * Show interface.
  78. *
  79. * @param mixed $id
  80. * @param Content $content
  81. *
  82. * @return Content
  83. */
  84. public function show($id, Content $content)
  85. {
  86. return $content
  87. ->header(trans('admin.permissions'))
  88. ->description(trans('admin.detail'))
  89. ->body($this->detail($id));
  90. }
  91. /**
  92. * Edit interface.
  93. *
  94. * @param $id
  95. * @param Content $content
  96. *
  97. * @return Content
  98. */
  99. public function edit($id, Content $content)
  100. {
  101. return $content
  102. ->header(trans('admin.permissions'))
  103. ->description(trans('admin.edit'))
  104. ->body($this->form()->edit($id));
  105. }
  106. /**
  107. * Create interface.
  108. *
  109. * @param Content $content
  110. *
  111. * @return Content
  112. */
  113. public function create(Content $content)
  114. {
  115. return $content
  116. ->header(trans('admin.permissions'))
  117. ->description(trans('admin.create'))
  118. ->body($this->form());
  119. }
  120. /**
  121. * Make a grid builder.
  122. *
  123. * @return Grid
  124. */
  125. protected function grid()
  126. {
  127. $grid = new Grid(new AdminPermission());
  128. $grid->model()->where('parent_id', 0);
  129. $grid->model()->orderBy('listorder');
  130. if (Admin::user()->isAdministrator()) {
  131. $grid->disableCreateButton(false);
  132. }
  133. $grid->actions(function (Grid\Displayers\Actions $actions) {
  134. if (Admin::user()->isAdministrator()) {
  135. $actions->disableDelete(false);
  136. $actions->disableEdit(false);
  137. }
  138. });
  139. // $grid->tools(function (Grid\Tools $tools) {
  140. // $tools->batch(function (Grid\Tools\BatchActions $batch) {
  141. // if (Admin::user()->isAdministrator()) {
  142. // $batch->disableDelete(false);
  143. // }
  144. // });
  145. // });
  146. // 添加默认查询条件
  147. $grid->model()->when(get_subsite_id()>0, function ($query) {
  148. $query->whereIn('subsite_id', [-1, get_subsite_id()]);
  149. })->where('parent_id', 0);
  150. $grid->model()->orderBy('listorder');
  151. $grid->filter(function (Grid\Filter $filter) {
  152. // 在这里添加字段过滤器
  153. $filter->like('name', '名称');
  154. $filter->like('slug', '标识');
  155. });
  156. $grid->id('ID')->sortable()->fixedWidth(80);
  157. $grid->name(trans('admin.name'))->fixedWidth(250)->ajaxExpand();
  158. $grid->slug(trans('admin.slug'))->fixedWidth(330)->label();
  159. $grid->menu("菜单")->display(function ($menu) {
  160. if (isset($menu)) {
  161. return "<div style='margin-bottom: 5px;'><code>{$menu['title']}</code></div>";
  162. }
  163. return "";
  164. })->fixedWidth(250);
  165. if (get_subsite_open()) {
  166. $subsite_array = Subsite::pluck('sitename', 'id')->toArray();
  167. $subsite_array=[0 => '总站'] + $subsite_array;
  168. $grid->subsite_id("权限所属")->display(function ($subsite_id) use ($subsite_array) {
  169. if ($subsite_id == -1) {
  170. return "通用权限";
  171. }
  172. if (isset($subsite_array[$subsite_id])) {
  173. return $subsite_array[$subsite_id];
  174. }
  175. return "";
  176. })->fixedWidth(80)->label('primary');
  177. }
  178. return $grid;
  179. }
  180. /**
  181. * Make a show builder.
  182. *
  183. * @param mixed $id
  184. *
  185. * @return Show
  186. */
  187. protected function detail($id)
  188. {
  189. $menu_array=AdminMenu::menuArr();
  190. $show = new Show(AdminPermission::findOrFail($id));
  191. $show->id('ID');
  192. $show->name(trans('admin.name'));
  193. $show->slug(trans('admin.slug'));
  194. if (get_subsite_open()) {
  195. $option_array=[-1 => '通用权限'];
  196. $option_array=$option_array + array_column(get_all_subsite(), 'sitename', 'id');
  197. $show->subsite_id("权限所属")->as(function ($subsite_id) use ($option_array) {
  198. return $option_array[$subsite_id];
  199. })->label('primary');
  200. }
  201. $show->http_path(trans('admin.route'))->unescape()->as(function ($path) {
  202. return collect(explode("\r\n", $path))->map(function ($path) {
  203. if (!$path) {
  204. return "";
  205. }
  206. $method = $this->http_method ?: ['ANY'];
  207. if (Str::contains($path, ':')) {
  208. list($method, $path) = explode(':', $path);
  209. $method = explode(',', $method);
  210. }
  211. $method = collect($method)->map(function ($name) {
  212. return strtoupper($name);
  213. })->map(function ($name) {
  214. return "<span class='label label-primary'>{$name}</span>";
  215. })->implode('&nbsp;');
  216. if (!empty(config('admin.route.prefix'))) {
  217. $path = '/'.trim(config('admin.route.prefix'), '/').$path;
  218. }
  219. return "<div style='margin-bottom: 5px;'>$method<code>$path</code></div>";
  220. })->implode('');
  221. });
  222. $show->menuIds("菜单")->unescape()->as(function ($menus) use ($menu_array) {
  223. return collect($menus)->map(function ($menu) use ($menu_array) {
  224. return "<div style='margin-bottom: 5px;'><code>{$menu_array[$menu['menu_id']]}</code></div>";
  225. })->implode("");
  226. });
  227. return $show;
  228. }
  229. /**
  230. * Make a form builder.
  231. *
  232. * @return Form
  233. */
  234. public function form()
  235. {
  236. $form = new Form(new AdminPermission());
  237. $form->text('name', trans('admin.name'))->rules('required');
  238. $form->text('slug', trans('admin.slug'))->rules('required');
  239. if (get_subsite_open()) {
  240. $option_array=[-1 => '通用权限'];
  241. $option_array=$option_array + array_column(get_all_subsite(), 'sitename', 'id');
  242. $form->radio('subsite_id', '权限所属')->options($option_array)->default(-1);
  243. }
  244. $menu_array = [0 => '无'];
  245. $menu_array=$menu_array+AdminMenu::menuArr();
  246. $form->select('menu_id', '菜单')->options($menu_array);
  247. $permission_array = [0 => '顶级'];
  248. $permission_array=$permission_array+AdminPermission::permissionArr();
  249. $form->select('parent_id', "父级")->options($permission_array);
  250. $form->number('listorder', "排序")->min(0)->default(0);
  251. $form->multipleSelect('http_method', trans('admin.http.method'))
  252. ->options($this->getHttpMethodsOptions())
  253. ->help(trans('admin.all_methods_if_empty'));
  254. $form->textarea('http_path', trans('admin.http.path'));
  255. return $form;
  256. }
  257. /**
  258. * Get options of HTTP methods select field.
  259. *
  260. * @return array
  261. */
  262. protected function getHttpMethodsOptions()
  263. {
  264. $permissionModel = config('admin.database.permissions_model');
  265. return array_combine($permissionModel::$httpMethods, $permissionModel::$httpMethods);
  266. }
  267. }