Browse Source

权限回显

shiqian 4 năm trước cách đây
mục cha
commit
2e24f4018d

+ 15 - 0
boman-api/boman-api-system/src/main/java/com/boman/system/api/domain/SysMenu.java

@@ -75,6 +75,21 @@ public class SysMenu extends BaseEntity
      */
     private String sysTableName;
 
+    /**
+     * true 此表中有此菜单并且选中
+     * false 此表中有此菜单,但是未选择
+     * 0 此表中无此菜单
+     */
+    private List<Object> containsHead;
+
+    public List<Object> getContainsHead() {
+        return containsHead;
+    }
+
+    public void setContainsHead(List<Object> containsHead) {
+        this.containsHead = containsHead;
+    }
+
     public String getSysTableName() {
         return sysTableName;
     }

+ 52 - 2
boman-api/boman-domain/src/main/java/com.boman.domain/RoleEnum.java

@@ -1,22 +1,33 @@
 package com.boman.domain;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
 /**
  * @author tjf
  * @Date: 2021/04/22/15:16
  */
 public enum RoleEnum {
 
+    /** 新增 */
     A("A","新增"),
+    /** 修改 */
     M("M","修改"),
+    /** 删除 */
     D("D","删除"),
+    /** 查询 */
     Q("Q","查询"),
+    /** 提交 */
     S("S","提交"),
+    /** 反提交 */
     U("U","反提交"),
+    /** 导入 */
     I("I","导入"),
+    /** 导出 */
     E("E","导出");
 
-    private String role;
-    private String name;
+    private final String role;
+    private final String name;
 
     RoleEnum(String role, String name) {
         this.role = role;
@@ -46,4 +57,43 @@ public enum RoleEnum {
         }
         return null;
     }
+
+    /**
+     * 功能描述: 拿到所有的名称 eg: 新增、修改.....
+     *
+     * @param
+     * @return java.util.List<java.lang.String>
+     */
+    public static List<String> names(){
+        RoleEnum[] values = RoleEnum.values();
+        return Arrays.stream(values).map(RoleEnum::getName).collect(Collectors.toList());
+    }
+
+    /**
+     * 功能描述: 拿到所有的roles, 顺序很重要
+     * eg: A、M.....
+     *
+     * @return java.util.List<java.lang.String>
+     */
+    public static List<String> roles(){
+        RoleEnum[] values = RoleEnum.values();
+        return Arrays.stream(values).map(RoleEnum::getRole).collect(Collectors.toList());
+    }
+
+    /**
+     * 功能描述: 拿到所有的roles eg: A、M.....
+     *
+     * @return java.util.List<java.lang.String>
+     */
+    public static List<Map<String, String>> all() {
+        RoleEnum[] values = RoleEnum.values();
+        List<Map<String, String>> result = new ArrayList<>(values.length);
+        for (RoleEnum value : values) {
+            Map<String, String> map = new HashMap<>(2);
+            map.put("name", value.name);
+            map.put("role", value.role);
+            result.add(map);
+        }
+        return result;
+    }
 }

+ 3 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/constant/FormDataConstant.java

@@ -186,4 +186,7 @@ public class FormDataConstant {
     public static final String BLUR = "blur";
     public static final String REQUIRED = "required";
 
+    /** 冒号 */
+    public static final String COLON = ":";
+
 }

+ 18 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/constant/GlobalBtn.java

@@ -0,0 +1,18 @@
+package com.boman.domain.constant;
+
+/**
+ * @author shiqian
+ * @date 2021年05月06日 15:28
+ **/
+public class GlobalBtn {
+
+    public static final String A = "A";
+    public static final String M = "M";
+    public static final String D = "D";
+    public static final String Q = "Q";
+    public static final String S = "S";
+    public static final String U = "U";
+    public static final String I = "I";
+    public static final String E = "E";
+
+}

+ 13 - 0
boman-api/boman-domain/src/main/java/com.boman.domain/constant/TableNameConst.java

@@ -0,0 +1,13 @@
+package com.boman.domain.constant;
+
+/**
+ * @author shiqian
+ * @date 2021年05月06日 09:21
+ **/
+public class TableNameConst {
+
+
+    public static final String ID = "id";
+
+    public static final String SYS_ROLE_MENU = "sys_role_menu";
+}

+ 16 - 0
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysMenuController.java

@@ -100,10 +100,26 @@ public class SysMenuController extends BaseController
         return ajax;
     }
 
+    /**
+     * 功能描述: 根据菜单id,找到此菜单以及子菜单下所有的叶子节点
+     *
+     * @param menuId menuId
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
     @GetMapping(value = "/allLeafNodeById/{menuId}")
     public AjaxResult allLeafNodeById(@PathVariable("menuId") Long menuId) {
         return AjaxResult.success(menuService.allLeafNodeById(menuId));
     }
+    /**
+     * 功能描述: 根据菜单id,找到此菜单以及子菜单下所有的叶子节点, 同时匹配叶子结点对应的头部的规则
+     *
+     * @param menuId menuId
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    @GetMapping(value = "/listMenus/{menuId}")
+    public AjaxResult listMenus(@PathVariable("menuId") Long menuId) {
+        return AjaxResult.success(menuService.listMenus(menuId));
+    }
 
     /**
      * 新增菜单

+ 7 - 0
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysRoleMenuController.java

@@ -25,6 +25,13 @@ public class SysRoleMenuController {
 
     @Resource
     private ISysRoleMenuService service;
+
+    /**
+     * 功能描述: 批量保存roleMenu
+     *
+     * @param roleMenuList roleMenuList
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
     @PostMapping
     public AjaxResult list(@RequestBody List<SysRoleMenu> roleMenuList) {
         return AjaxResult.success(service.saveList(roleMenuList));

+ 4 - 2
boman-modules/boman-system/src/main/java/com/boman/system/service/ISysMenuService.java

@@ -1,6 +1,7 @@
 package com.boman.system.service;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 
@@ -52,10 +53,10 @@ public interface ISysMenuService
     public List<SysMenu> selectMenuTreeById(Long id);
 
     /**
-     * 根据用户ID查询菜单树信息
+     * 功能描述: 根据菜单id,找到此菜单以及子菜单下所有的叶子节点
      *
      * @param menuId menuId
-     * @return 菜单列表
+     * @return java.util.List<com.boman.system.api.domain.SysMenu>
      */
     List<SysMenu> allLeafNodeById(Long menuId);
 
@@ -164,4 +165,5 @@ public interface ISysMenuService
      */
     public String checkMenuNameUnique(SysMenu menu);
 
+    Map<String, Object> listMenus(Long menuId);
 }

+ 119 - 18
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysMenuServiceImpl.java

@@ -3,10 +3,15 @@ package com.boman.system.service.impl;
 import java.util.*;
 import java.util.stream.Collectors;
 
-import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.common.core.web.domain.AjaxResult;
+import com.boman.common.redis.RedisKey;
+import com.boman.common.redis.service.RedisService;
+import com.boman.domain.GenTable;
+import com.boman.domain.RoleEnum;
+import com.boman.domain.constant.GlobalBtn;
 import com.boman.system.api.domain.SysMenu;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.boman.common.core.constant.UserConstants;
@@ -22,6 +27,11 @@ import com.boman.system.mapper.SysRoleMapper;
 import com.boman.system.mapper.SysRoleMenuMapper;
 import com.boman.system.service.ISysMenuService;
 
+import javax.annotation.Resource;
+
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
+import static com.boman.domain.constant.FormDataConstant.COLON;
+
 /**
  * 菜单 业务层处理
  *
@@ -39,6 +49,8 @@ public class SysMenuServiceImpl implements ISysMenuService {
 
     @Autowired
     private SysRoleMenuMapper roleMenuMapper;
+    @Resource
+    private RedisService redisService;
 
     /**
      * 根据用户查询系统菜单列表
@@ -111,37 +123,38 @@ public class SysMenuServiceImpl implements ISysMenuService {
     }
 
     /**
-     * 根据用户ID查询菜单树信息
+     * 功能描述: 根据菜单id,找到此菜单以及子菜单下所有的叶子节点
      *
      * @param menuId menuId
-     * @return 菜单列表
+     * @return java.util.List<com.boman.system.api.domain.SysMenu>
      */
     @Override
     public List<SysMenu> allLeafNodeById(Long menuId) {
-        List<SysMenu> tempList = Lists.newArrayListWithCapacity(16);
         SysMenu menu = selectMenuById(menuId);
         List<SysMenu> menus = menuMapper.selectMenuList(new SysMenu());
-        List<SysMenu> sysMenus = recursionList(menus, menu, tempList);
-        return ObjectUtils.filter(sysMenus, menu1 -> SysMenu.BUTTON.equals(menu1.getMenuType()));
+        List<SysMenu> tempList = Lists.newArrayListWithCapacity(16);
+        recursionList(menus, menu, tempList);
+        // 把父亲去掉
+        if (tempList.size() > 1) {
+            tempList.remove(0);
+        }
+
+        return tempList;
     }
 
-    private List<SysMenu> recursionList(List<SysMenu> menus, SysMenu menu, List<SysMenu> tempList) {
-        int child = 0;
+    private void recursionList(List<SysMenu> menus, SysMenu menu, List<SysMenu> tempList) {
         // 得到子节点列表
         List<SysMenu> childList = getChildList(menus, menu);
+        if (isEmpty(childList)) {
+            return;
+        }
+
+        tempList.add(menu);
         for (SysMenu tChild : childList) {
             if (hasChild(menus, tChild)) {
                 recursionList(menus, tChild, tempList);
-            } else {
-                child++;
             }
         }
-
-        if (child == childList.size() && childList.size() != 0) {
-            tempList.addAll(childList);
-        }
-
-        return tempList;
     }
 
     /**
@@ -207,7 +220,7 @@ public class SysMenuServiceImpl implements ISysMenuService {
     @Override
     public List<SysMenu> buildMenuTree(List<SysMenu> menus) {
         List<SysMenu> returnList = new ArrayList<>();
-        List<Long> allMenuId = ObjectUtils.map(menus, SysMenu::getId);
+        List<Long> allMenuId = map(menus, SysMenu::getId);
         for (SysMenu menu : menus) {
             // 如果是顶级节点, 遍历该父节点的所有子节点
             if (!allMenuId.contains(menu.getParentId())) {
@@ -228,7 +241,7 @@ public class SysMenuServiceImpl implements ISysMenuService {
     @Override
     public List<SysMenu> buildMenuTreeNotAddLeafNode(List<SysMenu> menus) {
         List<SysMenu> returnList = new ArrayList<>();
-        List<Long> allMenuId = ObjectUtils.map(menus, SysMenu::getId);
+        List<Long> allMenuId = map(menus, SysMenu::getId);
         for (SysMenu menu : menus) {
             // 如果是顶级节点, 遍历该父节点的所有子节点
             if (!allMenuId.contains(menu.getParentId())) {
@@ -517,4 +530,92 @@ public class SysMenuServiceImpl implements ISysMenuService {
     private boolean hasChild(List<SysMenu> list, SysMenu t) {
         return getChildList(list, t).size() > 0;
     }
+
+    @Override
+    public Map<String, Object> listMenus(Long menuId) {
+        SysMenu menu = selectMenuById(menuId);
+        List<SysMenu> menus = menuMapper.selectMenuList(new SysMenu());
+        List<SysMenu> tempList = Lists.newArrayListWithCapacity(16);
+        recursionList(menus, menu, tempList);
+        // 把父亲去掉
+        if (tempList.size() > 1) {
+            tempList.remove(0);
+        }
+
+        Map<String, Object> result = Maps.newHashMapWithExpectedSize(2);
+        result.put("heads", RoleEnum.all());
+        if (isEmpty(tempList)) {
+            result.put("sysMenus", tempList);
+            return result;
+        }
+
+        for (SysMenu sysMenu : tempList) {
+            List<Object> containsHead = Lists.newArrayList("0", "0", "0", "0", "0", "0", "0", "0");
+            List<SysMenu> childList = getChildList(menus, sysMenu);
+            for (SysMenu childMenu : childList) {
+                String btn = getBtnFromPerms(childMenu.getPerms());
+                String tableName = getTableNameFromPerms(childMenu.getPerms());
+                GenTable genTable = redisService.getCacheObject(RedisKey.TABLE_INFO + tableName);
+                String menuRole = genTable.getMenuRole();
+                if (menuRole.contains(btn)) {
+                    switchBtn(containsHead, btn, true);
+                } else {
+                    switchBtn(containsHead, btn, false);
+                }
+            }
+
+            sysMenu.setContainsHead(containsHead);
+        }
+        result.put("sysMenus", tempList);
+        return result;
+    }
+
+    private void switchBtn(List<Object> containsHead, String btn, Object value) {
+        switch (btn) {
+            case GlobalBtn.A:
+                containsHead.set(0, value);
+                break;
+            case GlobalBtn.M:
+                containsHead.set(1, value);
+                break;
+            case GlobalBtn.D:
+                containsHead.set(2, value);
+                break;
+            case GlobalBtn.Q:
+                containsHead.set(3, value);
+                break;
+            case GlobalBtn.S:
+                containsHead.set(4, value);
+                break;
+            case GlobalBtn.U:
+                containsHead.set(5, value);
+                break;
+            case GlobalBtn.I:
+                containsHead.set(6, value);
+                break;
+            case GlobalBtn.E:
+                containsHead.set(7, value);
+                break;
+            default:
+                break;
+        }
+    }
+
+    private String getBtnFromPerms(String perms) {
+        // sys_user:A
+        requireNonNull(perms, "权限标识为空");
+        String[] split = perms.split(COLON);
+        assert split.length == 2;
+        // A
+        return split[1];
+    }
+
+    private String getTableNameFromPerms(String perms) {
+        // sys_user:A
+        requireNonNull(perms, "权限标识为空");
+        String[] split = perms.split(COLON);
+        assert split.length == 2;
+        // sys_user
+        return split[0];
+    }
 }

+ 2 - 1
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysRoleMenuServiceImpl.java

@@ -1,5 +1,6 @@
 package com.boman.system.service.impl;
 
+import com.boman.domain.constant.TableNameConst;
 import com.boman.system.domain.SysRoleMenu;
 import com.boman.system.mapper.SysRoleMenuMapper;
 import com.boman.web.core.api.RemoteObjService;
@@ -38,7 +39,7 @@ public class SysRoleMenuServiceImpl implements ISysRoleMenuService{
         }
 
         for (SysRoleMenu sysRoleMenu : roleMenuList) {
-            Long maxId = remoteObjService.getMaxId("sys_role_menu", "id");
+            Long maxId = remoteObjService.getMaxId(TableNameConst.SYS_ROLE_MENU, TableNameConst.ID);
             sysRoleMenu.setId(maxId);
         }