whyczh
2021-05-14 b179439062ee4e5160dad7e553d5cdff8714d5fa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
package com.whyc.service;
 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.api.R;
import com.google.common.collect.Sets;
import com.whyc.dto.Response;
import com.whyc.mapper.MenuMapper;
import com.whyc.mapper.RoleMenuMapper;
import com.whyc.pojo.Menu;
import com.whyc.pojo.RoleMenu;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
 
/**
 * 角色-菜单
 */
@Service
public class RoleMenuService {
 
    @Resource
    private RoleMenuMapper mapper;
 
    @Resource
    private MenuMapper menuMapper;
 
    public List<Menu> getUserMenu(Integer id) {
        return mapper.getUserMenu(id);
    }
 
    public List<Menu> getAllMenus(){
        List<Menu> menus = menuMapper.selectList(null);
        return menus;
    }
 
    public Response updateRoleMenu(int roleId,int[] menuIds){
        QueryWrapper<RoleMenu> queryWrapper = new QueryWrapper<RoleMenu>().eq("role_id",roleId);
        mapper.delete(queryWrapper);
        List<RoleMenu> roleMenus = new ArrayList<>();
        for (int menuId:menuIds) {
            RoleMenu roleMenu = new RoleMenu();
            roleMenu.setRoleId(roleId);
            roleMenu.setMenuId(menuId);
            roleMenus.add(roleMenu);
        }
        if (mapper.insertBatchSomeColumn(roleMenus)==roleMenus.size()){
            return new Response().setMsg(1,"更新成功");
        }else {
            return new Response().setMsg(0,"更新失败");
        }
    }
 
    public List<Menu> getRoleMenu(Integer roleId){
        List<Menu> menus = menuMapper.selectList(null);
        QueryWrapper<RoleMenu> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("role_id",roleId);
        List<RoleMenu> roleMenus = mapper.selectList(queryWrapper);
        for (RoleMenu roleMenu:roleMenus) {
            for (Menu menu:menus) {
                if (roleMenu.getMenuId().equals(menu.getId())){
                    menu.setSelected(true);
                    break;
                }
            }
        }
        menus = getTree(menus);
 
        return menus;
    }
 
    public List<Menu> getTree(List<Menu> list) {
 
        List<Menu> baseLists = new ArrayList<>();
        // 总菜单,出一级菜单,一级菜单没有父id
        for (Menu e: list) {
            if( e.getMenuId()==0 ){
                baseLists.add( e );
            }
        }
        // 遍历一级菜单
        for (Menu e: baseLists) {
            // 将子元素 set进一级菜单里面
            e.setSubMenus( getChild(e.getId(),list) );
        }
 
        return baseLists;
    }
    /**
     * 获取子节点
     * @param MenuId
     * @param Menus
     * @return
     */
    private List<Menu> getChild(Integer MenuId , List<Menu> Menus){
        List<Menu> childs = new ArrayList<>();
        for (Menu e: Menus) {
            if(e.getMenuId()!=0){
                if(e.getMenuId().equals( MenuId )){
                    // 子菜单的下级菜单
                    childs.add( e );
                }
            }
        }
        // 把子菜单的子菜单再循环一遍
        for (Menu e: childs) {
            // 继续添加子元素
            e.setSubMenus( getChild( e.getId() , Menus ) );
        }
 
        //停下来的条件,如果 没有子元素了,则停下来
        if( childs.size()==0 ){
            return null;
        }
        return childs;
    }
 
 
 
    public List<Menu> tree(int level){
        //非顶级菜单集合
        List<Menu> menuList = menuMapper.selectList(new QueryWrapper<Menu>().ne("menu_id",0));
        //顶级菜单
        List<Menu> topList = menuMapper.selectList(new QueryWrapper<Menu>().eq("menu_id",0));
        if (ObjectUtils.isNotNull(menuList)){
            //过滤条件set,指定set预期大小为非顶级菜单集合的size
            Set<Integer> set = Sets.newHashSetWithExpectedSize(menuList.size());
            //循环顶级菜单插入子菜单
            topList.forEach(menu-> getSubMenu(menu,menuList,level,set));
            return topList;
        }
        return null;
    }
 
    public void getSubMenu(Menu menu,List<Menu> menuList,int level,Set<Integer> set){
        //过滤树的深度等级
        if (menu.getLevel() < level || level==0){
            List<Menu> subList = Lists.newArrayList();
            menuList.stream()
                    //判断是否循环过当前对象
                    .filter(c->!set.contains(c.getId()))
                    //判断是否存在父子关系
                    .filter(c-> NumberUtils.compare(c.getMenuId(),menu.getId())==0)
                    //set集合大小不超过menuList的大小
                    .filter(c-> set.size() <= menuList.size())
                    .forEach(c->{
                        set.add(c.getId());
                        getSubMenu(c,menuList,level,set);
                        subList.add(c);
                    });
            menu.setSubMenus(subList);
 
        }
    }
 
 
 
 
 
 
 
}