diff --git a/Server/application/common/model/Menu.php b/Server/application/common/model/Menu.php index 03c52dd3..72597fd3 100644 --- a/Server/application/common/model/Menu.php +++ b/Server/application/common/model/Menu.php @@ -1,8 +1,8 @@ order('sort', 'asc') - ->select() - ->toArray(); - - // 组织成树状结构 - $menuTree = self::buildMenuTree($allMenus); - - // 缓存结果 - if ($useCache) { - Cache::set($cacheKey, $menuTree, 3600); // 缓存1小时 - } - - return $menuTree; - } - - /** - * 构建菜单树 - * @param array $menus 所有菜单 - * @param int $parentId 父菜单ID - * @return array - */ - private static function buildMenuTree($menus, $parentId = 0) - { - $tree = []; - - foreach ($menus as $menu) { - if ($menu['parent_id'] == $parentId) { - $children = self::buildMenuTree($menus, $menu['id']); - if (!empty($children)) { - $menu['children'] = $children; - } - $tree[] = $menu; - } - } - - return $tree; - } - - /** - * 根据权限ID获取相应的菜单树 - * @param array $permissionIds 权限ID数组 - * @param bool $onlyEnabled 是否只获取启用的菜单 - * @return array - */ - public static function getMenuTreeByPermissions($permissionIds, $onlyEnabled = true) - { - // 如果没有权限,返回空数组 - if (empty($permissionIds)) { - return []; - } - - // 查询条件 - $where = []; - if ($onlyEnabled) { - $where[] = ['status', '=', 1]; - } - - // 获取所有一级菜单(用户拥有权限的) - $topMenus = self::where($where) - ->where('parent_id', 0) - ->whereIn('id', $permissionIds) - ->order('sort', 'asc') - ->select() - ->toArray(); - - // 菜单ID集合,用于获取子菜单 - $menuIds = array_column($topMenus, 'id'); - - // 获取所有子菜单 - $childMenus = self::where($where) - ->where('parent_id', 'in', $menuIds) - ->order('sort', 'asc') - ->select() - ->toArray(); - - // 将子菜单按照父ID进行分组 - $childMenusGroup = []; - foreach ($childMenus as $menu) { - $childMenusGroup[$menu['parent_id']][] = $menu; - } - - // 构建菜单树 - $menuTree = []; - foreach ($topMenus as $topMenu) { - // 添加子菜单 - if (isset($childMenusGroup[$topMenu['id']])) { - $topMenu['children'] = $childMenusGroup[$topMenu['id']]; - } - $menuTree[] = $topMenu; - } - - return $menuTree; - } -} \ No newline at end of file +} \ No newline at end of file diff --git a/Server/application/superadmin/config/route.php b/Server/application/superadmin/config/route.php index 2ee4b18b..6b65b96d 100644 --- a/Server/application/superadmin/config/route.php +++ b/Server/application/superadmin/config/route.php @@ -14,12 +14,7 @@ Route::group('', function () { // 菜单管理相关路由 Route::group('menu', function () { - Route::get('tree', 'app\superadmin\controller\MenuController@getMenuTree'); - Route::get('list', 'app\superadmin\controller\MenuController@getMenuList'); - Route::post('save', 'app\superadmin\controller\MenuController@saveMenu'); - Route::delete('delete/:id', 'app\superadmin\controller\MenuController@deleteMenu'); - Route::post('status', 'app\superadmin\controller\MenuController@updateStatus'); - Route::get('toplevel', 'app\superadmin\controller\MenuController@getTopLevelMenus'); + Route::get('tree', 'app\superadmin\controller\Menu\GetMenuTreeController@index'); }); // 管理员相关路由 diff --git a/Server/application/superadmin/controller/Menu/GetMenuTreeController.php b/Server/application/superadmin/controller/Menu/GetMenuTreeController.php new file mode 100644 index 00000000..7f1ceedc --- /dev/null +++ b/Server/application/superadmin/controller/Menu/GetMenuTreeController.php @@ -0,0 +1,191 @@ +buildMenuTree($menus, $menu['id']); + + if (!empty($children)) { + $menu['children'] = $children; + } + + $tree[] = $menu; + } + } + + return $tree; + } + + /** + * 获取管理员权限 + * + * @return array + */ + protected function getPermissions(): array + { + $record = AdministratorPermissionsModel::where('adminId', $this->getAdminInfo('id'))->find(); + + if (!$record || empty($record->permissions)) { + return []; + } + + $permissions = $record->permissions ? json_decode($record->permissions, true) : []; + + if (isset($permissions['ids']) && !empty($permissions['ids'])) { + return is_string($permissions['ids']) ? explode(',', $permissions['ids']) : $permissions['ids']; + } + + return []; + } + + /** + * 获取所有菜单,并组织成树状结构 + * + * @return array + */ + protected function getMenuTree(): array + { + // 获取所有菜单 + $allMenus = MenuModel::where('status', 1)->order('sort', 'asc')->select()->toArray(); + + // 组织成树状结构 + return $allMenus ? $this->buildMenuTree($allMenus) : []; + } + + /** + * 获取所有一级菜单(用户拥有权限的) + * + * @param array $permissionIds + * @return array + */ + protected function getTopMenusInPermissionIds(array $permissionIds): array + { + $where = [ + 'id' => ['in', $permissionIds], + 'parentId' => 0, + 'status' => 1, + ]; + + return MenuModel::where($where)->order('sort', 'asc')->select()->toArray(); + } + + /** + * 获取所有子菜单. + * + * @param array $topMenuIds + * @return array + */ + protected function getAllChildrenInPermissionIds(array $topMenuIds): array + { + $where = [ + 'parentId' => ['in', $topMenuIds], + 'status' => 1, + ]; + + return MenuModel::where($where)->order('sort', 'asc')->select()->toArray(); + } + + /** + * 获取用户菜单 + * + * @param array $permissionIds + * @return array + */ + protected function getUserMenus(array $permissionIds): array + { + $topMenus = $this->getTopMenusInPermissionIds($permissionIds); + + // 菜单ID集合,用于获取子菜单 + $menuIds = array_column($topMenus, 'id'); + + return $this->getAllChildrenInPermissionIds($menuIds); + } + + /** + * 构建菜单树. + * + * @param array $childMenus + * @return array + */ + protected function _makeMenuTree(array $childMenus): array + { + // 将子菜单按照父ID进行分组 + $childMenusGroup = []; + + foreach ($childMenus as $menu) { + $childMenusGroup[$menu['parentId']][] = $menu; + } + + foreach ($topMenus as $topMenu) { + if (isset($childMenusGroup[$topMenu['id']])) { + $topMenu['children'] = $childMenusGroup[$topMenu['id']]; + } + + $menuTree[] = $topMenu; + } + + return $menuTree ?? []; + } + + /** + * 根据权限ID获取相应的菜单树 + * + * @param array $permissionIds 权限ID数组 + * @return array + */ + protected function getMenuTreeByPermissions(array $permissionIds): array + { + if ($permissionIds) { + $childMenus = $this->getUserMenus($permissionIds); + + // 构建菜单树 + return $this->_makeMenuTree($childMenus); + } + + // 如果没有权限,返回空数组 + return []; + } + + /** + * 获取菜单列表(树状结构) + * @return \think\response\Json + */ + public function index() + { + if ($this->getAdminInfo('id') == 1) { + $menuTree = $this->getMenuTree(); + } else { + $menuTree = $this->getMenuTreeByPermissions( + $this->getPermissions() + ); + } + + return json([ + 'code' => 200, + 'msg' => '获取成功', + 'data' => $menuTree + ]); + } +} \ No newline at end of file diff --git a/Server/application/superadmin/controller/MenuController.php b/Server/application/superadmin/controller/MenuController.php deleted file mode 100644 index 9aa099de..00000000 --- a/Server/application/superadmin/controller/MenuController.php +++ /dev/null @@ -1,183 +0,0 @@ -request->param('only_enabled', 1); - $useCache = $this->request->param('use_cache', 0); // 由于要根据用户权限过滤,默认不使用缓存 - - // 获取当前登录的管理员信息 - $adminInfo = $this->request->adminInfo; - - // 调用模型获取菜单树 - if ($adminInfo->id == 1) { - // 超级管理员获取所有菜单 - $menuTree = MenuModel::getMenuTree($onlyEnabled, $useCache); - } else { - // 非超级管理员根据权限获取菜单 - $permissionIds = \app\superadmin\model\AdministratorPermissions::getPermissions($adminInfo->id); - $menuTree = MenuModel::getMenuTreeByPermissions($permissionIds, $onlyEnabled); - } - - return json([ - 'code' => 200, - 'msg' => '获取成功', - 'data' => $menuTree - ]); - } - - /** - * 获取所有菜单(平铺结构,便于后台管理) - * @return \think\response\Json - */ - public function getMenuList() - { - // 查询条件 - $where = []; - $status = $this->request->param('status'); - if ($status !== null && $status !== '') { - $where[] = ['status', '=', intval($status)]; - } - - // 获取所有菜单 - $menus = MenuModel::where($where) - ->order('sort', 'asc') - ->select(); - - return json([ - 'code' => 200, - 'msg' => '获取成功', - 'data' => $menus - ]); - } - - /** - * 添加或更新菜单 - * @return \think\response\Json - */ - public function saveMenu() - { - if (!$this->request->isPost()) { - return json(['code' => 405, 'msg' => '请求方法不允许']); - } - - // 获取参数 - $data = $this->request->post(); - - // 验证参数 - $validate = $this->validate($data, [ - 'title|菜单名称' => 'require|max:50', - 'path|路由路径' => 'require|max:100', - 'parent_id|父菜单ID' => 'require|number', - 'status|状态' => 'require|in:0,1', - 'sort|排序' => 'require|number', - ]); - - if ($validate !== true) { - return json(['code' => 400, 'msg' => $validate]); - } - - // 保存菜单 - $result = MenuModel::saveMenu($data); - - if ($result) { - return json(['code' => 200, 'msg' => '保存成功']); - } else { - return json(['code' => 500, 'msg' => '保存失败']); - } - } - - /** - * 删除菜单 - * @param int $id 菜单ID - * @return \think\response\Json - */ - public function deleteMenu($id) - { - if (!$this->request->isDelete()) { - return json(['code' => 405, 'msg' => '请求方法不允许']); - } - - if (empty($id) || !is_numeric($id)) { - return json(['code' => 400, 'msg' => '参数错误']); - } - - $result = MenuModel::deleteMenu($id); - - if ($result) { - return json(['code' => 200, 'msg' => '删除成功']); - } else { - return json(['code' => 500, 'msg' => '删除失败,可能存在子菜单']); - } - } - - /** - * 更新菜单状态 - * @return \think\response\Json - */ - public function updateStatus() - { - if (!$this->request->isPost()) { - return json(['code' => 405, 'msg' => '请求方法不允许']); - } - - $id = $this->request->post('id'); - $status = $this->request->post('status'); - - if (empty($id) || !is_numeric($id) || !in_array($status, [0, 1])) { - return json(['code' => 400, 'msg' => '参数错误']); - } - - $menu = MenuModel::find($id); - if (!$menu) { - return json(['code' => 404, 'msg' => '菜单不存在']); - } - - $menu->status = $status; - $result = $menu->save(); - - // 清除缓存 - MenuModel::clearMenuCache(); - - if ($result) { - return json(['code' => 200, 'msg' => '状态更新成功']); - } else { - return json(['code' => 500, 'msg' => '状态更新失败']); - } - } - - /** - * 获取一级菜单(供权限设置使用) - * @return \think\response\Json - */ - public function getTopLevelMenus() - { - // 获取所有启用的一级菜单 - $menus = \app\superadmin\model\Menu::where([ - ['parent_id', '=', 0], - ['status', '=', 1] - ]) - ->field('id, title') - ->order('sort', 'asc') - ->select(); - - return json([ - 'code' => 200, - 'msg' => '获取成功', - 'data' => $menus - ]); - } -} \ No newline at end of file diff --git a/Server/application/superadmin/model/Administrator.php b/Server/application/superadmin/model/Administrator.php deleted file mode 100644 index 0d1f56eb..00000000 --- a/Server/application/superadmin/model/Administrator.php +++ /dev/null @@ -1,34 +0,0 @@ -find(); - } -} \ No newline at end of file diff --git a/Server/application/superadmin/model/AdministratorPermissions.php b/Server/application/superadmin/model/AdministratorPermissions.php deleted file mode 100644 index 0d0b11fe..00000000 --- a/Server/application/superadmin/model/AdministratorPermissions.php +++ /dev/null @@ -1,36 +0,0 @@ -find(); - - if (!$record || empty($record->permissions)) { - return []; - } - - $permissions = $record->permissions ? json_decode($record->permissions, true) : []; - - if (isset($permissions['ids']) && !empty($permissions['ids'])) { - return is_string($permissions['ids']) ? explode(',', $permissions['ids']) : $permissions['ids']; - } - - return []; - } -} \ No newline at end of file diff --git a/Server/application/superadmin/model/Company.php b/Server/application/superadmin/model/Company.php deleted file mode 100644 index c31a58ef..00000000 --- a/Server/application/superadmin/model/Company.php +++ /dev/null @@ -1,13 +0,0 @@ -order('sort', 'asc') - ->select() - ->toArray(); - - // 组织成树状结构 - $menuTree = self::buildMenuTree($allMenus); - - // 缓存结果 - if ($useCache) { - Cache::set($cacheKey, $menuTree, 3600); // 缓存1小时 - } - - return $menuTree; - } - - public static function getMenusNameByIds($ids) - { - return self::whereIn('id', $ids)->column('title'); - } - - /** - * 构建菜单树 - * @param array $menus 所有菜单 - * @param int $parentId 父菜单ID - * @return array - */ - private static function buildMenuTree($menus, $parentId = 0) - { - $tree = []; - - foreach ($menus as $menu) { - if ($menu['parent_id'] == $parentId) { - $children = self::buildMenuTree($menus, $menu['id']); - if (!empty($children)) { - $menu['children'] = $children; - } - $tree[] = $menu; - } - } - - return $tree; - } - - /** - * 根据权限ID获取相应的菜单树 - * @param array $permissionIds 权限ID数组 - * @param bool $onlyEnabled 是否只获取启用的菜单 - * @return array - */ - public static function getMenuTreeByPermissions($permissionIds, $onlyEnabled = true) - { - // 如果没有权限,返回空数组 - if (empty($permissionIds)) { - return []; - } - - // 查询条件 - $where = []; - if ($onlyEnabled) { - $where[] = ['status', '=', 1]; - } - - // 获取所有一级菜单(用户拥有权限的) - $topMenus = self::where($where) - ->where('parent_id', 0) - ->whereIn('id', $permissionIds) - ->order('sort', 'asc') - ->select() - ->toArray(); - - // 菜单ID集合,用于获取子菜单 - $menuIds = array_column($topMenus, 'id'); - - // 获取所有子菜单 - $childMenus = self::where($where) - ->where('parent_id', 'in', $menuIds) - ->order('sort', 'asc') - ->select() - ->toArray(); - - // 将子菜单按照父ID进行分组 - $childMenusGroup = []; - foreach ($childMenus as $menu) { - $childMenusGroup[$menu['parent_id']][] = $menu; - } - - // 构建菜单树 - $menuTree = []; - foreach ($topMenus as $topMenu) { - // 添加子菜单 - if (isset($childMenusGroup[$topMenu['id']])) { - $topMenu['children'] = $childMenusGroup[$topMenu['id']]; - } - $menuTree[] = $topMenu; - } - - return $menuTree; - } -} \ No newline at end of file diff --git a/Server/application/superadmin/model/Scene.php b/Server/application/superadmin/model/Scene.php deleted file mode 100644 index ff53a5c8..00000000 --- a/Server/application/superadmin/model/Scene.php +++ /dev/null @@ -1,13 +0,0 @@ - 'integer', - 'wechatId' => 'string', - 'createTime' => 'datetime', - 'updateTime' => 'integer' - ]; - - // 定义字段验证规则 - protected $rule = [ - 'wechatId' => 'require|max:64', - 'identifier' => 'require|max:64' - ]; - - // 定义字段验证提示信息 - protected $message = [ - 'wechatId.require' => '微信ID不能为空', - 'wechatId.max' => '微信ID最多不能超过64个字符', - 'identifier.require' => '标识符不能为空', - 'identifier.max' => '标识符最多不能超过64个字符' - ]; -} \ No newline at end of file diff --git a/Server/application/superadmin/model/TrafficSource.php b/Server/application/superadmin/model/TrafficSource.php deleted file mode 100644 index a2b02200..00000000 --- a/Server/application/superadmin/model/TrafficSource.php +++ /dev/null @@ -1,50 +0,0 @@ - 'integer', - 'identifier' => 'string', - 'companyId' => 'integer', - 'createTime' => 'datetime', - 'updateTime' => 'integer' - ]; - - // 定义字段验证规则 - protected $rule = [ - 'identifier' => 'require|max:64', - 'companyId' => 'number', - 'fromd' => 'max:255' - ]; - - // 定义字段验证提示信息 - protected $message = [ - 'identifier.require' => '标识符不能为空', - 'identifier.max' => '标识符最多不能超过64个字符', - 'companyId.number' => '公司ID必须为数字', - 'fromd.max' => '来源最多不能超过255个字符' - ]; -} \ No newline at end of file diff --git a/Server/application/superadmin/model/Users.php b/Server/application/superadmin/model/Users.php deleted file mode 100644 index d0522750..00000000 --- a/Server/application/superadmin/model/Users.php +++ /dev/null @@ -1,13 +0,0 @@ -