MenuController.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  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. /**
  125. * 执行更新
  126. * @param $id
  127. * @param $data
  128. * @return void
  129. */
  130. protected function doUpdate($id, $data)
  131. {
  132. $model = $this->model->find($id);
  133. foreach ($data as $key => $val) {
  134. $model->{$key} = $val;
  135. }
  136. if ($model->menu_pid != $data['menu_pid']){
  137. $parentMenu = SysMenu::getParent($data['menu_pid']);
  138. $prePath = $parentMenu->menu_path;
  139. $model->menu_path = $prePath . $model->menu_id . '/';
  140. }
  141. $model->save();
  142. }
  143. protected function doFormat($query, $format, $limit): Response
  144. {
  145. $methods = [
  146. 'select' => 'formatSelect',
  147. 'tree' => 'formatTree',
  148. 'menu_tree' => 'formatMenuTree',
  149. 'table_tree' => 'formatTableTree',
  150. 'normal' => 'formatNormal',
  151. ];
  152. $paginator = $query->paginate($limit);
  153. $total = $paginator->total();
  154. $items = $paginator->items();
  155. if (method_exists($this, "afterQuery")) {
  156. $items = call_user_func([$this, "afterQuery"], $items);
  157. }
  158. $format_function = $methods[$format] ?? 'formatNormal';
  159. return call_user_func([$this, $format_function], $items, $total);
  160. }
  161. /**
  162. * @Desc 树形输出
  163. * @Author Gorden
  164. * @Date 2024/3/12 14:22
  165. *
  166. * @param $items
  167. * @return Response
  168. */
  169. protected function formatTree($items): Response
  170. {
  171. $format_items = [];
  172. foreach ($items as $item) {
  173. $format_items[] = [
  174. 'id' => $item->menu_id,
  175. 'pid' => $item->menu_pid,
  176. 'name' => $item->menu_name,
  177. 'path' => $item->menu_route,
  178. 'component' => $item->menu_component,
  179. 'meta' => [
  180. 'icon' => $item->menu_icon,
  181. 'title' => $item->menu_title,
  182. 'type' => $item->menu_is_menu == 1 ? 'menu' : 'permission',
  183. 'status' => $item->menu_status == 1 ? true : false,
  184. 'sort' => $item->menu_sort,
  185. 'hidden' => $item->menu_is_show == 1 ? false : true,
  186. ]
  187. ];
  188. }
  189. $tree = new Tree($format_items);
  190. $menu = $tree->getTree();
  191. // foreach ($menu as &$item) {
  192. // unset($item['component']);
  193. // unset($item['redirect']);
  194. // }
  195. $data = [
  196. 'dashboardGrid' => ["welcome", "member", "sysManage", "about"],
  197. 'menu' => $menu,
  198. 'permissions' => ['list.add']
  199. ];
  200. return json_success('success', $data);
  201. }
  202. protected function formatMenuTree($items): Response
  203. {
  204. $format_items = [];
  205. foreach ($items as $item) {
  206. $format_items[] = [
  207. 'id' => $item->menu_id,
  208. 'pid' => $item->menu_pid,
  209. 'name' => $item->menu_name,
  210. 'path' => $item->menu_route,
  211. 'component' => $item->menu_component,
  212. 'meta' => [
  213. 'icon' => $item->menu_icon,
  214. 'title' => $item->menu_title,
  215. 'type' => $item->menu_is_menu == 1 ? 'menu' : 'permission',
  216. 'status' => $item->menu_status == 1 ? true : false,
  217. 'sort' => $item->menu_sort,
  218. 'hidden' => $item->menu_is_show == 1 ? false : true,
  219. ]
  220. ];
  221. }
  222. $tree = new Tree($format_items);
  223. $menu = $tree->getTree();
  224. // foreach ($menu as &$item) {
  225. // unset($item['component']);
  226. // }
  227. return json_success('success', $menu);
  228. }
  229. public function myMenu(Request $request)
  230. {
  231. [$where, $format, $limit, $field, $order] = $this->selectInput($request);
  232. $format = $request->get('format', 'tree');
  233. $order = $request->get('order', 'desc');
  234. $field = $field ?? 'menu_sort';
  235. // $where['menu_is_show'] = 1;
  236. $limit = 1000;
  237. $query = $this->doSelect($where, $field, $order);
  238. return $this->doFormat($query, $format, $limit);
  239. }
  240. /**
  241. * @Des
  242. * @Author Gorden
  243. * @Date 2024/3/14 10:02
  244. *
  245. * @param Request $request
  246. * @return Response
  247. */
  248. public function delete(Request $request): Response
  249. {
  250. Db::beginTransaction();
  251. try {
  252. $ids = $this->deleteInput($request);
  253. if (!$ids) {
  254. return json_fail('数据错误');
  255. }
  256. $menu = $this->model->whereIn('menu_id', $ids)->get();
  257. foreach ($menu as $item) {
  258. // 删菜单及子菜单
  259. $this->model->where('menu_path', 'like', $item->menu_path . '%')->delete();
  260. }
  261. Db::commit();
  262. // 记录日志
  263. $menu = $menu ? $menu->toArray() : [];
  264. _syslog("删除菜单", "删除菜单", $menu);
  265. return json_success('删除成功');
  266. } catch (\Exception $e) {
  267. Db::rollBack();
  268. return json_fail('删除失败');
  269. }
  270. }
  271. }