Browse Source

菜单、角色对接调整

gorden 1 year ago
parent
commit
9ca9df5a1c

+ 235 - 0
app/admin/controller/sys_manage/MenuController.php

@@ -0,0 +1,235 @@
+<?php
+
+namespace app\admin\controller\sys_manage;
+
+use app\admin\validate\sys_manage\MenuValidate;
+use app\common\Tree;
+use app\controller\Curd;
+use app\model\SysMenu;
+use support\Db;
+use support\exception\BusinessException;
+use support\Request;
+use support\Response;
+
+class MenuController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new SysMenu();
+        $this->validate = true;
+        $this->validateClass = new MenuValidate();
+    }
+
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/12 14:07
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $format = $request->get('format', 'menu_tree');
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'menu_sort';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    public function save(Request $request)
+    {
+        $params = $request->post();
+        $data = [
+            'menu_pid' => $params['parentId'],
+            'menu_icon' => $params['meta']['icon'] ?? '',
+            'menu_name' => $params['name'],
+            'menu_title' => $params['meta']['title'],
+            'menu_uri' => $params['redirect'] ?? '',
+            'menu_route' => $params['path'],
+            'menu_component' => $params['component'] ?? '',
+            'menu_sort' => $params['meta']['sort'] ?? 0,
+            'menu_is_show' => isset($params['meta']['hidden']) && $params['meta']['hidden'] ? 2 : 1,
+            'menu_is_menu' => $params['meta']['type'] == 'menu' ? 1 : 2,
+            'menu_status' => $params['meta']['status'] ?? 2,
+//            'level' => $params['level'],
+        ];
+        $operate = $params['operate'];
+        if ($operate == 'add') {
+            if ($this->validate && !$this->validateClass->scene('add')->check($data)) {
+                return json_fail($this->validateClass->getError());
+            }
+
+            try {
+                $data = $this->inputFilter($data);
+                $this->doInsert($data);
+            } catch (BusinessException $customException) {
+                return json_fail($customException->getMessage());
+            } catch (\Exception $exception) {
+                return json_fail('数据写入失败');
+            }
+            return json_success('success');
+        } else if ($operate == 'update') {
+            $data['goods_id'] = $params['id'];
+            $goodsId = $data['goods_id'];
+            if ($this->validate && !$this->validateClass->scene('update')->check($data)) {
+                return json_fail($this->validateClass->getError());
+            }
+
+            try {
+                $data = $this->inputFilter($data);
+                $this->doUpdate($goodsId, $data);
+            } catch (BusinessException $customException) {
+                return json_fail($customException->getMessage());
+            } catch (\Exception $e) {
+                return json_fail('数据更新失败');
+            }
+
+            return json_success('success');
+        }
+
+        return json_fail('请求失败~');
+    }
+
+    /**
+     * @Desc 执行插入
+     * @Author Gorden
+     * @Date 2024/3/12 14:15
+     *
+     * @param array $data
+     * @return void
+     * @throws BusinessException\
+     */
+    protected function doInsert(array $data)
+    {
+        Db::beginTransaction();
+        try {
+            $primary_key = $this->model->getKeyName();
+            $model_class = get_class($this->model);
+            $model = new $model_class;
+            foreach ($data as $key => $val) {
+                $model->{$key} = $val;
+            }
+            $model->save();
+
+            $prePath = '/0/';
+            if ($model->menu_pid != 0) {
+                $parentMenu = SysMenu::getParent($model->menu_pid);
+                $prePath = $parentMenu->menu_path;
+            }
+            $model->menu_path = $prePath . $model->menu_id . '/';
+            $model->save();
+            Db::commit();
+        } catch (\Exception $e) {
+            Db::rollBack();
+            throw new BusinessException('数据写入失败~');
+        }
+    }
+
+    protected function doFormat($query, $format, $limit): Response
+    {
+        $methods = [
+            'select' => 'formatSelect',
+            'tree' => 'formatTree',
+            'menu_tree' => 'formatMenuTree',
+            'table_tree' => 'formatTableTree',
+            'normal' => 'formatNormal',
+        ];
+        $paginator = $query->paginate($limit);
+        $total = $paginator->total();
+        $items = $paginator->items();
+        if (method_exists($this, "afterQuery")) {
+            $items = call_user_func([$this, "afterQuery"], $items);
+        }
+        $format_function = $methods[$format] ?? 'formatNormal';
+        return call_user_func([$this, $format_function], $items, $total);
+    }
+
+    /**
+     * @Desc 树形输出
+     * @Author Gorden
+     * @Date 2024/3/12 14:22
+     *
+     * @param $items
+     * @return Response
+     */
+    protected function formatTree($items): Response
+    {
+        $format_items = [];
+        foreach ($items as $item) {
+            $format_items[] = [
+                'id' => $item->menu_id,
+                'pid' => $item->menu_pid,
+                'name' => $item->menu_name,
+                'path' => $item->menu_route,
+                'component' => $item->menu_component,
+                'meta' => [
+                    'icon' => $item->menu_icon,
+                    'title' => $item->menu_title,
+                    'type' => $item->menu_is_menu == 1 ? 'menu' : 'permission',
+                    'status' => $item->menu_status == 1 ? true : false,
+                    'sort' => $item->menu_sort,
+                    'hidden' => $item->menu_is_show == 1 ? false : true,
+                ]
+            ];
+        }
+        $tree = new Tree($format_items);
+
+        $menu = $tree->getTree();
+        foreach ($menu as &$item) {
+            unset($item['component']);
+            unset($item['redirect']);
+        }
+
+        $data = [
+            'dashboardGrid' => ["welcome", "member", "sysManage", "about"],
+            'menu' => $menu,
+            'permissions' => ['list.add']
+        ];
+
+        return json_success('success', $data);
+    }
+
+    protected function formatMenuTree($items): Response
+    {
+        $format_items = [];
+        foreach ($items as $item) {
+            $format_items[] = [
+                'id' => $item->menu_id,
+                'pid' => $item->menu_pid,
+                'name' => $item->menu_name,
+                'path' => $item->menu_route,
+                'component' => $item->menu_component,
+                'meta' => [
+                    'icon' => $item->menu_icon,
+                    'title' => $item->menu_title,
+                    'type' => $item->menu_is_menu == 1 ? 'menu' : 'permission',
+                    'status' => $item->menu_status == 1 ? true : false,
+                    'sort' => $item->menu_sort,
+                    'hidden' => $item->menu_is_show == 1 ? false : true,
+                ]
+            ];
+        }
+        $tree = new Tree($format_items);
+
+        $menu = $tree->getTree();
+        foreach ($menu as &$item) {
+            unset($item['component']);
+        }
+
+        return json_success('success', $menu);
+    }
+
+    public function myMenu(Request $request)
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $format = $request->get('format', 'tree');
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'menu_sort';
+        $where['menu_is_show'] = 1;
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+}

+ 7 - 2
app/admin/controller/sys_manage/RoleController.php

@@ -38,6 +38,11 @@ class RoleController
         return RoleService::roleInfo($id);
     }
 
+    public function save()
+    {
+
+    }
+
     /**
      * @Desc 添加角色
      * @Author Gorden
@@ -83,9 +88,9 @@ class RoleController
      * @param $id
      * @return \support\Response
      */
-    public function delRole($id)
+    public function delRole(Request $request)
     {
-        return RoleService::delRole(intval($id));
+        return RoleService::delRole($request->post());
     }
 
     /**

+ 9 - 9
app/admin/service/sys_manage/RoleService.php

@@ -16,21 +16,21 @@ class RoleService
      * @param $keyword
      * @return \support\Response
      */
-    public static function roleList($page, $limit, $keywords)
+    public static function roleList($page, $pageSize, $keywords)
     {
-        $list = SysRole::select('*')
+        $rows = SysRole::select('*')
             ->when($keywords != '', function ($query) use ($keywords) {
                 $query->where('role_name', 'like', '%' . $keywords . '%');
             })
             ->orderBy('role_addtimes', 'DESC')
-            ->forPage($page, $limit)
+            ->forPage($page, $pageSize)
             ->get()
             ->toArray();
-        $count = SysRole::when($keywords != '', function ($query) use ($keywords) {
+        $total = SysRole::when($keywords != '', function ($query) use ($keywords) {
             $query->where('role_name', 'like', '%' . $keywords . '%');
         })->count();
 
-        return json_success('', compact('list', 'page', 'limit', 'count'));
+        return json_success('', compact('rows', 'page', 'pageSize', 'total'));
     }
 
     /**
@@ -105,13 +105,13 @@ class RoleService
                 'role_category' => $params['role_category'],
                 'role_name' => $params['role_name'],
                 'role_remark' => $params['role_remark'] ? format_string($params['role_remark']) : null,
-                'role_extend_json' => $params['role_extend_json'],
+                'role_extend_json' => $params['role_extend_json'] ?? '{}',
             ];
             if (!SysRole::where('role_id', $id)->update($data)) {
                 throw new \Exception('角色修改失败');
             }
         } catch (\Exception $e) {
-            return json_fail('角色修改失败');
+            return json_fail($e->getMessage());
         }
 
         return json_success('角色修改成功');
@@ -125,10 +125,10 @@ class RoleService
      * @param $id
      * @return \support\Response
      */
-    public static function delRole($id)
+    public static function delRole($params)
     {
         try {
-            if (!SysRole::where('role_id', $id)->delete()) {
+            if (!SysRole::whereIn('role_id', $params)->delete()) {
                 throw new \Exception('角色删除失败');
             }
         } catch (\Exception $e) {

+ 27 - 0
app/admin/validate/sys_manage/MenuValidate.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace app\admin\validate\sys_manage;
+
+use think\Validate;
+
+class MenuValidate extends Validate
+{
+    protected $rule = [
+        'menu_id' => 'require|integer',
+        'menu_pid' => 'require|integer',
+        'menu_icon' => 'alphaDash',
+        'menu_name' => 'require|max:128',
+        'menu_route' => 'max:64',
+        'menu_params' => 'max:128',
+        'menu_sort' => 'require|integer',
+        'menu_is_show' => 'require|integer',
+        'menu_is_menu' => 'require|integer',
+        'menu_status' => 'require|integer',
+        'level' => 'integer',
+    ];
+
+    protected $scene = [
+        'add' => ['menu_pid', 'menu_icon', 'menu_name', 'menu_route', 'menu_params', 'menu_sort', 'menu_is_show', 'menu_is_menu', 'menu_status', 'level'],
+        'update' => ['menu_pid', 'menu_icon', 'menu_name', 'menu_route', 'menu_params', 'menu_sort', 'menu_is_show', 'menu_is_menu', 'menu_status', 'level'],
+    ];
+}

+ 31 - 0
app/model/SysMenu.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace app\model;
+
+use support\Model;
+
+class SysMenu extends Model
+{
+    protected $table = 'sys_menu';
+
+    protected $primaryKey = 'menu_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'menu_create_time';
+
+    const UPDATED_AT = 'menu_update_time';
+
+    /**
+     * @Desc 获取父级
+     * @Author Gorden
+     * @Date 2024/3/12 14:13
+     *
+     * @param $pid
+     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|object|null
+     */
+    public static function getParent($pid)
+    {
+        return self::where('menu_id',$pid)->first();
+    }
+}

+ 5 - 0
app/model/SysRole.php

@@ -12,4 +12,9 @@ class SysRole extends Model
     protected $primaryKey = 'role_id';
 
     public const UPDATED_AT = null;
+
+    public function getRoleAddtimesAttribute($value)
+    {
+        return date('Y-m-d H:i:s',$value);
+    }
 }

+ 11 - 1
route/admin.php

@@ -26,7 +26,7 @@ Route::group('/admin', function () {
             Route::get('/info/{id:\d+}', [\app\admin\controller\sys_manage\RoleController::class, 'roleInfo']);
             Route::post('/add', [\app\admin\controller\sys_manage\RoleController::class, 'addRole']);
             Route::post('/update/{id:\d+}', [\app\admin\controller\sys_manage\RoleController::class, 'updateRole']);
-            Route::delete('/delete/{id:\d+}', [\app\admin\controller\sys_manage\RoleController::class, 'delRole']);
+            Route::delete('/delete', [\app\admin\controller\sys_manage\RoleController::class, 'delRole']);
             Route::post('/updateStatus/{id:\d+}', [\app\admin\controller\sys_manage\RoleController::class, 'updateStatus']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
@@ -98,6 +98,16 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        Route::group('/menu', function () {
+            Route::get('/my', [\app\admin\controller\sys_manage\MenuController::class, 'myMenu']);
+            Route::get('/list', [\app\admin\controller\sys_manage\MenuController::class, 'select']);
+            Route::post('/save', [\app\admin\controller\sys_manage\MenuController::class, 'save']);
+            Route::post('/add', [\app\admin\controller\sys_manage\MenuController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\sys_manage\MenuController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\sys_manage\MenuController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
     });
 
     /* 业务支撑 */