Selaa lähdekoodia

:zap: 修复前端树组件未全选导致父节点没有入库从而引发顶部菜单生成的bug

smallchill 5 vuotta sitten
vanhempi
commit
352153a7a4

+ 16 - 0
src/main/java/org/springblade/modules/system/mapper/MenuMapper.java

@@ -132,6 +132,22 @@ public interface MenuMapper extends BaseMapper<Menu> {
 	 */
 	List<Menu> roleMenu(List<Long> roleId, Long topMenuId);
 
+	/**
+	 * 权限配置菜单
+	 *
+	 * @param roleId
+	 * @return
+	 */
+	List<Menu> roleMenuByRoleId(List<Long> roleId);
+
+	/**
+	 * 权限配置菜单
+	 *
+	 * @param topMenuId
+	 * @return
+	 */
+	List<Menu> roleMenuByTopMenuId(Long topMenuId);
+
 	/**
 	 * 所有菜单
 	 *

+ 16 - 0
src/main/java/org/springblade/modules/system/mapper/MenuMapper.xml

@@ -126,6 +126,22 @@
         </if>
     </select>
 
+    <select id="roleMenuByRoleId" resultMap="menuResultMap">
+        select * from blade_menu where is_deleted = 0 and id IN
+            ( SELECT menu_id FROM blade_role_menu WHERE role_id IN
+                <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            )
+    </select>
+
+    <select id="roleMenuByTopMenuId" resultMap="menuResultMap">
+        select * from blade_menu where is_deleted = 0 and id IN
+          (
+              SELECT menu_id FROM blade_top_menu_setting WHERE top_menu_id = #{param1}
+          )
+    </select>
+
     <select id="allMenuExt" resultMap="menuResultMap">
         select * from blade_menu_ext where is_deleted = 0 and category = 1
     </select>

+ 23 - 1
src/main/java/org/springblade/modules/system/service/impl/MenuServiceImpl.java

@@ -87,7 +87,29 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IM
 			return null;
 		}
 		List<Menu> allMenus = baseMapper.allMenu();
-		List<Menu> roleMenus = (AuthUtil.isAdministrator() && Func.isEmpty(topMenuId)) ? allMenus : baseMapper.roleMenu(Func.toLongList(roleId), topMenuId);
+		List<Menu> roleMenus;
+		// 超级管理员并且不是顶部菜单请求则返回全部菜单
+		if (AuthUtil.isAdministrator() && Func.isEmpty(topMenuId)) {
+			roleMenus = allMenus;
+		}
+		// 非超级管理员并且不是顶部菜单请求则返回对应角色权限菜单
+		else if (!AuthUtil.isAdministrator() && Func.isEmpty(topMenuId)) {
+			roleMenus = baseMapper.roleMenuByRoleId(Func.toLongList(roleId));
+		}
+		// 顶部菜单请求返回对应角色权限菜单
+		else {
+			// 角色配置对应菜单
+			List<Menu> roleIdMenus = baseMapper.roleMenuByRoleId(Func.toLongList(roleId));
+			// 反向递归角色菜单所有父级
+			List<Menu> routes = new LinkedList<>(roleIdMenus);
+			roleIdMenus.forEach(roleMenu -> recursion(allMenus, routes, roleMenu));
+			// 顶部配置对应菜单
+			List<Menu> topIdMenus = baseMapper.roleMenuByTopMenuId(topMenuId);
+			// 筛选匹配角色对应的权限菜单
+			roleMenus = topIdMenus.stream().filter(x ->
+				routes.stream().anyMatch(route -> route.getId().longValue() == x.getId().longValue())
+			).collect(Collectors.toList());
+		}
 		return buildRoutes(allMenus, roleMenus);
 	}