shikeyin
2024-01-11 65da8373531677b1c37a98f53eaa30c892f35e5a
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
package com.iplatform.base.service;
 
import com.iplatform.model.po.S_menu;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.jdbc.service.BaseServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Service;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
 
/**
 * 菜单权限数据操作。
 * @author 时克英
 * @date 2022-11-02
 */
@Service
public class MenuServiceImpl extends BaseServiceImpl {
 
    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
 
    private static final String SQL_QUERY_ROLE_MENUS = "select DISTINCT(menu_id) from s_role_menu where role_id in (:roleIdList)";
 
    private static final String SQL_SAME_MENU_PARENT = "select * from s_menu where parent_id=? and menu_name = ?";
 
    private static final String SQL_MENU_USER = "select count(menu_id) total from s_role_menu where menu_id=?";
 
    /**
     * 查询给定菜单是否被分配到角色功能中
     * @param menuId
     * @return 存在返回大于0
     * @date 2022-12-29
     */
    public int queryRoleMenuSize(String menuId){
        return this.sqlMathQuery(SQL_MENU_USER, new Object[]{menuId}, Integer.class);
    }
 
    /**
     * 查询给定父节点下是否存在已重名的菜单。
     * @param parentId
     * @param menuName
     * @return
     * @date 2022-12-26
     */
    public S_menu queryExistMenuInParent(String parentId, String menuName){
        List<S_menu> list = this.select(SQL_SAME_MENU_PARENT, new Object[]{parentId, menuName}, new S_menu());
        if(StringUtils.isEmptyList(list)){
            return null;
        }
        return list.get(0);
    }
 
    /**
     * 给定角色ID集合,返回对应菜单ID列表
     * @param roleIdList
     * @return
     * @date 2022-11-12
     */
    public List<String> queryRoleMenuIdList(List<String> roleIdList){
        if(StringUtils.isEmptyList(roleIdList)){
            return null;
        }
        // 2023-07-12 安全模块传递的角色id,可能存在字符串,如:ROLE_USER等,应当过滤掉,只保留系统角色ID(数值)
        //-------------------------------------------------
        List<Long> roleIdValueList = new ArrayList<>(4);
        for(String roleId: roleIdList){
            if(StringUtils.isNumeric(roleId)){
                roleIdValueList.add(Long.parseLong(roleId));
            }
        }
        if(StringUtils.isEmptyList(roleIdValueList)){
            return null;
        }
        //-------------------------------------------------
//        Map<String, Object> param = new HashMap<>(2);
//        param.put("roleIdList", roleIdValueList);
//        List<Map<String, Object>> list = this.select(SQL_QUERY_ROLE_MENUS, param);
        // 因为 oracle报错:where role_id in ([2]),所以更换写法!2023-07-19
        MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource();
        sqlParameterSource.addValue("roleIdList", roleIdValueList);
        List<Map<String, Object>> list = this.queryListObjectWhereIn(SQL_QUERY_ROLE_MENUS, sqlParameterSource);
        logger.debug("查询角色权限集合: {}", list);
        if(list != null && list.size() > 0){
            List<String> menuIdList = new ArrayList<>(64);
            for(Map<String, Object> map : list){
//                menuIdList.add(map.get("menu_id").toString());
                // 2023-07-19 由于oracle返回的是否大写:MENU_ID,因此这里可以取第一个字段(因为只有一个)
                // 而不能通过小写取menu_id,否则取不到数据。
                menuIdList.add(map.values().toArray()[0].toString());
            }
            return menuIdList;
        }
        return null;
    }
 
    /**
     * 查询系统所有角色与菜单对应关系集合。在security权限拦截中使用该方法
     * @return 集合中包括:role_id, menu_id
     * @date 2022-11-02
     */
    public List<Map<String, Object>> queryRolesPermList(){
        return this.select("select * from s_role_menu", new Object[]{});
    }
}