Ver Fonte

批量保存roleMenu

shiqian há 4 anos atrás
pai
commit
b8cbd97bbb

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

@@ -17,8 +17,16 @@ import static com.boman.domain.constant.FormDataConstant.COLON;
 public class RoleMenuDto {
 
     private Long menuId;
+    private Long roleId;
+    /** A M D..... **/
     private List<String> head;
 
+    /**
+     * 功能描述: 返回A M D......
+     *
+     * @param perms perms
+     * @return java.lang.String
+     */
     public static String getBtnFromPerms(String perms) {
         // sys_user:A
         requireNonNull(perms, "权限标识为空");
@@ -28,6 +36,12 @@ public class RoleMenuDto {
         return split[1];
     }
 
+    /**
+     * 功能描述: 返回tableName
+     *
+     * @param perms perms
+     * @return java.lang.String
+     */
     public static String getTableNameFromPerms(String perms) {
         // sys_user:A
         requireNonNull(perms, "权限标识为空");

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

@@ -82,6 +82,14 @@ public class ObjectUtils {
     }
 
 
+    public static boolean isEmpty(Long input) {
+        return input == null || input < 0;
+    }
+
+    public static boolean isNotEmpty(Long input) {
+        return !isEmpty(input);
+    }
+
     public static String requireNonNull(String input, String... errorMsg) {
         if (input == null || input.isEmpty() || NULL.equalsIgnoreCase(input) || UNDEFINED.equalsIgnoreCase(input)) {
             throw new IllegalArgumentException(errorMsg[0]);

+ 3 - 4
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysRoleMenuController.java

@@ -2,7 +2,6 @@ package com.boman.system.controller;
 
 import com.boman.common.core.web.domain.AjaxResult;
 import com.boman.domain.dto.RoleMenuDto;
-import com.boman.system.domain.SysRoleMenu;
 import com.boman.system.service.impl.ISysRoleMenuService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,11 +29,11 @@ public class SysRoleMenuController {
     /**
      * 功能描述: 批量保存roleMenu
      *
-     * @param dto dto
+     * @param dtos dtos
      * @return com.boman.common.core.web.domain.AjaxResult
      */
     @PostMapping
-    public AjaxResult list(@RequestBody RoleMenuDto dto) {
-        return AjaxResult.success(service.saveList(dto));
+    public AjaxResult list(@RequestBody List<RoleMenuDto> dtos) {
+        return AjaxResult.success(service.saveList(dtos));
     }
 }

+ 10 - 1
boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysRoleMenuMapper.java

@@ -3,6 +3,7 @@ package com.boman.system.mapper;
 import java.util.List;
 
 import com.boman.system.domain.SysRoleMenu;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 角色与菜单关联表 数据层
@@ -27,6 +28,14 @@ public interface SysRoleMenuMapper
      */
     public int deleteRoleMenuByRoleId(Long roleId);
 
+    /**
+     * 功能描述: 通过角色ID批量删除角色和菜单关联
+     *
+     * @param roleIdList roleIdList
+     * @return int
+     */
+    public int deleteByRoleIdList(@Param("roleIdList") List<Long> roleIdList);
+
     /**
      * 批量删除角色菜单关联信息
      * 
@@ -41,5 +50,5 @@ public interface SysRoleMenuMapper
      * @param roleMenuList 角色菜单列表
      * @return 结果
      */
-    public int batchRoleMenu(List<SysRoleMenu> roleMenuList);
+    int batchRoleMenu(@Param("roleMenuList") List<SysRoleMenu> roleMenuList);
 }

+ 9 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/ISysMenuService.java

@@ -36,6 +36,15 @@ public interface ISysMenuService
 
     public List<SysMenu> selectMenuListAll(SysMenu menu);
 
+    /**
+     * 功能描述: 获取menu下所有的子节点
+     *
+     * @param allMenus 所有的
+     * @param menu     父节点吧
+     * @return java.util.List<com.boman.system.api.domain.SysMenu>
+     */
+    List<SysMenu> getChildList(List<SysMenu> allMenus, SysMenu menu);
+
     /**
      * 根据用户ID查询权限
      * 

+ 18 - 2
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/ISysRoleMenuService.java

@@ -15,10 +15,26 @@ public interface ISysRoleMenuService {
    /**
     * 功能描述: 批量保存roleMenu
     *
-    * @param dto dto
+    * @param dtos dtos
     * @return int
     */
-    int saveList(RoleMenuDto dto);
+    int saveList(List<RoleMenuDto> dtos);
+
+    /**
+     * 功能描述: 根据roleIdList删除
+     *
+     * @param roleIdList  roleIdList
+     * @return int
+     */
+    int deleteByRoleIdList(List<Long> roleIdList);
+
+    /**
+     * 功能描述: 批量保存roleMenuList
+     *
+     * @param roleMenuList  roleMenuList
+     * @return int
+     */
+    int batchRoleMenu(List<SysRoleMenu> roleMenuList);
 
 
 }

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

@@ -511,14 +511,19 @@ public class SysMenuServiceImpl implements ISysMenuService {
     }
 
     /**
-     * 得到子节点列表
+     * 功能描述: 获取menu下所有的子节点
+     *
+     * @param allMenus 所有的
+     * @param menu     父节点
+     * @return java.util.List<com.boman.system.api.domain.SysMenu>
      */
-    private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) {
+    @Override
+    public List<SysMenu> getChildList(List<SysMenu> allMenus, SysMenu menu) {
         List<SysMenu> tlist = new ArrayList<SysMenu>();
-        Iterator<SysMenu> it = list.iterator();
+        Iterator<SysMenu> it = allMenus.iterator();
         while (it.hasNext()) {
             SysMenu n = (SysMenu) it.next();
-            if (n.getParentId().longValue() == t.getId().longValue()) {
+            if (n.getParentId().longValue() == menu.getId().longValue()) {
                 tlist.add(n);
             }
         }

+ 79 - 38
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysRoleMenuServiceImpl.java

@@ -12,10 +12,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
-import static com.boman.common.core.utils.obj.ObjectUtils.isEmpty;
-import static com.boman.common.core.utils.obj.ObjectUtils.requireNonNull;
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
 
 /**
  * @author shiqian
@@ -40,45 +41,85 @@ public class SysRoleMenuServiceImpl implements ISysRoleMenuService{
      * @return int
      */
     @Override
-    public int saveList(RoleMenuDto dto) {
-//        for (SysRoleMenu sysRoleMenu : roleMenuList) {
-//            Long maxId = remoteObjService.getMaxId(TableNameConst.SYS_ROLE_MENU, TableNameConst.ID);
-//            sysRoleMenu.setId(maxId);
-//        }
-//
-//        return mapper.batchRoleMenu(roleMenuList);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-        Long menuId = dto.getMenuId();
-        SysMenu menu = menuService.selectMenuById(menuId);
-        requireNonNull(menu, "根据menuId = [" + menuId + "], 未找到菜单");
-        String perms = menu.getPerms();
-        requireNonNull(perms, "权限标识为空");
-        List<String> head = dto.getHead();
-        requireNonNull(head, "操作为空");
-
-        String btn = RoleMenuDto.getBtnFromPerms(menu.getPerms());
-        String tableName = RoleMenuDto.getTableNameFromPerms(menu.getPerms());
+    public int saveList(List<RoleMenuDto> dtos) {
+        int effective = 0;
+        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());
+            List<SysMenu> childList = menuService.getChildList(allMenus, menu);
+            if (isEmpty(childList)) {
+                return 0;
+            }
+
+            // 根据子菜单和前台传过来的head来判断包含AMD...中的哪些
+            childList = buildBtnByHead(head, childList);
+            List<SysRoleMenu> roleMenuList = buildRoleMenu(roleId, map(childList, SysMenu::getId));
+            // 先删除,再添加,防止联合索引报错
+            deleteByRoleIdList(Collections.singletonList(roleId));
+            effective += batchRoleMenu(roleMenuList);
+        }
+
+        return effective;
+    }
 
+    /**
+     * 功能描述: 根据前台传过来的head中判断是否包含childList中perms的btn,返回包含的
+     *
+     * @param head     A M D......
+     * @param menuList menuList
+     * @return java.util.List<com.boman.system.api.domain.SysMenu>
+     */
+    private List<SysMenu> buildBtnByHead(List<String> head, List<SysMenu> menuList) {
+        return filter(menuList, menu -> head.contains(RoleMenuDto.getBtnFromPerms(menu.getPerms())));
+    }
 
+    /**
+     * 功能描述: 根据roleIdList删除
+     *
+     * @param roleIdList roleIdList
+     * @return int
+     */
+    @Override
+    public int deleteByRoleIdList(List<Long> roleIdList) {
+        if (isEmpty(roleIdList)) {
+            return 0;
+        }
+        return mapper.deleteByRoleIdList(roleIdList);
+    }
 
+    /**
+     * 功能描述: 批量保存roleMenuList
+     *
+     * @param roleMenuList roleMenuList
+     * @return int
+     */
+    @Override
+    public int batchRoleMenu(List<SysRoleMenu> roleMenuList) {
+        return mapper.batchRoleMenu(roleMenuList);
+    }
 
-        return 0;
+    /**
+     * 功能描述: buildRoleMenu
+     *
+     * @param roleId     roleId
+     * @param menuIdList menuIdList
+     * @return java.util.List<com.boman.system.domain.SysRoleMenu>
+     */
+    private List<SysRoleMenu> buildRoleMenu(Long roleId, List<Long> menuIdList) {
+        List<SysRoleMenu> result = new ArrayList<>(menuIdList.size());
+        for (Long menuId : menuIdList) {
+            SysRoleMenu roleMenu = new SysRoleMenu();
+            Long maxId = remoteObjService.getMaxId(TableNameConst.SYS_ROLE_MENU, TableNameConst.ID);
+            roleMenu.setId(maxId);
+            roleMenu.setRoleId(roleId);
+            roleMenu.setMenuId(menuId);
+            result.add(roleMenu);
+        }
+
+        return result;
     }
 }

+ 9 - 2
boman-modules/boman-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml

@@ -17,6 +17,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<delete id="deleteRoleMenuByRoleId" parameterType="Long">
 		delete from sys_role_menu where role_id=#{roleId}
 	</delete>
+
+	<delete id="deleteByRoleIdList" parameterType="Long">
+		delete from sys_role_menu where role_id in
+		<foreach collection="roleIdList" item="roleId" open="(" separator="," close=")">
+			#{roleId}
+		</foreach>
+	</delete>
 	
 	<delete id="deleteRoleMenu" parameterType="Long">
  		delete from sys_role_menu where role_id in
@@ -27,8 +34,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	
 	<insert id="batchRoleMenu">
 		insert into sys_role_menu(id, role_id, menu_id) values
-		<foreach item="item" index="index" collection="list" separator=",">
-			(#{item.id},#{item.roleId},#{item.menuId})
+		<foreach item="item" collection="roleMenuList" separator=",">
+			(#{item.id}, #{item.roleId}, #{item.menuId})
 		</foreach>
 	</insert>