mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 22:57:17 +08:00 
			
		
		
		
	feat(system/role): 新增查询角色权限树列表接口(替换角色分配权限的菜单树列表接口)
This commit is contained in:
		| @@ -116,15 +116,15 @@ public class SaTokenConfiguration { | |||||||
|             if (AopUtils.isAopProxy(bean)) { |             if (AopUtils.isAopProxy(bean)) { | ||||||
|                 clazz = AopProxyUtils.ultimateTargetClass(bean); |                 clazz = AopProxyUtils.ultimateTargetClass(bean); | ||||||
|             } |             } | ||||||
|             // 使用 @CrudRequestMapping 的 Controller,如果使用了 @SaIgnore 注解,则表示忽略认证和权限校验 |  | ||||||
|             CrudRequestMapping crudRequestMapping = AnnotationUtils.findAnnotation(clazz, CrudRequestMapping.class); |             CrudRequestMapping crudRequestMapping = AnnotationUtils.findAnnotation(clazz, CrudRequestMapping.class); | ||||||
|             SaIgnore saIgnore = AnnotationUtils.findAnnotation(clazz, SaIgnore.class); |             SaIgnore saIgnore = AnnotationUtils.findAnnotation(clazz, SaIgnore.class); | ||||||
|             if (crudRequestMapping != null) { |             if (crudRequestMapping != null) { | ||||||
|  |                 // 缓存权限前缀 | ||||||
|  |                 CrudApiPermissionPrefixCache.put(clazz, crudRequestMapping.value()); | ||||||
|  |                 // 使用 @CrudRequestMapping 的 Controller,如果使用了 @SaIgnore 注解,则表示忽略认证和权限校验 | ||||||
|                 if (saIgnore != null) { |                 if (saIgnore != null) { | ||||||
|                     return crudRequestMapping.value() + StringConstants.PATH_PATTERN; |                     return crudRequestMapping.value() + StringConstants.PATH_PATTERN; | ||||||
|                 } |                 } | ||||||
|                 // 缓存权限前缀 |  | ||||||
|                 CrudApiPermissionPrefixCache.put(clazz, crudRequestMapping.value()); |  | ||||||
|             } |             } | ||||||
|             return null; |             return null; | ||||||
|         }).filter(Objects::nonNull).toList(); |         }).filter(Objects::nonNull).toList(); | ||||||
|   | |||||||
| @@ -17,17 +17,14 @@ | |||||||
| package top.continew.admin.system.controller; | package top.continew.admin.system.controller; | ||||||
|  |  | ||||||
| import cn.dev33.satoken.annotation.SaCheckPermission; | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
| import cn.hutool.core.lang.tree.Tree; |  | ||||||
| import cn.hutool.core.util.ObjectUtil; | import cn.hutool.core.util.ObjectUtil; | ||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
| import io.swagger.v3.oas.annotations.Operation; | import io.swagger.v3.oas.annotations.Operation; | ||||||
| import io.swagger.v3.oas.annotations.tags.Tag; | import io.swagger.v3.oas.annotations.tags.Tag; | ||||||
| import jakarta.validation.Valid; |  | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
| import org.springframework.web.bind.annotation.DeleteMapping; | import org.springframework.web.bind.annotation.DeleteMapping; | ||||||
| import org.springframework.web.bind.annotation.RestController; | import org.springframework.web.bind.annotation.RestController; | ||||||
| import top.continew.admin.common.base.controller.BaseController; | import top.continew.admin.common.base.controller.BaseController; | ||||||
| import top.continew.admin.common.config.TenantExtensionProperties; |  | ||||||
| import top.continew.admin.common.constant.CacheConstants; | import top.continew.admin.common.constant.CacheConstants; | ||||||
| import top.continew.admin.system.model.query.MenuQuery; | import top.continew.admin.system.model.query.MenuQuery; | ||||||
| import top.continew.admin.system.model.req.MenuReq; | import top.continew.admin.system.model.req.MenuReq; | ||||||
| @@ -40,11 +37,8 @@ import top.continew.starter.core.util.validation.ValidationUtils; | |||||||
| import top.continew.starter.extension.crud.annotation.CrudApi; | import top.continew.starter.extension.crud.annotation.CrudApi; | ||||||
| import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | ||||||
| import top.continew.starter.extension.crud.enums.Api; | import top.continew.starter.extension.crud.enums.Api; | ||||||
| import top.continew.starter.extension.crud.model.query.SortQuery; |  | ||||||
| import top.continew.starter.extension.tenant.context.TenantContextHolder; |  | ||||||
|  |  | ||||||
| import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||||
| import java.util.List; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 菜单管理 API |  * 菜单管理 API | ||||||
| @@ -55,12 +49,10 @@ import java.util.List; | |||||||
| @Tag(name = "菜单管理 API") | @Tag(name = "菜单管理 API") | ||||||
| @RestController | @RestController | ||||||
| @RequiredArgsConstructor | @RequiredArgsConstructor | ||||||
| @CrudRequestMapping(value = "/system/menu", api = {Api.TREE, Api.GET, Api.CREATE, Api.UPDATE, Api.BATCH_DELETE, Api.DICT_TREE}) | @CrudRequestMapping(value = "/system/menu", api = {Api.TREE, Api.GET, Api.CREATE, Api.UPDATE, Api.BATCH_DELETE, | ||||||
|  |     Api.DICT_TREE}) | ||||||
| public class MenuController extends BaseController<MenuService, MenuResp, MenuResp, MenuQuery, MenuReq> { | public class MenuController extends BaseController<MenuService, MenuResp, MenuResp, MenuQuery, MenuReq> { | ||||||
|  |  | ||||||
|     private final MenuService menuService; |  | ||||||
|     private final TenantExtensionProperties tenantExtensionProperties; |  | ||||||
|  |  | ||||||
|     @Operation(summary = "清除缓存", description = "清除缓存") |     @Operation(summary = "清除缓存", description = "清除缓存") | ||||||
|     @SaCheckPermission("system:menu:clearCache") |     @SaCheckPermission("system:menu:clearCache") | ||||||
|     @DeleteMapping("/cache") |     @DeleteMapping("/cache") | ||||||
| @@ -88,14 +80,4 @@ public class MenuController extends BaseController<MenuService, MenuResp, MenuRe | |||||||
|             req.setComponent(StrUtil.removePrefix(req.getComponent(), StringConstants.SLASH)); |             req.setComponent(StrUtil.removePrefix(req.getComponent(), StringConstants.SLASH)); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     @Operation(summary = "查询树列表", description = "查询树列表") |  | ||||||
|     public List<Tree<Long>> tree(@Valid MenuQuery query, @Valid SortQuery sortQuery) { |  | ||||||
|         if (TenantContextHolder.isTenantEnabled() && !tenantExtensionProperties.isDefaultTenant()) { |  | ||||||
|             query.setExcludeMenuIdList(menuService.listExcludeTenantMenu()); |  | ||||||
|         } |  | ||||||
|         return super.tree(query, sortQuery); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,6 +17,8 @@ | |||||||
| package top.continew.admin.system.controller; | package top.continew.admin.system.controller; | ||||||
|  |  | ||||||
| import cn.dev33.satoken.annotation.SaCheckPermission; | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
|  | import cn.hutool.core.bean.BeanUtil; | ||||||
|  | import cn.hutool.core.lang.tree.Tree; | ||||||
| import io.swagger.v3.oas.annotations.Operation; | import io.swagger.v3.oas.annotations.Operation; | ||||||
| import io.swagger.v3.oas.annotations.Parameter; | import io.swagger.v3.oas.annotations.Parameter; | ||||||
| import io.swagger.v3.oas.annotations.enums.ParameterIn; | import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||||||
| @@ -32,8 +34,10 @@ import top.continew.admin.system.model.query.RoleUserQuery; | |||||||
| import top.continew.admin.system.model.req.RoleReq; | import top.continew.admin.system.model.req.RoleReq; | ||||||
| import top.continew.admin.system.model.req.RoleUpdatePermissionReq; | import top.continew.admin.system.model.req.RoleUpdatePermissionReq; | ||||||
| import top.continew.admin.system.model.resp.role.RoleDetailResp; | import top.continew.admin.system.model.resp.role.RoleDetailResp; | ||||||
|  | import top.continew.admin.system.model.resp.role.RolePermissionResp; | ||||||
| import top.continew.admin.system.model.resp.role.RoleResp; | import top.continew.admin.system.model.resp.role.RoleResp; | ||||||
| import top.continew.admin.system.model.resp.role.RoleUserResp; | import top.continew.admin.system.model.resp.role.RoleUserResp; | ||||||
|  | import top.continew.admin.system.service.MenuService; | ||||||
| import top.continew.admin.system.service.RoleService; | import top.continew.admin.system.service.RoleService; | ||||||
| import top.continew.admin.system.service.UserRoleService; | import top.continew.admin.system.service.UserRoleService; | ||||||
| import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | import top.continew.starter.extension.crud.annotation.CrudRequestMapping; | ||||||
| @@ -53,10 +57,20 @@ import java.util.List; | |||||||
| @Validated | @Validated | ||||||
| @RestController | @RestController | ||||||
| @RequiredArgsConstructor | @RequiredArgsConstructor | ||||||
| @CrudRequestMapping(value = "/system/role", api = {Api.LIST, Api.GET, Api.CREATE, Api.UPDATE, Api.BATCH_DELETE, Api.DICT}) | @CrudRequestMapping(value = "/system/role", api = {Api.LIST, Api.GET, Api.CREATE, Api.UPDATE, Api.BATCH_DELETE, | ||||||
|  |     Api.DICT}) | ||||||
| public class RoleController extends BaseController<RoleService, RoleResp, RoleDetailResp, RoleQuery, RoleReq> { | public class RoleController extends BaseController<RoleService, RoleResp, RoleDetailResp, RoleQuery, RoleReq> { | ||||||
|  |  | ||||||
|     private final UserRoleService userRoleService; |     private final UserRoleService userRoleService; | ||||||
|  |     private final MenuService menuService; | ||||||
|  |  | ||||||
|  |     @Operation(summary = "查询角色权限树列表", description = "查询角色权限树列表") | ||||||
|  |     @SaCheckPermission("system:role:updatePermission") | ||||||
|  |     @GetMapping("/permission/tree") | ||||||
|  |     public List<RolePermissionResp> listPermissionTree() { | ||||||
|  |         List<Tree<Long>> treeList = menuService.tree(null, null, false); | ||||||
|  |         return BeanUtil.copyToList(treeList, RolePermissionResp.class); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Operation(summary = "修改权限", description = "修改角色的功能权限") |     @Operation(summary = "修改权限", description = "修改角色的功能权限") | ||||||
|     @SaCheckPermission("system:role:updatePermission") |     @SaCheckPermission("system:role:updatePermission") | ||||||
|   | |||||||
| @@ -0,0 +1,75 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | package top.continew.admin.system.model.resp.role; | ||||||
|  |  | ||||||
|  | import io.swagger.v3.oas.annotations.media.Schema; | ||||||
|  | import lombok.Data; | ||||||
|  | import top.continew.admin.system.enums.MenuTypeEnum; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 角色权限树响应参数 | ||||||
|  |  * | ||||||
|  |  * @author Charles7c | ||||||
|  |  * @since 2025/7/27 10:57 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @Schema(description = "角色权限树响应参数") | ||||||
|  | public class RolePermissionResp implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * ID | ||||||
|  |      */ | ||||||
|  |     @Schema(description = "ID", example = "1") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题 | ||||||
|  |      */ | ||||||
|  |     @Schema(description = "标题", example = "用户管理") | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 上级菜单 ID | ||||||
|  |      */ | ||||||
|  |     @Schema(description = "上级菜单 ID", example = "1000") | ||||||
|  |     private Long parentId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 类型 | ||||||
|  |      */ | ||||||
|  |     @Schema(description = "类型", example = "2") | ||||||
|  |     private MenuTypeEnum type; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 权限标识 | ||||||
|  |      */ | ||||||
|  |     @Schema(description = "权限标识", example = "system:user:list") | ||||||
|  |     private String permission; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 子菜单列表 | ||||||
|  |      */ | ||||||
|  |     @Schema(description = "子菜单") | ||||||
|  |     private List<RolePermissionResp> children; | ||||||
|  | } | ||||||
| @@ -27,6 +27,7 @@ import org.springframework.context.annotation.Lazy; | |||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||||
| import top.continew.admin.common.base.service.BaseServiceImpl; | import top.continew.admin.common.base.service.BaseServiceImpl; | ||||||
|  | import top.continew.admin.common.config.TenantExtensionProperties; | ||||||
| import top.continew.admin.common.constant.CacheConstants; | import top.continew.admin.common.constant.CacheConstants; | ||||||
| import top.continew.admin.common.enums.DisEnableStatusEnum; | import top.continew.admin.common.enums.DisEnableStatusEnum; | ||||||
| import top.continew.admin.common.enums.RoleCodeEnum; | import top.continew.admin.common.enums.RoleCodeEnum; | ||||||
| @@ -44,6 +45,7 @@ import top.continew.starter.core.constant.StringConstants; | |||||||
| import top.continew.starter.core.util.CollUtils; | import top.continew.starter.core.util.CollUtils; | ||||||
| import top.continew.starter.core.util.validation.CheckUtils; | import top.continew.starter.core.util.validation.CheckUtils; | ||||||
| import top.continew.starter.extension.crud.model.query.SortQuery; | import top.continew.starter.extension.crud.model.query.SortQuery; | ||||||
|  | import top.continew.starter.extension.tenant.context.TenantContextHolder; | ||||||
|  |  | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -59,12 +61,17 @@ import java.util.Set; | |||||||
| @RequiredArgsConstructor | @RequiredArgsConstructor | ||||||
| public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuResp, MenuResp, MenuQuery, MenuReq> implements MenuService { | public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuResp, MenuResp, MenuQuery, MenuReq> implements MenuService { | ||||||
|  |  | ||||||
|  |     private final TenantExtensionProperties tenantExtensionProperties; | ||||||
|     @Lazy |     @Lazy | ||||||
|     @Resource |     @Resource | ||||||
|     private RoleService roleService; |     private RoleService roleService; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public List<Tree<Long>> tree(MenuQuery query, SortQuery sortQuery, boolean isSimple) { |     public List<Tree<Long>> tree(MenuQuery query, SortQuery sortQuery, boolean isSimple) { | ||||||
|  |         if (TenantContextHolder.isTenantEnabled() && !tenantExtensionProperties.isDefaultTenant()) { | ||||||
|  |             query = query == null ? new MenuQuery() : query; | ||||||
|  |             query.setExcludeMenuIdList(this.listExcludeTenantMenu()); | ||||||
|  |         } | ||||||
|         return this.tree(query, sortQuery, isSimple, true); |         return this.tree(query, sortQuery, isSimple, true); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user