Browse Source

feature: 关键项:关联授权增加展示客体(功能菜单)信息,角色授权展示角色菜单树

mazq 2 years ago
parent
commit
3dfa47e6dc

+ 0 - 4
dcuc-auth-api/src/main/java/com/dragoninfo/dcuc/auth/auth/facade/IRoleInfoFacade.java

@@ -1,7 +1,6 @@
 package com.dragoninfo.dcuc.auth.auth.facade;
 
 import com.dragoninfo.dcuc.auth.auth.entity.RoleInfo;
-import com.dragoninfo.dcuc.auth.auth.vo.DcucRoleVO;
 import com.dragoninfo.dcuc.auth.auth.vo.RoleAuthParamVo;
 import com.dragoninfo.dcuc.auth.auth.vo.RoleInfoVO;
 import com.dragoninfo.dcuc.auth.auth.vo.RsGridCheckedVO;
@@ -183,9 +182,6 @@ public interface IRoleInfoFacade {
     @PostMapping(value = "staffRoleList")
     List<RoleInfoVO> staffRoleList(@RequestBody SearchDTO searchDTO);
 
-//    @RequestMapping(value = "getDcucRole")
-//    DcucRoleVO getDcucRole();
-
     /**
      * 根据角色代码获取角色信息
      *

+ 9 - 0
dcuc-auth-api/src/main/java/com/dragoninfo/dcuc/auth/power/facade/IAppFunInfoFacade.java

@@ -7,6 +7,7 @@ import com.dragoninfo.dcuc.auth.auth.dto.AppResourcesDto;
 import com.dragoninfo.dcuc.auth.auth.entity.AppFunInfo;
 import com.dragoninfo.dcuc.auth.auth.vo.AppFunInfoVo;
 import com.dragoninfo.dcuc.auth.auth.vo.TreeInfoVO;
+import com.dragoninfo.dcuc.auth.auth.vo.appfun.RespAppFunTreeVo;
 import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
 import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
@@ -206,4 +207,12 @@ public interface IAppFunInfoFacade {
      */
     @PostMapping("apiFuncSearch")
     ResponseDTO<List<AppFunInfoDTO>> apiFuncSearch(@RequestBody SearchDTO searchDTO);
+
+    /**
+     * 获取角色关联的菜单树
+     * @param roleId
+     * @return
+     */
+    @GetMapping(value = "/menuTree")
+    List<RespAppFunTreeVo> getRoleMenuTree(@RequestParam("roleId") String roleId);
 }

+ 68 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/auth/vo/appfun/RespAppFunTreeVo.java

@@ -0,0 +1,68 @@
+package com.dragoninfo.dcuc.auth.auth.vo.appfun;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ *
+ * @author mazq
+ */
+@Data
+@ApiModel("菜单树信息Vo")
+public class RespAppFunTreeVo {
+
+    private static final long serialVersionUID = -7566884439176698458L;
+
+    /**
+     * 代码
+     */
+    @ApiModelProperty("功能id")
+    private String id;
+
+    /**
+     *
+     */
+    @ApiModelProperty("名称")
+    private String name;
+
+    /**
+     * 功能代码
+     */
+    @ApiModelProperty("功能代码")
+    private String code;
+
+    /**
+     * 父节点id
+     */
+    @ApiModelProperty("父节点id")
+    private String parentId;
+
+    /**
+     * URL
+     */
+    @ApiModelProperty("URL")
+    private String url;
+
+    /**
+     * 排序
+     */
+    @ApiModelProperty("排序")
+    private Integer seq;
+
+    /**
+     * 是否是父节点
+     */
+    @ApiModelProperty("是否是父节点")
+    private Boolean isParent;
+
+    /**
+     * 子级列表
+     */
+    @ApiModelProperty("子级列表")
+    private List<RespAppFunTreeVo> children;
+
+}

+ 6 - 1
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/auth/bpo/RoleFunRsRlBPO.java

@@ -72,7 +72,12 @@ public class RoleFunRsRlBPO extends BaseBPO<RoleFunRsRl, String> {
 
     public List<String> getFunIdsByRoleIds(List<String> roleIds) {
         String collect = String.join("','", roleIds);
-        String sql = "SELECT FUN_ID FROM T_ROLE_FUN_RS_RL WHERE ROLE_ID IN ('"+ collect  +"')";
+        String sql = "SELECT FUN_ID FROM T_ROLE_FUN_RS_RL WHERE ROLE_ID IN ('" + collect + "')";
         return PersistentFactory.getJdbcDao().queryForList(sql, String.class);
     }
+
+    public List<String> getFunIdsByRoleId(String roleId) {
+        String sql = "SELECT FUN_ID FROM T_ROLE_FUN_RS_RL WHERE ROLE_ID = ?";
+        return PersistentFactory.getJdbcDao().queryForList(sql, String.class, roleId);
+    }
 }

+ 6 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/auth/facade/AppFunInfoFacade.java

@@ -7,6 +7,7 @@ import com.dragoninfo.dcuc.auth.auth.entity.AppFunInfo;
 import com.dragoninfo.dcuc.auth.auth.service.IAppFunInfoService;
 import com.dragoninfo.dcuc.auth.auth.vo.AppFunInfoVo;
 import com.dragoninfo.dcuc.auth.auth.vo.TreeInfoVO;
+import com.dragoninfo.dcuc.auth.auth.vo.appfun.RespAppFunTreeVo;
 import com.dragoninfo.dcuc.auth.power.facade.IAppFunInfoFacade;
 import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
 import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
@@ -245,6 +246,11 @@ public class AppFunInfoFacade implements IAppFunInfoFacade {
         return iAppFunInfoService.apiFuncSearch(searchDTO);
     }
 
+    @Override
+    public List<RespAppFunTreeVo> getRoleMenuTree(String roleId) {
+        return iAppFunInfoService.getRoleMenuTree(roleId);
+    }
+
 
     /**
      * 找到需要停用的功能

+ 8 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/auth/service/IAppFunInfoService.java

@@ -6,6 +6,7 @@ import com.dragoninfo.dcuc.auth.auth.dto.AppResourcesDto;
 import com.dragoninfo.dcuc.auth.auth.entity.AppFunInfo;
 import com.dragoninfo.dcuc.auth.auth.vo.AppFunInfoVo;
 import com.dragoninfo.dcuc.auth.auth.vo.TreeInfoVO;
+import com.dragoninfo.dcuc.auth.auth.vo.appfun.RespAppFunTreeVo;
 import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
 import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
@@ -188,4 +189,11 @@ public interface IAppFunInfoService {
      * @return
      */
     Long count(Date startTime, Date endTime);
+
+    /**
+     * 获取角色菜单树
+     * @param roleId
+     * @return
+     */
+    List<RespAppFunTreeVo> getRoleMenuTree(String roleId);
 }

+ 12 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/auth/service/IRoleFunRsRlService.java

@@ -21,5 +21,17 @@ public interface IRoleFunRsRlService extends IOldBaseService<RoleFunRsRl,String>
      */
     List<RoleAppFunVO> getFunsByroleIds(String roleIds, String appId);
 
+    /**
+     * 通过角色id集合查询菜单id
+     * @param roleIds
+     * @return
+     */
     List<String> getFunIdsByRoleIds(List<String> roleIds);
+
+    /**
+     * 通过角色id集合查询菜单id
+     * @param roleId
+     * @return
+     */
+    List<String> getFunIdsByRoleId(String roleId);
 }

+ 77 - 7
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/auth/service/impl/AppFunInfoService.java

@@ -1,5 +1,6 @@
 package com.dragoninfo.dcuc.auth.auth.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.dragoninfo.dcuc.app.entity.ApplyInfo;
 import com.dragoninfo.dcuc.app.enumresources.ResourceTypeEnum;
 import com.dragoninfo.dcuc.app.facade.IApplyInfoFacade;
@@ -15,7 +16,9 @@ import com.dragoninfo.dcuc.auth.auth.service.IStaffAssignAuthInfoService;
 import com.dragoninfo.dcuc.auth.auth.vo.AppFunInfoVo;
 import com.dragoninfo.dcuc.auth.auth.vo.AppFunVO;
 import com.dragoninfo.dcuc.auth.auth.vo.TreeInfoVO;
+import com.dragoninfo.dcuc.auth.auth.vo.appfun.RespAppFunTreeVo;
 import com.dragoninfo.dcuc.auth.util.TreeUtil;
+import com.dragoninfo.dcuc.common.utils.DcucBeanUtil;
 import com.dragoninfo.dcuc.duceap.enums.FunUsageScenariosEnum;
 import com.dragoninfo.dcuc.duceap.facade.IDuceapUploadFacade;
 import com.dragoninfo.dcuc.duceap.upload.dto.DocContentDTO;
@@ -58,7 +61,9 @@ import java.util.stream.Collectors;
 @Service
 @Transactional
 public class AppFunInfoService implements IAppFunInfoService {
+
     private Logger logger = LoggerFactory.getLogger(AppFunInfoService.class);
+
     @Autowired
     private AppFunInfoBPO appFunInfoBPO;
 
@@ -511,7 +516,7 @@ public class AppFunInfoService implements IAppFunInfoService {
         }
         List<AppFunInfo> funInfos = getByAppId(appFunInfo.getAppId());
         Set<String> delIds = getDelIds(appFunInfo, funInfos);
-        if(!delIds.isEmpty()) {
+        if (!delIds.isEmpty()) {
             appFunInfoBPO.batchDelete(delIds.toArray(new String[0]));
         }
         return ResponseStatus.success("删除成功");
@@ -524,12 +529,12 @@ public class AppFunInfoService implements IAppFunInfoService {
         upCodes.add(delMenu.getCode());
         //找到所有子节点id
         Map<String, List<AppFunInfo>> collect = allMenus.stream()
-                .filter(e->StringUtils.isNotBlank(e.getParentId()))
+                .filter(e -> StringUtils.isNotBlank(e.getParentId()))
                 .collect(Collectors.groupingBy(AppFunInfo::getParentId));
-        while (upCodes.size()>0) {
+        while (upCodes.size() > 0) {
             for (String upCode : upCodes) {
                 List<AppFunInfo> child = collect.get(upCode);
-                if(CollectionUtils.isNotEmpty(child)) {
+                if (CollectionUtils.isNotEmpty(child)) {
                     Set<String> childSet = child.stream()
                             .map(AppFunInfo::getCode)
                             .collect(Collectors.toSet());
@@ -599,11 +604,11 @@ public class AppFunInfoService implements IAppFunInfoService {
         String userId = ContextUtils.getUserInfo().getId();
 
         List<String> roleIds = staffAssignAuthInfoService.getAllRoleIds(userId);
-        if(CollectionUtils.isEmpty(roleIds)) {
+        if (CollectionUtils.isEmpty(roleIds)) {
             return funAppIdMap;
         }
         List<String> existFunIds = rsRlService.getFunIdsByRoleIds(roleIds);
-        if(CollectionUtils.isEmpty(existFunIds)) {
+        if (CollectionUtils.isEmpty(existFunIds)) {
             return funAppIdMap;
         }
 
@@ -706,6 +711,71 @@ public class AppFunInfoService implements IAppFunInfoService {
         return appFunInfoBPO.count(startTime, endTime);
     }
 
+    @Override
+    public List<RespAppFunTreeVo> getRoleMenuTree(String roleId) {
+        List<AppFunInfo> funInfos = appFunInfoBPO.getByRoleId(roleId);
+        List<RespAppFunTreeVo> list = funInfos.stream()
+                .filter(e -> BooleanEnum.TRUE.value.equals(e.getIsActive()))
+                .map(e -> {
+                    RespAppFunTreeVo vo = new RespAppFunTreeVo();
+                    BeanUtils.copyProperties(e, vo);
+                    return vo;
+                }).collect(Collectors.toList());
+        return constructToTree(list);
+    }
+
+    /**
+     * 组装成树节点
+     *
+     * @param funInfos
+     * @return
+     */
+    private List<RespAppFunTreeVo> constructToTree(List<RespAppFunTreeVo> funInfos) {
+        if (CollectionUtils.isEmpty(funInfos)) {
+            return Collections.emptyList();
+        }
+        //去除pid数据错误问题。由功能菜单保存和修改引起
+        //如果pid在所有code中不存在,将pid设置为null
+        Set<String> allIdSet = funInfos.stream().map(RespAppFunTreeVo::getId).collect(Collectors.toSet());
+        funInfos.stream().filter(e -> {
+            String parentId = e.getParentId();
+            if (null != parentId && !allIdSet.contains(parentId)) {
+                return true;
+            }
+            return false;
+        }).forEach(e -> e.setParentId(null));
+        //将顶级节点和子节点分组
+        Map<Boolean, List<RespAppFunTreeVo>> collect = funInfos.stream()
+                .collect(Collectors.partitioningBy(e -> StrUtil.isBlank(e.getParentId())));
+        //所有顶级节点
+        List<RespAppFunTreeVo> topNode = collect.get(Boolean.TRUE);
+        //所有子节点
+        List<RespAppFunTreeVo> childes = collect.get(Boolean.FALSE);
+
+        //所有分组后的子节点
+        //将子节点按pid再分组
+        //分组后转为RespFuncAuthenApiVo对象
+        Map<String, List<RespAppFunTreeVo>> groupMap = childes.stream()
+                .collect(Collectors.groupingBy(RespAppFunTreeVo::getParentId));
+
+        //组装成树节点
+        Deque<RespAppFunTreeVo> deque = new LinkedList<>(topNode);
+        while (!deque.isEmpty()) {
+            RespAppFunTreeVo first = deque.pollFirst();
+            String pid = first.getId();
+            List<RespAppFunTreeVo> child = groupMap.get(pid);
+            if (CollectionUtils.isEmpty(child)) {
+                first.setChildren(Collections.emptyList());
+                first.setIsParent(false);
+            } else {
+                first.setChildren(child);
+                first.setIsParent(true);
+                deque.addAll(child);
+            }
+        }
+        return topNode;
+    }
+
     /**
      * 获取需要的功能和菜单
      * 尽量不使用递归,整个应用和菜单 栈深度太深
@@ -751,7 +821,7 @@ public class AppFunInfoService implements IAppFunInfoService {
                     if (null == appFunInfo) {
                         continue;
                     }
-                    if(addedCode.contains(code)) {
+                    if (addedCode.contains(code)) {
                         continue;
                     }
                     String pCode = appFunInfo.getParentId();

+ 5 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/auth/service/impl/RoleFunRsRlService.java

@@ -46,4 +46,9 @@ public class RoleFunRsRlService extends BaseService<RoleFunRsRl, String> impleme
         return roleFunRsRlBPO.getFunIdsByRoleIds(roleIds);
     }
 
+    @Override
+    public List<String> getFunIdsByRoleId(String roleId) {
+        return roleFunRsRlBPO.getFunIdsByRoleId(roleId);
+    }
+
 }

+ 0 - 1
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/auth/service/impl/RoleInfoService.java

@@ -20,7 +20,6 @@ import com.dragoninfo.dcuc.auth.auth.service.IRoleInfoService;
 import com.dragoninfo.dcuc.auth.auth.vo.CountVO;
 import com.dragoninfo.dcuc.auth.auth.vo.RoleInfoVO;
 import com.dragoninfo.dcuc.auth.auth.vo.RsGridCheckedVO;
-import com.dragoninfo.dcuc.auth.config.DcucAuthConfig;
 import com.dragoninfo.dcuc.auth.sub.entity.AuthOrgInfo;
 import com.dragoninfo.dcuc.auth.sub.entity.AuthUserInfo;
 import com.dragoninfo.dcuc.auth.sub.service.IAuthOrgInfoService;