263 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			263 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | 
 | |||
|  | namespace app\controller\manager; | |||
|  | 
 | |||
|  | use app\repository\CmsRepository; | |||
|  | use app\model\Log; | |||
|  | use app\model\Menu as MenuModel; | |||
|  | 
 | |||
|  | use app\validate\MenuValidate; | |||
|  | use Exception; | |||
|  | use think\db\exception\DataNotFoundException; | |||
|  | use think\db\exception\DbException; | |||
|  | use think\db\exception\ModelNotFoundException; | |||
|  | use think\exception\ValidateException; | |||
|  | use think\facade\Db; | |||
|  | use think\response\Json; | |||
|  | use think\response\View; | |||
|  | 
 | |||
|  | /** | |||
|  |  * 菜单管理 | |||
|  |  * | |||
|  |  * Class Menu | |||
|  |  * @package app\controller\manager | |||
|  |  */ | |||
|  | class Menu extends Base | |||
|  | { | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 删除 | |||
|  |      * | |||
|  |      * @return Json | |||
|  |      */ | |||
|  |     public function del(): Json | |||
|  |     { | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $ids = input('post.ids/a', []); | |||
|  |             if (empty($ids)) { | |||
|  |                 $ids[] = input('post.id/d'); | |||
|  |             } | |||
|  |             $repo = CmsRepository::getInstance(); | |||
|  |             if ($repo->hasChildrenMenuByIds($ids)) { | |||
|  |                 return $this->json(4002, '待删除数据存在子数据'); | |||
|  |             } | |||
|  |             $repo->delMenuByIds($ids); | |||
|  |             Log::write('menuDel', 'del', '删除了菜单,涉及到的ID为:'.implode(',', $ids)); | |||
|  |             return $this->json(); | |||
|  |         } | |||
|  |         return $this->json(4001, '非法请求!'); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 规则 | |||
|  |      * | |||
|  |      * @return string[] | |||
|  |      */ | |||
|  |     private function rule(): array | |||
|  |     { | |||
|  |         return [ | |||
|  |             'pid|父级菜单'    => 'require|number', | |||
|  |             'title|标题'    => 'require|max:100', | |||
|  |             'name|路由标识'   => 'require', | |||
|  |             'remark|备注信息' => 'max:255', | |||
|  |         ]; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 编辑 | |||
|  |      * | |||
|  |      * @return Json|View | |||
|  |      * @throws DataNotFoundException | |||
|  |      * @throws DbException | |||
|  |      * @throws ModelNotFoundException | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function edit() | |||
|  |     { | |||
|  |         $id = input('id/d', 0); | |||
|  | 
 | |||
|  |         if (!$info = MenuModel::findById($id)) { | |||
|  |             return $this->json(4001, '记录不存在'); | |||
|  |         } | |||
|  | 
 | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $item     = input('post.'); | |||
|  |             $validate = $this->validateByApi($item, $this->rule()); | |||
|  |             if ($validate !== true) { | |||
|  |                 return $validate; | |||
|  |             } | |||
|  | 
 | |||
|  |             try { | |||
|  |                 $oldPath      = $info['path']; | |||
|  |                 $item['path'] = MenuModel::getPath($item['pid']); | |||
|  |                 $info->save($item); | |||
|  | 
 | |||
|  |                 //刷新所有路径
 | |||
|  |                 $oldPath = $oldPath.','.$id; | |||
|  |                 $newPath = $item['path'].','.$id; | |||
|  |                 if ($oldPath != $newPath) { | |||
|  |                     MenuModel::refreshPath(); | |||
|  |                 } | |||
|  |                 return $this->json(); | |||
|  |             } catch (ValidateException $e) { | |||
|  |                 return $this->json(4001, $e->getError()); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         $disabled               = MenuModel::getAllChildrenIds($id); | |||
|  |         $disabled[]             = $id; | |||
|  |         $this->data['menuList'] = $this->menuJson([$info['pid']], $disabled); | |||
|  |         $this->data['item']     = $info; | |||
|  | 
 | |||
|  |         return $this->view(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 单个字段编辑 | |||
|  |      * | |||
|  |      * @return Json | |||
|  |      * @throws DataNotFoundException | |||
|  |      * @throws DbException | |||
|  |      * @throws ModelNotFoundException | |||
|  |      */ | |||
|  |     public function modify(): Json | |||
|  |     { | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $item     = input('post.'); | |||
|  |             $validate = new MenuValidate(); | |||
|  |             if (!$validate->scene('menu_modify')->check($item)) { | |||
|  |                 return $this->json(4002, $validate->getError()); | |||
|  |             } | |||
|  | 
 | |||
|  |             if (!$info = MenuModel::findById($item['id'])) { | |||
|  |                 return $this->json(4001, '记录不存在'); | |||
|  |             } | |||
|  | 
 | |||
|  |             $update = [$item['field'] => $item['value']]; | |||
|  | 
 | |||
|  |             try { | |||
|  |                 $info->save($update); | |||
|  |                 return $this->json(); | |||
|  |             } catch (ValidateException $e) { | |||
|  |                 return $this->json(4001, $e->getError()); | |||
|  |             } | |||
|  |         } | |||
|  |         return $this->json(4000, '非法请求'); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 添加 | |||
|  |      * | |||
|  |      * @return Json|View | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function add() | |||
|  |     { | |||
|  |         $id = input('id/d', 0); | |||
|  | 
 | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $item     = input('post.'); | |||
|  |             $validate = $this->validateByApi($item, $this->rule()); | |||
|  |             if ($validate !== true) { | |||
|  |                 return $validate; | |||
|  |             } | |||
|  |             try { | |||
|  |                 $item['path'] = MenuModel::getPath($item['pid']); | |||
|  |                 MenuModel::create($item); | |||
|  |                 return $this->json(); | |||
|  |             } catch (ValidateException $e) { | |||
|  |                 return $this->json(4001, $e->getError()); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         $selected               = $id > 0 ? [$id] : []; | |||
|  |         $this->data['menuList'] = $this->menuJson($selected); | |||
|  | 
 | |||
|  |         return $this->view(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 常规权限生成 | |||
|  |      * | |||
|  |      * @return Json|View | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function generate() | |||
|  |     { | |||
|  |         $id = input('id/d', 0); | |||
|  | 
 | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $id = input('id/d', 0); | |||
|  |             if (!$item = MenuModel::findById($id)) { | |||
|  |                 return $this->json(4002, '记录不存在'); | |||
|  |             } | |||
|  | 
 | |||
|  |             if ($item['type'] != MenuModel::TYPE_MENU) { | |||
|  |                 return $this->json(4003, '仅菜单类型可操作'); | |||
|  |             } | |||
|  | 
 | |||
|  |             Db::startTrans(); | |||
|  |             try { | |||
|  |                 //自动生成常规操作
 | |||
|  |                 MenuModel::generate($id, $item['name'], $item['path']); | |||
|  |                 Db::commit(); | |||
|  |                 return $this->json(); | |||
|  |             } catch (ValidateException $e) { | |||
|  |                 Db::rollback(); | |||
|  |                 return $this->json(4001, $e->getError()); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         $selected               = $id > 0 ? [$id] : []; | |||
|  |         $this->data['menuList'] = $this->menuJson($selected); | |||
|  | 
 | |||
|  |         return $this->view(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 列表 | |||
|  |      * | |||
|  |      * @return View|Json | |||
|  |      */ | |||
|  |     public function index() | |||
|  |     { | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $menus = CmsRepository::getInstance()->getMenuList(); | |||
|  |             $menus->each(function ($item) { | |||
|  |                 if ($item['type'] == 'menu') { | |||
|  |                     $item->open = false; | |||
|  |                 } | |||
|  |             }); | |||
|  |             $res = [ | |||
|  |                 'code'  => 0, | |||
|  |                 'msg'   => 'success', | |||
|  |                 'count' => $menus->count(), | |||
|  |                 'data'  => $menus->toArray(), | |||
|  |             ]; | |||
|  |             return json($res); | |||
|  |         } | |||
|  |         return $this->view(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * xmSelect插件 json数据 | |||
|  |      * | |||
|  |      * @param  array  $selected | |||
|  |      * @param  array  $disabled | |||
|  |      * @return false|string | |||
|  |      */ | |||
|  |     private function menuJson(array $selected = [], array $disabled = []) | |||
|  |     { | |||
|  |         $categoryList[] = ['title' => '顶级菜单', 'id' => 0, 'prefix' => '', 'disabled' => false, 'open' => true, 'selected' => in_array(0, $selected)]; | |||
|  |         $menus          = CmsRepository::getInstance()->getMenuList(); | |||
|  |         $menus          = $menus->toArray(); | |||
|  |         foreach ($menus as $k => $m) { | |||
|  |             $menus[$k]['selected'] = in_array($m['id'], $selected); | |||
|  |             $menus[$k]['disabled'] = in_array($m['id'], $disabled); | |||
|  |         } | |||
|  |         $menus        = CmsRepository::getInstance()->buildMenuChild(0, $menus); | |||
|  |         $categoryList = array_merge($categoryList, CmsRepository::getInstance()->handleSelectedList($menus)); | |||
|  |         return json_encode($categoryList, JSON_UNESCAPED_UNICODE); | |||
|  |     } | |||
|  | } |