enilu / web-flash

web-flash -- Admin Framework and Mobile Website Based on Spring Boot and Vue.js
http://webflash.enilu.cn
MIT License
1.29k stars 363 forks source link

将ID替换成String以后,在处理菜单的时候MenuRepository的getMenusByRoleids方法会出错 #73

Closed aisidd closed 4 years ago

aisidd commented 4 years ago

https://github.com/enilu/web-flash/blob/f4c921e2dc89ec2f77e965578709f259b7f0c54d/flash-core/src/main/java/cn/enilu/flash/dao/system/MenuRepository.java#L41

@Query(nativeQuery = true, value = "SELECT m1.id AS id, m1.icon AS icon, ( CASE WHEN (m2.id = 0 OR m2.id IS NULL) " + "THEN 0 ELSE m2.id END ) AS parentId, m1. NAME AS NAME, m1.url AS url, m1.levels AS levels, m1.ismenu AS " + "ismenu, m1.num AS num, m1. CODE AS CODE,m1.component,m1.hidden FROM t_sys_menu m1 LEFT JOIN t_sys_menu m2 " + "ON " + "m1.pcode = m2. CODE " + " where m1.id in (select distinct(menuid) from t_sys_relation where roleid in(?))" + "ORDER BY levels, num ASC") List getMenusByRoleids(String roleIds); 如果修改了entity的id为String后,在加载菜单的时候会加载不到菜单 从Menuservice传进来的代码时一个数组拼接成的字符串,之前是数字的时候不会报错,但是现在变成字符串了就会报错 但是到了这里用的是?号通配符 这样如果ids 字符串是 1,2,3 那么查询语句就变成了 roleid in ('1,2,3') 结果导致前端加载不到菜单. 所以这里修改成下面这样

@Query(nativeQuery = true,value="SELECT m1.id AS id, m1.icon AS icon, ( CASE WHEN (m2.id = '0' OR m2.id IS NULL) " +
        "THEN '0' ELSE m2.id END ) AS parentId, m1. NAME AS NAME, m1.url AS url, m1.levels AS levels, m1.ismenu AS " +
        "ismenu, m1.num AS num, m1. CODE AS CODE,m1.status as status,m1.component,m1.hidden FROM t_sys_menu m1 LEFT JOIN t_sys_menu m2 " +
        "ON " +
        "m1.pcode = m2. CODE " +
        " where m1.id in (select distinct(menuid) from t_sys_relation where roleid in(:roleIds))"+
        "ORDER BY levels, num ASC")
List getMenusByRoleids(@Param("roleIds") List<String>roleIds);  //这里直接传递list就好了

public List getSideBarMenus(List roleIds) { /
这里也不用将角色ID转换成字符串了 这段代码可以注释掉 StringBuilder builder = new StringBuilder(); for(int i=0;i<roleIds.size();i++){ if(i==roleIds.size()-1){ builder.append(roleIds.get(i)); }else { builder.append(roleIds.get(i)).append(","); } }
/

    List<RouterMenu> list = transferRouteMenu(menuRepository.getMenusByRoleids(roleIds));

// List list = transferRouteMenu(menuRepository.getMenusByRoleids(builder.toString())); //这里使用上面的语句 List result = generateRouterTree(list); for (RouterMenu menuNode : result) { if (!menuNode.getChildren().isEmpty()) { sortRouterTree(menuNode.getChildren()); for (RouterMenu menuNode1 : menuNode.getChildren()) { if (!menuNode1.getChildren().isEmpty()) { sortRouterTree(menuNode1.getChildren()); } } } } sortRouterTree(result); return result; }