Przeglądaj źródła

保存roleMenu bug修改

shiqian 4 lat temu
rodzic
commit
88762d52d1

+ 1 - 1
boman-api/boman-domain/src/main/java/com.boman.domain/dto/RoleMenuDto.java

@@ -23,7 +23,7 @@ public class RoleMenuDto {
     public static String getBtnFromPerms(String perms) {
         // sys_user:A
         String[] split = perms.split(":");
-        if (split.length != 2) {
+        if (split.length == 0) {
             throw new IllegalArgumentException("menu对应的perms未配置");
         }
         // A

+ 7 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/obj/ObjectUtils.java

@@ -27,6 +27,13 @@ public class ObjectUtils {
         return input;
     }
 
+    public static  <T> List<T> requireNonNull(List<T> input, String... errorMsg){
+        if (null == input || input.size() == 0) {
+            throw new IllegalArgumentException(errorMsg[0]);
+        }
+        return input;
+    }
+
     public static  <T> boolean isEmpty(Collection<T> input){
         return null == input || input.size() == 0;
     }

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

@@ -56,10 +56,10 @@ public interface ISysMenuService
     /**
      * 根据用户ID查询菜单树信息
      * 
-     * @param id 用户ID
+     * @param userId 用户ID
      * @return 菜单列表
      */
-    public List<SysMenu> selectMenuTreeById(Long id);
+    public List<SysMenu> selectMenuTreeById(Long userId);
 
     /**
      * 功能描述: 根据菜单id,找到此菜单以及子菜单下所有的叶子节点
@@ -184,4 +184,13 @@ public interface ISysMenuService
      */
     List<SysMenu>  listTreeByRoleId(Long roleId);
 
+    /**
+     * 功能描述: 找到sonMenus对应的所有的父类,结果存放于result中
+     *
+     * @param allMenus    allMenus
+     * @param targetMenus 就是查他的祖宗
+     * @param parentList  targetMenus中所有的祖宗都在这里面
+     */
+    void recGetParent(List<SysMenu> allMenus, List<SysMenu> targetMenus, List<SysMenu> parentList);
+
 }

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

@@ -130,16 +130,16 @@ public class SysMenuServiceImpl implements ISysMenuService {
     /**
      * 根据用户ID查询菜单
      *
-     * @param id 用户名称
+     * @param userId 用户名称
      * @return 菜单列表
      */
     @Override
-    public List<SysMenu> selectMenuTreeById(Long id) {
+    public List<SysMenu> selectMenuTreeById(Long userId) {
         List<SysMenu> menus = null;
-        if (SecurityUtils.isAdmin(id)) {
+        if (SecurityUtils.isAdmin(userId)) {
             menus = menuMapper.selectMenuTreeAll();
         } else {
-            menus = menuMapper.selectMenuTreeById(id);
+            menus = menuMapper.selectMenuTreeById(userId);
         }
         return getChildPerms(menus, 0);
     }
@@ -517,12 +517,11 @@ public class SysMenuServiceImpl implements ISysMenuService {
      */
     public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) {
         List<SysMenu> returnList = new ArrayList<SysMenu>();
-        for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext(); ) {
-            SysMenu t = (SysMenu) iterator.next();
+        for (SysMenu menu : list) {
             // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
-            if (t.getParentId() == parentId) {
-                recursionFn(list, t);
-                returnList.add(t);
+            if (menu.getParentId() == parentId) {
+                recursionFn(list, menu);
+                returnList.add(menu);
             }
         }
         return returnList;
@@ -707,8 +706,9 @@ public class SysMenuServiceImpl implements ISysMenuService {
      * @param sonMenus sonMenus
      * @param result   没有按照规则排序只是把父类全部存放于result中
      */
-    private void recGetParent(List<SysMenu> allMenus, List<SysMenu> roleMenus, List<SysMenu> result) {
-        for (SysMenu sonMenu : roleMenus) {
+    @Override
+    public void recGetParent(List<SysMenu> allMenus, List<SysMenu> targetMenus, List<SysMenu> result) {
+        for (SysMenu sonMenu : targetMenus) {
             for (SysMenu parentMenu : allMenus) {
                 if (sonMenu.getParentId().equals(parentMenu.getId())) {
                     if (isNotEmpty(result)) {

+ 18 - 5
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysRoleMenuServiceImpl.java

@@ -41,30 +41,38 @@ public class SysRoleMenuServiceImpl implements ISysRoleMenuService{
     /**
      * 功能描述: 批量保存roleMenu
      *
-     * @param dto dto
+     * @param dtos dtos
      * @return int
      */
     @Override
     @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
     public int saveList(List<RoleMenuDto> dtos) {
         int effective = 0;
+        List<SysMenu> allMenus =menuService.selectMenuListAll(new SysMenu());
         for (RoleMenuDto dto : dtos) {
             Long menuId = requireNonNull(dto.getMenuId(), "menuId is empty");
             Long roleId = requireNonNull(dto.getRoleId(), "roleId is empty");
+
             SysMenu menu = requireNonNull(menuService.selectMenuById(menuId), "根据menuId = [" + menuId + "], 未找到菜单");
-            List<String> head = dto.getHead();
-            requireNonNull(head, "操作为空");
-            List<SysMenu> allMenus = menuService.selectMenuListAll(new SysMenu());
+            // 当前menu的祖宗十八代都在里面
+            List<SysMenu> parentList = Lists.newArrayListWithCapacity(16);
+            // 此方法只找到menu的祖宗十八代,但是不包含自己
+            menuService.recGetParent(allMenus, Collections.singletonList(menu), parentList);
+            parentList.add(menu);
+
+            List<String> head = requireNonNull(dto.getHead(), "操作为空");
             List<SysMenu> childList = menuService.getChildList(allMenus, menu);
             if (isEmpty(childList)) {
                 return 0;
             }
 
+            // 把parentList放进去
+            childList.addAll(parentList);
             // 根据子菜单和前台传过来的head来判断包含AMD...中的哪些
             childList = buildBtnByHead(head, childList);
             List<SysRoleMenu> roleMenuList = buildRoleMenu(roleId, map(childList, SysMenu::getId));
-            // 先删除,再添加,防止联合索引报错
             try {
+                // 先删除,再添加,防止联合索引报错
                 deleteByRoleIdList(Collections.singletonList(roleId));
                 effective += batchRoleMenu(roleMenuList);
             } catch (Exception e) {
@@ -86,6 +94,11 @@ public class SysRoleMenuServiceImpl implements ISysRoleMenuService{
     private List<SysMenu> buildBtnByHead(List<String> head, List<SysMenu> menuList) {
         List<SysMenu> result = Lists.newArrayListWithCapacity(menuList.size());
         for (SysMenu menu : menuList) {
+            if (!"F".equalsIgnoreCase(menu.getMenuType())) {
+                result.add(menu);
+                continue;
+            }
+
             String perms = menu.getPerms();
             if (isEmpty(perms)) {
                 continue;

+ 7 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysUserServiceImpl.java

@@ -1,7 +1,10 @@
 package com.boman.system.service.impl;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+
+import com.boman.common.core.utils.obj.ObjectUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -466,6 +469,10 @@ public class SysUserServiceImpl implements ISysUserService
      */
     @Override
     public List<SysUser> listByDeptId(List<Long> deptIdList) {
+        if (ObjectUtils.isEmpty(deptIdList)) {
+            return Collections.emptyList();
+        }
+
         return userMapper.listByDeptId(deptIdList);
     }
 }