MenuController.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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'] == true ? 1 : 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. // 写操作日志
  69. _syslog("添加菜单", "添加菜单【" . $data['menu_name'] . '】', $data);
  70. return json_success('success');
  71. } else if ($operate == 'update') {
  72. $data['goods_id'] = $params['id'];
  73. $goodsId = $data['goods_id'];
  74. if ($this->validate && !$this->validateClass->scene('update')->check($data)) {
  75. return json_fail($this->validateClass->getError());
  76. }
  77. try {
  78. $data = $this->inputFilter($data);
  79. $this->doUpdate($goodsId, $data);
  80. } catch (BusinessException $customException) {
  81. return json_fail($customException->getMessage());
  82. } catch (\Exception $e) {
  83. return json_fail('数据更新失败');
  84. }
  85. // 记录日志
  86. _syslog("修改菜单", "修改菜单【" . $data['menu_title'] . '】', $data);
  87. return json_success('success');
  88. }
  89. return json_fail('请求失败~');
  90. }
  91. /**
  92. * @Desc 执行插入
  93. * @Author Gorden
  94. * @Date 2024/3/12 14:15
  95. *
  96. * @param array $data
  97. * @return void
  98. * @throws BusinessException\
  99. */
  100. protected function doInsert(array $data)
  101. {
  102. Db::beginTransaction();
  103. try {
  104. $primary_key = $this->model->getKeyName();
  105. $model_class = get_class($this->model);
  106. $model = new $model_class;
  107. foreach ($data as $key => $val) {
  108. $model->{$key} = $val;
  109. }
  110. $model->save();
  111. $prePath = '/0/';
  112. if ($model->menu_pid != 0) {
  113. $parentMenu = SysMenu::getParent($model->menu_pid);
  114. $prePath = $parentMenu->menu_path;
  115. }
  116. $model->menu_path = $prePath . $model->menu_id . '/';
  117. $model->save();
  118. Db::commit();
  119. } catch (\Exception $e) {
  120. Db::rollBack();
  121. throw new BusinessException('数据写入失败~');
  122. }
  123. }
  124. protected function doFormat($query, $format, $limit): Response
  125. {
  126. $methods = [
  127. 'select' => 'formatSelect',
  128. 'tree' => 'formatTree',
  129. 'menu_tree' => 'formatMenuTree',
  130. 'table_tree' => 'formatTableTree',
  131. 'normal' => 'formatNormal',
  132. ];
  133. $paginator = $query->paginate($limit);
  134. $total = $paginator->total();
  135. $items = $paginator->items();
  136. if (method_exists($this, "afterQuery")) {
  137. $items = call_user_func([$this, "afterQuery"], $items);
  138. }
  139. $format_function = $methods[$format] ?? 'formatNormal';
  140. return call_user_func([$this, $format_function], $items, $total);
  141. }
  142. /**
  143. * @Desc 树形输出
  144. * @Author Gorden
  145. * @Date 2024/3/12 14:22
  146. *
  147. * @param $items
  148. * @return Response
  149. */
  150. protected function formatTree($items): Response
  151. {
  152. $format_items = [];
  153. foreach ($items as $item) {
  154. $format_items[] = [
  155. 'id' => $item->menu_id,
  156. 'pid' => $item->menu_pid,
  157. 'name' => $item->menu_name,
  158. 'path' => $item->menu_route,
  159. 'component' => $item->menu_component,
  160. 'meta' => [
  161. 'icon' => $item->menu_icon,
  162. 'title' => $item->menu_title,
  163. 'type' => $item->menu_is_menu == 1 ? 'menu' : 'permission',
  164. 'status' => $item->menu_status == 1 ? true : false,
  165. 'sort' => $item->menu_sort,
  166. 'hidden' => $item->menu_is_show == 1 ? false : true,
  167. ]
  168. ];
  169. }
  170. $tree = new Tree($format_items);
  171. $menu = $tree->getTree();
  172. foreach ($menu as &$item) {
  173. unset($item['component']);
  174. unset($item['redirect']);
  175. }
  176. $data = [
  177. 'dashboardGrid' => ["welcome", "member", "sysManage", "about"],
  178. 'menu' => $menu,
  179. 'permissions' => ['list.add']
  180. ];
  181. return json_success('success', $data);
  182. }
  183. protected function formatMenuTree($items): Response
  184. {
  185. $format_items = [];
  186. foreach ($items as $item) {
  187. $format_items[] = [
  188. 'id' => $item->menu_id,
  189. 'pid' => $item->menu_pid,
  190. 'name' => $item->menu_name,
  191. 'path' => $item->menu_route,
  192. 'component' => $item->menu_component,
  193. 'meta' => [
  194. 'icon' => $item->menu_icon,
  195. 'title' => $item->menu_title,
  196. 'type' => $item->menu_is_menu == 1 ? 'menu' : 'permission',
  197. 'status' => $item->menu_status == 1 ? true : false,
  198. 'sort' => $item->menu_sort,
  199. 'hidden' => $item->menu_is_show == 1 ? false : true,
  200. ]
  201. ];
  202. }
  203. $tree = new Tree($format_items);
  204. $menu = $tree->getTree();
  205. foreach ($menu as &$item) {
  206. unset($item['component']);
  207. }
  208. return json_success('success', $menu);
  209. }
  210. public function myMenu(Request $request)
  211. {
  212. [$where, $format, $limit, $field, $order] = $this->selectInput($request);
  213. $format = $request->get('format', 'tree');
  214. $order = $request->get('order', 'desc');
  215. $field = $field ?? 'menu_sort';
  216. // $where['menu_is_show'] = 1;
  217. $limit = 1000;
  218. $query = $this->doSelect($where, $field, $order);
  219. return $this->doFormat($query, $format, $limit);
  220. }
  221. /**
  222. * @Des
  223. * @Author Gorden
  224. * @Date 2024/3/14 10:02
  225. *
  226. * @param Request $request
  227. * @return Response
  228. */
  229. public function delete(Request $request): Response
  230. {
  231. Db::beginTransaction();
  232. try {
  233. $ids = $this->deleteInput($request);
  234. if (!$ids) {
  235. return json_fail('数据错误');
  236. }
  237. $menu = $this->model->whereIn('menu_id', $ids)->get();
  238. foreach ($menu as $item) {
  239. // 删菜单及子菜单
  240. $this->model->where('menu_path', 'like', $item->menu_path . '%')->delete();
  241. }
  242. Db::commit();
  243. // 记录日志
  244. $menu = $menu ? $menu->toArray() : [];
  245. _syslog("删除菜单", "删除菜单", $menu);
  246. return json_success('删除成功');
  247. } catch (\Exception $e) {
  248. Db::rollBack();
  249. return json_fail('删除失败');
  250. }
  251. }
  252. }