From 5a8f290586204b4c5d64556ba211caa9e34d5ee7 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Mon, 30 Mar 2026 20:36:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9D=83=E9=99=90=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E3=80=90=E5=85=A8=E9=83=A8=20=E6=8B=92?= =?UTF-8?q?=E7=BB=9D=20=E5=8F=AA=E8=AF=BB=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- document/db/20260327.sql | 7 + .../back/controller/RoleController.java | 46 ++++- .../controller/AdminRoleControllerTest.java | 6 +- .../ex/BasicRoleMenuRelationMapperExt.java | 16 ++ .../ex/BasicRoleMenuRelationMapperExt.xml | 60 ++++++ .../dashboard/back/dto/role/OptRoleParam.java | 6 +- .../back/dto/role/RoleMenuPermissionDTO.java | 10 + .../back/vo/role/DashboardTreeMenusDTO.java | 32 +++ .../dashboard/back/vo/role/MenuEntity.java | 13 ++ .../dashboard/back/vo/role/MenuTreeVO.java | 14 ++ .../vo/role/RoleMenuPermissionEntity.java | 13 ++ .../dashboard/back/service/RoleService.java | 11 +- .../service/common/DashboardMenuTree.java | 70 +++++++ .../back/service/impl/RoleServiceImpl.java | 186 ++++++++++++++++-- 14 files changed, 462 insertions(+), 28 deletions(-) create mode 100644 document/db/20260327.sql create mode 100644 dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/role/RoleMenuPermissionDTO.java create mode 100644 dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/DashboardTreeMenusDTO.java create mode 100644 dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/MenuEntity.java create mode 100644 dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/MenuTreeVO.java create mode 100644 dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/RoleMenuPermissionEntity.java create mode 100644 dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/DashboardMenuTree.java diff --git a/document/db/20260327.sql b/document/db/20260327.sql new file mode 100644 index 0000000..6e81549 --- /dev/null +++ b/document/db/20260327.sql @@ -0,0 +1,7 @@ +CREATE TABLE basic_role_menu_relation_dashboard ( + role_id BIGINT, + menu_id BIGINT, + permission_type INT COMMENT '0-拒绝 1-只读 2-全部', + creator_id BIGINT, + create_time BIGINT +); \ No newline at end of file diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/RoleController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/RoleController.java index f71b0d6..b0a348e 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/RoleController.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/RoleController.java @@ -11,10 +11,15 @@ import com.dongjian.dashboard.back.configurator.interceptor.AccessRequired; import com.dongjian.dashboard.back.dto.role.DeleteRoleParam; import com.dongjian.dashboard.back.dto.role.OptRoleParam; import com.dongjian.dashboard.back.dto.role.PageSearchParam; +import com.dongjian.dashboard.back.dto.role.RoleMenuPermissionDTO; import com.dongjian.dashboard.back.vo.TreeMenusDTO; +import com.dongjian.dashboard.back.vo.role.DashboardTreeMenusDTO; +import com.dongjian.dashboard.back.vo.role.MenuTreeVO; +import com.dongjian.dashboard.back.vo.role.RoleMenuPermissionEntity; import com.dongjian.dashboard.back.vo.role.RolePageDTO; import com.dongjian.dashboard.back.service.RoleService; +import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; @@ -110,7 +115,8 @@ public class RoleController { } return pageResponse; } - + + @Hidden @Operation(summary = "获取当前登录用户拥有的权限菜单树") @RequestMapping(value = "/getOwnMenuIds",method = RequestMethod.GET) public SimpleDataResponse> getOwnMenuIds( @@ -121,7 +127,8 @@ public class RoleController { @Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType){ return roleService.getOwnMenuIds(CompanyId, UserId, LanguageType); } - + + @Hidden @Operation(summary = "获取对应角色拥有的权限菜单ID") @RequestMapping(value = "/getMenuIdsByRoleId",method = RequestMethod.GET) public SimpleDataResponse getMenuIdsByRoleId( @@ -133,5 +140,40 @@ public class RoleController { @Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType){ return roleService.getMenuIdsByRoleId(roleId, CompanyId, UserId, LanguageType); } + + /** + * 获取菜单树 + 权限 + */ + @GetMapping("/getOwnMenuTree") + public SimpleDataResponse> getTree( + @Parameter(name = "LoginName", description = "Login name", required = true, schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName, + @Parameter(name = "AccessToken", description = "Authentication token", required = true) @RequestHeader(required=true) String AccessToken, + @Parameter(name = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId, + @Parameter(name = "CompanyId", description = "ID of the company to which the user belongs", required = false, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long CompanyId, + @Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType){ + return roleService.getOwnMenuTree(CompanyId, UserId, LanguageType); + } + + @Operation(summary = "获取对应角色拥有的权限菜单ID") + @RequestMapping(value = "/getMenuIdListByRoleId",method = RequestMethod.GET) + public SimpleDataResponse> getMenuIdListByRoleId( + @Parameter(name="roleId",description="角色ID",required=true, schema = @Schema(defaultValue = "28")) @RequestParam Long roleId, + @Parameter(name = "LoginName", description = "Login name", required = true, schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName, + @Parameter(name = "AccessToken", description = "Authentication token", required = true) @RequestHeader(required=true) String AccessToken, + @Parameter(name = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId, + @Parameter(name = "CompanyId", description = "ID of the company to which the user belongs", required = false, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long CompanyId, + @Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType){ + return roleService.getMenuIdListByRoleId(roleId, CompanyId, UserId, LanguageType); + } + + /** + * 保存权限 + */ + @Hidden + @PostMapping("/save") + public void save(@RequestParam Long roleId, + @RequestBody List list) { + roleService.saveRolePermission(roleId, list); + } } diff --git a/dongjian-dashboard-back-controller/src/test/java/com/dongjian/dashboard/back/controller/AdminRoleControllerTest.java b/dongjian-dashboard-back-controller/src/test/java/com/dongjian/dashboard/back/controller/AdminRoleControllerTest.java index 30fb884..45c837f 100644 --- a/dongjian-dashboard-back-controller/src/test/java/com/dongjian/dashboard/back/controller/AdminRoleControllerTest.java +++ b/dongjian-dashboard-back-controller/src/test/java/com/dongjian/dashboard/back/controller/AdminRoleControllerTest.java @@ -30,6 +30,8 @@ import org.springframework.web.context.WebApplicationContext; import jakarta.annotation.Resource; +import java.util.ArrayList; + @RunWith(SpringRunner.class) @SpringBootTest @@ -134,7 +136,7 @@ public class AdminRoleControllerTest { OptRoleParam param = new OptRoleParam(); param.setRoleName(ROLE_NAME); param.setDescription("Description"); - param.setMenuIds("1,2"); + param.setMenuIds(new ArrayList<>()); return param; } @@ -204,7 +206,7 @@ public class AdminRoleControllerTest { param.setRoleId(getMockDataId()); param.setRoleName(ROLE_NAME); param.setDescription("Description-edit"); - param.setMenuIds("1,2,3"); + param.setMenuIds(new ArrayList<>()); String content = (new ObjectMapper()).writeValueAsString(param); System.out.println("testEdit params:"+content); diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/BasicRoleMenuRelationMapperExt.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/BasicRoleMenuRelationMapperExt.java index 25e9deb..ab55bff 100644 --- a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/BasicRoleMenuRelationMapperExt.java +++ b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/BasicRoleMenuRelationMapperExt.java @@ -1,10 +1,14 @@ package com.dongjian.dashboard.back.dao.ex; +import java.util.List; import java.util.Map; +import com.dongjian.dashboard.back.vo.role.DashboardTreeMenusDTO; +import com.dongjian.dashboard.back.vo.role.RoleMenuPermissionEntity; import org.apache.ibatis.annotations.Mapper; import com.dongjian.dashboard.back.dao.auto.BasicRoleMenuRelationMapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface BasicRoleMenuRelationMapperExt extends BasicRoleMenuRelationMapper { @@ -14,4 +18,16 @@ public interface BasicRoleMenuRelationMapperExt extends BasicRoleMenuRelationMap String getMenuIdsByRoleId(Long roleId); void deleteDashboardRelation(Map deleteMap); + + List selectAllMenu(Map allMenusParamMap); + + List selectByRoleId(@Param("roleId") Long roleId); + + int deleteByRoleId(@Param("roleId") Long roleId); + + int dashboardBatchInsert(@Param("list") List list); + + Long getRoleIdByUserId(@Param("userId") Long userId); + + List getMenuIdListByRoleId(Long roleId); } diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/BasicRoleMenuRelationMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/BasicRoleMenuRelationMapperExt.xml index 43b47c3..086d184 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/BasicRoleMenuRelationMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/BasicRoleMenuRelationMapperExt.xml @@ -30,5 +30,65 @@ r.role_id = #{roleId} AND m.used_by_dashboard = 1 + + + + + + DELETE FROM basic_role_menu_relation_dashboard + WHERE role_id = #{roleId} + + + + INSERT INTO basic_role_menu_relation_dashboard (role_id, menu_id, permission_type, create_time) + VALUES + + (#{item.roleId}, + #{item.menuId}, + #{item.permissionType}, + #{item.createTime}) + + + + + + \ No newline at end of file diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/role/OptRoleParam.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/role/OptRoleParam.java index c875296..33f144a 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/role/OptRoleParam.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/role/OptRoleParam.java @@ -4,6 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; +import java.util.List; + /** * @author zhc * @time 2022年6月14日10:56:38 @@ -22,8 +24,8 @@ public class OptRoleParam { @Schema(description = "描述",example = "这是管理员描述", required = true) private String description; - @Schema(description = "菜单权限ID,使用逗号连接",example = "1,4,5,6", required = true) - private String menuIds; + @Schema(description = "菜单权限ID,使用逗号连接",example = "[]", required = true) + private List menuIds; @Schema(description = "所属企业ID",example = "2", hidden = true) private Long companyId; diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/role/RoleMenuPermissionDTO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/role/RoleMenuPermissionDTO.java new file mode 100644 index 0000000..2e7d76b --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/role/RoleMenuPermissionDTO.java @@ -0,0 +1,10 @@ +package com.dongjian.dashboard.back.dto.role; + +import lombok.Data; + +@Data +public class RoleMenuPermissionDTO { + + private Long menuId; + private Integer permissionType; +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/DashboardTreeMenusDTO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/DashboardTreeMenusDTO.java new file mode 100644 index 0000000..f2e7909 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/DashboardTreeMenusDTO.java @@ -0,0 +1,32 @@ +package com.dongjian.dashboard.back.vo.role; + +import com.dongjian.dashboard.back.vo.TreeMenusDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** +* @author Mr.Jiang +* @time 2022年7月29日 下午4:37:50 +*/ +@Data +public class DashboardTreeMenusDTO { + + @Schema(description = "节点ID",example = "11", required = true) + private Long menuId; + + @Schema(description = "父节点ID",example = "2", hidden = true) + private Long parentMenuId; + + @Schema(description = "节点名称",example = "添加", required = true) + private String title; + + @Schema(description = "子节点",example = "[]", required = false) + private List children; + + private Integer permissionType; // 0-拒绝 1-只读 2-全部 null=半选 + + private Integer dashboardLowestNode; // 0-否 1-是 + +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/MenuEntity.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/MenuEntity.java new file mode 100644 index 0000000..35794c2 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/MenuEntity.java @@ -0,0 +1,13 @@ +package com.dongjian.dashboard.back.vo.role; + +import lombok.Data; + +@Data +public class MenuEntity { + + private Long id; + private Long parentMenuId; + private String menuName; + private Integer menuLevel; + private Integer flag; +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/MenuTreeVO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/MenuTreeVO.java new file mode 100644 index 0000000..b73717c --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/MenuTreeVO.java @@ -0,0 +1,14 @@ +package com.dongjian.dashboard.back.vo.role; + +import lombok.Data; + +import java.util.List; + +@Data +public class MenuTreeVO { + + private Long id; + private String name; + private Integer permissionType; + private List children; +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/RoleMenuPermissionEntity.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/RoleMenuPermissionEntity.java new file mode 100644 index 0000000..96da09d --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/role/RoleMenuPermissionEntity.java @@ -0,0 +1,13 @@ +package com.dongjian.dashboard.back.vo.role; + +import lombok.Data; + +@Data +public class RoleMenuPermissionEntity { + + + private Long roleId; + private Long menuId; + private Integer permissionType; + private Long createTime; +} diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/RoleService.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/RoleService.java index 8b8b468..7e455fd 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/RoleService.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/RoleService.java @@ -6,7 +6,11 @@ import com.dongjian.dashboard.back.common.response.PageInfo; import com.dongjian.dashboard.back.common.response.SimpleDataResponse; import com.dongjian.dashboard.back.dto.role.DeleteRoleParam; import com.dongjian.dashboard.back.dto.role.OptRoleParam; +import com.dongjian.dashboard.back.dto.role.RoleMenuPermissionDTO; import com.dongjian.dashboard.back.vo.TreeMenusDTO; +import com.dongjian.dashboard.back.vo.role.DashboardTreeMenusDTO; +import com.dongjian.dashboard.back.vo.role.MenuTreeVO; +import com.dongjian.dashboard.back.vo.role.RoleMenuPermissionEntity; import com.dongjian.dashboard.back.vo.role.RolePageDTO; /** @@ -26,6 +30,11 @@ public interface RoleService { PageInfo getListPage(com.dongjian.dashboard.back.dto.role.PageSearchParam pageSearchParam, Long companyId, Long userId, Integer languageType); - + + SimpleDataResponse> getOwnMenuTree(Long companyId, Long userId, Integer languageType); + + void saveRolePermission(Long roleId, List list); + + SimpleDataResponse> getMenuIdListByRoleId(Long roleId, Long companyId, Long userId, Integer languageType); } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/DashboardMenuTree.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/DashboardMenuTree.java new file mode 100644 index 0000000..872f093 --- /dev/null +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/DashboardMenuTree.java @@ -0,0 +1,70 @@ +package com.dongjian.dashboard.back.service.common; + +import com.dongjian.dashboard.back.vo.role.DashboardTreeMenusDTO; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class DashboardMenuTree { + + private List menuList = new ArrayList<>(); + + public DashboardMenuTree(List menuList) { + this.menuList = menuList; + } + + /** + * 构建树 + */ + public List buildTree(String rootNodeKey) { + List treeMenus = new ArrayList<>(); + + for (DashboardTreeMenusDTO node : getRootNode(rootNodeKey)) { + treeMenus.add(buildChildTree(node)); + } + + return treeMenus; + } + + /** + * 构建子树(核心修改点) + */ + private DashboardTreeMenusDTO buildChildTree(DashboardTreeMenusDTO parent) { + + // 如果是最小节点 → 直接终止 + if (parent.getDashboardLowestNode() != null + && parent.getDashboardLowestNode() == 1) { + + parent.setChildren(new ArrayList<>()); + return parent; + } + + List children = new ArrayList<>(); + + for (DashboardTreeMenusDTO node : menuList) { + if (node.getParentMenuId().equals(parent.getMenuId())) { + children.add(buildChildTree(node)); + } + } + + parent.setChildren(children); + return parent; + } + + /** + * 获取根节点 + */ + private List getRootNode(String rootNodeKey) { + + List roots = new ArrayList<>(); + + for (DashboardTreeMenusDTO node : menuList) { + if (Objects.equals(String.valueOf(node.getParentMenuId()), rootNodeKey)) { + roots.add(node); + } + } + + return roots; + } +} \ No newline at end of file diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/RoleServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/RoleServiceImpl.java index 5604ee4..1099aa9 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/RoleServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/RoleServiceImpl.java @@ -1,5 +1,8 @@ package com.dongjian.dashboard.back.service.impl; +import com.dongjian.dashboard.back.dto.role.RoleMenuPermissionDTO; +import com.dongjian.dashboard.back.service.common.DashboardMenuTree; +import com.dongjian.dashboard.back.vo.role.*; import com.github.pagehelper.PageHelper; import com.dongjian.dashboard.back.common.exception.MsgCodeException; import com.dongjian.dashboard.back.common.language.msg.MsgLanguageChange; @@ -19,7 +22,6 @@ import com.dongjian.dashboard.back.service.common.CommonOpt; import com.dongjian.dashboard.back.service.common.MenuTree; import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.TreeMenusDTO; -import com.dongjian.dashboard.back.vo.role.RolePageDTO; import java.util.*; import java.util.stream.Collectors; @@ -94,26 +96,23 @@ public class RoleServiceImpl implements RoleService { - private void insertRoleMenuRelation(Long companyId, Long userId, long currentUnix, Long roleId, String menuIds) { - if (StringUtils.isNoneBlank(menuIds)) { - //把无效的id去掉 - menuIds = filterMenuIds(companyId, userId, menuIds); - if (StringUtils.isBlank(menuIds)) { - return; - } - //先删除原有的角色ID - Map deleteMap = new HashMap<>(); - deleteMap.put("roleId", roleId); - basicRoleMenuRelationMapperExt.deleteDashboardRelation(deleteMap); - //重新插入关联关系 - List idList = Arrays.asList(menuIds.split(",")).stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList()); - Map paramMap = new HashMap(); - paramMap.put("roleId", roleId); - paramMap.put("menuIds", idList); - paramMap.put("creatorId", userId); - paramMap.put("createTime", currentUnix); - basicRoleMenuRelationMapperExt.batchInsert(paramMap); + private void insertRoleMenuRelation(Long companyId, Long userId, long currentUnix, Long roleId, List menuIds) { + basicRoleMenuRelationMapperExt.deleteByRoleId(roleId); + + if (menuIds == null || menuIds.isEmpty()) { + return; } + + List entities = menuIds.stream().map(item -> { + RoleMenuPermissionEntity entity = new RoleMenuPermissionEntity(); + entity.setRoleId(roleId); + entity.setMenuId(item.getMenuId()); + entity.setPermissionType(item.getPermissionType()); + entity.setCreateTime(currentUnix); + return entity; + }).collect(Collectors.toList()); + + basicRoleMenuRelationMapperExt.dashboardBatchInsert(entities); } @@ -143,7 +142,7 @@ public class RoleServiceImpl implements RoleService { if(StringUtils.isBlank(param.getRoleName()) || param.getRoleName().length() > 100){ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Parameter [roleName] error"); } - if(StringUtils.isBlank(param.getMenuIds())){ + if(CollectionUtils.isEmpty(param.getMenuIds())){ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "menuIds can not be null"); } return SimpleDataResponse.success(); @@ -315,4 +314,149 @@ public class RoleServiceImpl implements RoleService { return new PageInfo<>(resultList); } + @Override + public SimpleDataResponse> getOwnMenuTree(Long companyId, Long userId, Integer languageType) { + + // 1查询用户信息 + BasicUser basicUser = basicUserMapperExt.selectByPrimaryKey(userId); + int superRole = basicUser.getSuperRole() == null ? 0 : basicUser.getSuperRole(); + + // 获取角色权限(非超级管理员) + Map permissionMap = new HashMap<>(); + if (superRole != 1) { + Long roleId = basicRoleMenuRelationMapperExt.getRoleIdByUserId(userId); + List permissions = basicRoleMenuRelationMapperExt.selectByRoleId(roleId); + permissionMap = permissions.stream() + .collect(Collectors.toMap( + RoleMenuPermissionEntity::getMenuId, + RoleMenuPermissionEntity::getPermissionType + )); + } + + // 查询全量菜单 + List allMenus = basicRoleMenuRelationMapperExt.selectAllMenu(Collections.emptyMap()); + Map fullMenuMap = allMenus.stream() + .collect(Collectors.toMap(DashboardTreeMenusDTO::getMenuId, m -> m)); + + // 获取用户可见菜单(叶子或有权限的节点) + List visibleMenus; + if (superRole == 1) { + // 超级管理员可见所有 + visibleMenus = new ArrayList<>(allMenus); + } else { + Long roleId = basicRoleMenuRelationMapperExt.getRoleIdByUserId(userId); + Map paramMap = new HashMap<>(); + paramMap.put("superRole", superRole); + paramMap.put("roleId", roleId); + visibleMenus = basicRoleMenuRelationMapperExt.selectAllMenu(paramMap); + } + + // 补全父节点 + visibleMenus = fillMissingParents(visibleMenus, fullMenuMap); + + // 构建树 + DashboardMenuTree tree = new DashboardMenuTree(visibleMenus); + List result = tree.buildTree("-1"); + + // 叶子权限赋值 + fillLeafPermission(result, permissionMap, superRole); + + // 父节点统一赋值=2 + fillParentPermission(result); + + return SimpleDataResponse.success(result); + } + + /** + * 补全父节点(一次传入全量菜单 map) + */ + private List fillMissingParents(List menuList, + Map fullMenuMap) { + + Set allIds = menuList.stream().map(DashboardTreeMenusDTO::getMenuId).collect(Collectors.toSet()); + Set missingParentIds = new HashSet<>(); + + for (DashboardTreeMenusDTO menu : menuList) { + Long pid = menu.getParentMenuId(); + while (pid != null && !Objects.equals(pid, -1L) && !allIds.contains(pid)) { + missingParentIds.add(pid); + DashboardTreeMenusDTO parentMenu = fullMenuMap.get(pid); + if (parentMenu == null) break; // 防止死循环 + pid = parentMenu.getParentMenuId(); + } + } + + for (Long pid : missingParentIds) { + DashboardTreeMenusDTO parentMenu = fullMenuMap.get(pid); + if (parentMenu != null) { + menuList.add(parentMenu); + } + } + + return menuList; + } + + /** + * 叶子赋权 + */ + private void fillLeafPermission(List nodes, + Map permissionMap, Integer superRole) { + for (DashboardTreeMenusDTO node : nodes) { + if (node.getDashboardLowestNode() != null && node.getDashboardLowestNode() == 1) { + if (superRole == 1) { + node.setPermissionType(2); + } else { + node.setPermissionType(permissionMap.getOrDefault(node.getMenuId(), 0)); + } + } + if (node.getChildren() != null && !node.getChildren().isEmpty()) { + fillLeafPermission(node.getChildren(), permissionMap, superRole); + } + } + } + + /** + * 父节点权限统一赋值 2 + */ + private void fillParentPermission(List nodes) { + for (DashboardTreeMenusDTO node : nodes) { + if (node.getChildren() != null && !node.getChildren().isEmpty()) { + fillParentPermission(node.getChildren()); + node.setPermissionType(2); + } + } + } + + @Override + @Transactional + public void saveRolePermission(Long roleId, List list) { + + basicRoleMenuRelationMapperExt.deleteByRoleId(roleId); + + if (list == null || list.isEmpty()) { + return; + } + + List entities = list.stream().map(item -> { + RoleMenuPermissionEntity entity = new RoleMenuPermissionEntity(); + entity.setRoleId(roleId); + entity.setMenuId(item.getMenuId()); + entity.setPermissionType(item.getPermissionType()); + entity.setCreateTime(System.currentTimeMillis()); + return entity; + }).collect(Collectors.toList()); + + basicRoleMenuRelationMapperExt.dashboardBatchInsert(entities); + } + + @Override + public SimpleDataResponse> getMenuIdListByRoleId(Long roleId, Long companyId, Long userId, Integer languageType) { + try { + return SimpleDataResponse.success(basicRoleMenuRelationMapperExt.getMenuIdListByRoleId(roleId)); + } catch (Exception e) { + logger.error("获取角色菜单出错", e); + return new SimpleDataResponse(ResponseCode.SERVER_ERROR, e.getMessage()); + } + } + }