MenuController.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <?php
  2. namespace app\admin\controller\sys_manage;
  3. use app\admin\validate\sys_manage\MenuValidate;
  4. use app\common\Tree;
  5. use app\controller\Curd;
  6. use app\model\SysMenu;
  7. use support\Db;
  8. use support\exception\BusinessException;
  9. use support\Request;
  10. use support\Response;
  11. class MenuController extends Curd
  12. {
  13. public function __construct()
  14. {
  15. $this->model = new SysMenu();
  16. $this->validate = true;
  17. $this->validateClass = new MenuValidate();
  18. }
  19. /**
  20. * @Desc 列表
  21. * @Author Gorden
  22. * @Date 2024/3/12 14:07
  23. *
  24. * @param Request $request
  25. * @return Response
  26. * @throws \support\exception\BusinessException
  27. */
  28. public function select(Request $request): Response
  29. {
  30. [$where, $format, $limit, $field, $order] = $this->selectInput($request);
  31. $format = $request->get('format', 'menu_tree');
  32. $order = $request->get('order', 'desc');
  33. $field = $field ?? 'menu_sort';
  34. $limit = 1000;
  35. $query = $this->doSelect($where, $field, $order);
  36. return $this->doFormat($query, $format, $limit);
  37. }
  38. public function save(Request $request)
  39. {
  40. $params = $request->post();
  41. $data = [
  42. 'menu_pid' => $params['parentId'],
  43. 'menu_icon' => $params['meta']['icon'] ?? '',
  44. 'menu_name' => $params['name'],
  45. 'menu_title' => $params['meta']['title'],
  46. 'menu_uri' => $params['redirect'] ?? '',
  47. 'menu_route' => $params['path'],
  48. 'menu_component' => $params['component'] ?? '',
  49. 'menu_sort' => $params['meta']['sort'] ?? 0,
  50. 'menu_is_show' => isset($params['meta']['hidden']) && $params['meta']['hidden'] ? 2 : 1,
  51. 'menu_is_menu' => $params['meta']['type'] == 'menu' ? 1 : 2,
  52. 'menu_status' => $params['meta']['status'] ?? 2,
  53. // 'level' => $params['level'],
  54. ];
  55. $operate = $params['operate'];
  56. if ($operate == 'add') {
  57. if ($this->validate && !$this->validateClass->scene('add')->check($data)) {
  58. return json_fail($this->validateClass->getError());
  59. }
  60. try {
  61. $data = $this->inputFilter($data);
  62. $this->doInsert($data);
  63. } catch (BusinessException $customException) {
  64. return json_fail($customException->getMessage());
  65. } catch (\Exception $exception) {
  66. return json_fail('数据写入失败');
  67. }
  68. return json_success('success');
  69. } else if ($operate == 'update') {
  70. $data['goods_id'] = $params['id'];
  71. $goodsId = $data['goods_id'];
  72. if ($this->validate && !$this->validateClass->scene('update')->check($data)) {
  73. return json_fail($this->validateClass->getError());
  74. }
  75. try {
  76. $data = $this->inputFilter($data);
  77. $this->doUpdate($goodsId, $data);
  78. } catch (BusinessException $customException) {
  79. return json_fail($customException->getMessage());
  80. } catch (\Exception $e) {
  81. return json_fail('数据更新失败');
  82. }
  83. return json_success('success');
  84. }
  85. return json_fail('请求失败~');
  86. }
  87. /**
  88. * @Desc 执行插入
  89. * @Author Gorden
  90. * @Date 2024/3/12 14:15
  91. *
  92. * @param array $data
  93. * @return void
  94. * @throws BusinessException\
  95. */
  96. protected function doInsert(array $data)
  97. {
  98. Db::beginTransaction();
  99. try {
  100. $primary_key = $this->model->getKeyName();
  101. $model_class = get_class($this->model);
  102. $model = new $model_class;
  103. foreach ($data as $key => $val) {
  104. $model->{$key} = $val;
  105. }
  106. $model->save();
  107. $prePath = '/0/';
  108. if ($model->menu_pid != 0) {
  109. $parentMenu = SysMenu::getParent($model->menu_pid);
  110. $prePath = $parentMenu->menu_path;
  111. }
  112. $model->menu_path = $prePath . $model->menu_id . '/';
  113. $model->save();
  114. Db::commit();
  115. } catch (\Exception $e) {
  116. Db::rollBack();
  117. throw new BusinessException('数据写入失败~');
  118. }
  119. }
  120. protected function doFormat($query, $format, $limit): Response
  121. {
  122. $methods = [
  123. 'select' => 'formatSelect',
  124. 'tree' => 'formatTree',
  125. 'menu_tree' => 'formatMenuTree',
  126. 'table_tree' => 'formatTableTree',
  127. 'normal' => 'formatNormal',
  128. ];
  129. $paginator = $query->paginate($limit);
  130. $total = $paginator->total();
  131. $items = $paginator->items();
  132. if (method_exists($this, "afterQuery")) {
  133. $items = call_user_func([$this, "afterQuery"], $items);
  134. }
  135. $format_function = $methods[$format] ?? 'formatNormal';
  136. return call_user_func([$this, $format_function], $items, $total);
  137. }
  138. /**
  139. * @Desc 树形输出
  140. * @Author Gorden
  141. * @Date 2024/3/12 14:22
  142. *
  143. * @param $items
  144. * @return Response
  145. */
  146. protected function formatTree($items): Response
  147. {
  148. $format_items = [];
  149. foreach ($items as $item) {
  150. $format_items[] = [
  151. 'id' => $item->menu_id,
  152. 'pid' => $item->menu_pid,
  153. 'name' => $item->menu_name,
  154. 'path' => $item->menu_route,
  155. 'component' => $item->menu_component,
  156. 'meta' => [
  157. 'icon' => $item->menu_icon,
  158. 'title' => $item->menu_title,
  159. 'type' => $item->menu_is_menu == 1 ? 'menu' : 'permission',
  160. 'status' => $item->menu_status == 1 ? true : false,
  161. 'sort' => $item->menu_sort,
  162. 'hidden' => $item->menu_is_show == 1 ? false : true,
  163. ]
  164. ];
  165. }
  166. $tree = new Tree($format_items);
  167. $menu = $tree->getTree();
  168. foreach ($menu as &$item) {
  169. unset($item['component']);
  170. unset($item['redirect']);
  171. }
  172. $data = [
  173. 'dashboardGrid' => ["welcome", "member", "sysManage", "about"],
  174. 'menu' => $menu,
  175. 'permissions' => ['list.add']
  176. ];
  177. return json_success('success', $data);
  178. }
  179. protected function formatMenuTree($items): Response
  180. {
  181. $format_items = [];
  182. foreach ($items as $item) {
  183. $format_items[] = [
  184. 'id' => $item->menu_id,
  185. 'pid' => $item->menu_pid,
  186. 'name' => $item->menu_name,
  187. 'path' => $item->menu_route,
  188. 'component' => $item->menu_component,
  189. 'meta' => [
  190. 'icon' => $item->menu_icon,
  191. 'title' => $item->menu_title,
  192. 'type' => $item->menu_is_menu == 1 ? 'menu' : 'permission',
  193. 'status' => $item->menu_status == 1 ? true : false,
  194. 'sort' => $item->menu_sort,
  195. 'hidden' => $item->menu_is_show == 1 ? false : true,
  196. ]
  197. ];
  198. }
  199. $tree = new Tree($format_items);
  200. $menu = $tree->getTree();
  201. foreach ($menu as &$item) {
  202. unset($item['component']);
  203. }
  204. return json_success('success', $menu);
  205. }
  206. public function myMenu(Request $request)
  207. {
  208. [$where, $format, $limit, $field, $order] = $this->selectInput($request);
  209. $format = $request->get('format', 'tree');
  210. $order = $request->get('order', 'desc');
  211. $field = $field ?? 'menu_sort';
  212. // $where['menu_is_show'] = 1;
  213. $limit = 1000;
  214. $query = $this->doSelect($where, $field, $order);
  215. return $this->doFormat($query, $format, $limit);
  216. }
  217. /**
  218. * @Des
  219. * @Author Gorden
  220. * @Date 2024/3/14 10:02
  221. *
  222. * @param Request $request
  223. * @return Response
  224. */
  225. public function delete(Request $request): Response
  226. {
  227. Db::beginTransaction();
  228. try {
  229. $ids = $this->deleteInput($request);
  230. if (!$ids) {
  231. return json_fail('数据错误');
  232. }
  233. $menu = $this->model->whereIn('menu_id', $ids)->get();
  234. foreach ($menu as $item) {
  235. // 删菜单及子菜单
  236. $this->model->where('menu_path', 'like', $item->menu_path . '%')->delete();
  237. }
  238. Db::commit();
  239. return json_success('删除成功');
  240. } catch (\Exception $e) {
  241. Db::rollBack();
  242. return json_fail('删除失败');
  243. }
  244. }
  245. }