MenuController.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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. $query = $this->doSelect($where, $field, $order);
  35. return $this->doFormat($query, $format, $limit);
  36. }
  37. public function save(Request $request)
  38. {
  39. $params = $request->post();
  40. $data = [
  41. 'menu_pid' => $params['parentId'],
  42. 'menu_icon' => $params['meta']['icon'] ?? '',
  43. 'menu_name' => $params['name'],
  44. 'menu_title' => $params['meta']['title'],
  45. 'menu_uri' => $params['redirect'] ?? '',
  46. 'menu_route' => $params['path'],
  47. 'menu_component' => $params['component'] ?? '',
  48. 'menu_sort' => $params['meta']['sort'] ?? 0,
  49. 'menu_is_show' => isset($params['meta']['hidden']) && $params['meta']['hidden'] ? 2 : 1,
  50. 'menu_is_menu' => $params['meta']['type'] == 'menu' ? 1 : 2,
  51. 'menu_status' => $params['meta']['status'] ?? 2,
  52. // 'level' => $params['level'],
  53. ];
  54. $operate = $params['operate'];
  55. if ($operate == 'add') {
  56. if ($this->validate && !$this->validateClass->scene('add')->check($data)) {
  57. return json_fail($this->validateClass->getError());
  58. }
  59. try {
  60. $data = $this->inputFilter($data);
  61. $this->doInsert($data);
  62. } catch (BusinessException $customException) {
  63. return json_fail($customException->getMessage());
  64. } catch (\Exception $exception) {
  65. return json_fail('数据写入失败');
  66. }
  67. return json_success('success');
  68. } else if ($operate == 'update') {
  69. $data['goods_id'] = $params['id'];
  70. $goodsId = $data['goods_id'];
  71. if ($this->validate && !$this->validateClass->scene('update')->check($data)) {
  72. return json_fail($this->validateClass->getError());
  73. }
  74. try {
  75. $data = $this->inputFilter($data);
  76. $this->doUpdate($goodsId, $data);
  77. } catch (BusinessException $customException) {
  78. return json_fail($customException->getMessage());
  79. } catch (\Exception $e) {
  80. return json_fail('数据更新失败');
  81. }
  82. return json_success('success');
  83. }
  84. return json_fail('请求失败~');
  85. }
  86. /**
  87. * @Desc 执行插入
  88. * @Author Gorden
  89. * @Date 2024/3/12 14:15
  90. *
  91. * @param array $data
  92. * @return void
  93. * @throws BusinessException\
  94. */
  95. protected function doInsert(array $data)
  96. {
  97. Db::beginTransaction();
  98. try {
  99. $primary_key = $this->model->getKeyName();
  100. $model_class = get_class($this->model);
  101. $model = new $model_class;
  102. foreach ($data as $key => $val) {
  103. $model->{$key} = $val;
  104. }
  105. $model->save();
  106. $prePath = '/0/';
  107. if ($model->menu_pid != 0) {
  108. $parentMenu = SysMenu::getParent($model->menu_pid);
  109. $prePath = $parentMenu->menu_path;
  110. }
  111. $model->menu_path = $prePath . $model->menu_id . '/';
  112. $model->save();
  113. Db::commit();
  114. } catch (\Exception $e) {
  115. Db::rollBack();
  116. throw new BusinessException('数据写入失败~');
  117. }
  118. }
  119. protected function doFormat($query, $format, $limit): Response
  120. {
  121. $methods = [
  122. 'select' => 'formatSelect',
  123. 'tree' => 'formatTree',
  124. 'menu_tree' => 'formatMenuTree',
  125. 'table_tree' => 'formatTableTree',
  126. 'normal' => 'formatNormal',
  127. ];
  128. $paginator = $query->paginate($limit);
  129. $total = $paginator->total();
  130. $items = $paginator->items();
  131. if (method_exists($this, "afterQuery")) {
  132. $items = call_user_func([$this, "afterQuery"], $items);
  133. }
  134. $format_function = $methods[$format] ?? 'formatNormal';
  135. return call_user_func([$this, $format_function], $items, $total);
  136. }
  137. /**
  138. * @Desc 树形输出
  139. * @Author Gorden
  140. * @Date 2024/3/12 14:22
  141. *
  142. * @param $items
  143. * @return Response
  144. */
  145. protected function formatTree($items): Response
  146. {
  147. $format_items = [];
  148. foreach ($items as $item) {
  149. $format_items[] = [
  150. 'id' => $item->menu_id,
  151. 'pid' => $item->menu_pid,
  152. 'name' => $item->menu_name,
  153. 'path' => $item->menu_route,
  154. 'component' => $item->menu_component,
  155. 'meta' => [
  156. 'icon' => $item->menu_icon,
  157. 'title' => $item->menu_title,
  158. 'type' => $item->menu_is_menu == 1 ? 'menu' : 'permission',
  159. 'status' => $item->menu_status == 1 ? true : false,
  160. 'sort' => $item->menu_sort,
  161. 'hidden' => $item->menu_is_show == 1 ? false : true,
  162. ]
  163. ];
  164. }
  165. $tree = new Tree($format_items);
  166. $menu = $tree->getTree();
  167. foreach ($menu as &$item) {
  168. unset($item['component']);
  169. unset($item['redirect']);
  170. }
  171. $data = [
  172. 'dashboardGrid' => ["welcome", "member", "sysManage", "about"],
  173. 'menu' => $menu,
  174. 'permissions' => ['list.add']
  175. ];
  176. return json_success('success', $data);
  177. }
  178. protected function formatMenuTree($items): Response
  179. {
  180. $format_items = [];
  181. foreach ($items as $item) {
  182. $format_items[] = [
  183. 'id' => $item->menu_id,
  184. 'pid' => $item->menu_pid,
  185. 'name' => $item->menu_name,
  186. 'path' => $item->menu_route,
  187. 'component' => $item->menu_component,
  188. 'meta' => [
  189. 'icon' => $item->menu_icon,
  190. 'title' => $item->menu_title,
  191. 'type' => $item->menu_is_menu == 1 ? 'menu' : 'permission',
  192. 'status' => $item->menu_status == 1 ? true : false,
  193. 'sort' => $item->menu_sort,
  194. 'hidden' => $item->menu_is_show == 1 ? false : true,
  195. ]
  196. ];
  197. }
  198. $tree = new Tree($format_items);
  199. $menu = $tree->getTree();
  200. foreach ($menu as &$item) {
  201. unset($item['component']);
  202. }
  203. return json_success('success', $menu);
  204. }
  205. public function myMenu(Request $request)
  206. {
  207. [$where, $format, $limit, $field, $order] = $this->selectInput($request);
  208. $format = $request->get('format', 'tree');
  209. $order = $request->get('order', 'desc');
  210. $field = $field ?? 'menu_sort';
  211. $where['menu_is_show'] = 1;
  212. $query = $this->doSelect($where, $field, $order);
  213. return $this->doFormat($query, $format, $limit);
  214. }
  215. }