dengzedong
2024-12-24 76743b009ca5ea67557fcab597b332f8d1947813
提交 | 用户 | 时间
e7c126 1 package com.iailab.module.system.convert.auth;
H 2
3 import cn.hutool.core.collection.CollUtil;
4 import com.iailab.framework.common.util.object.BeanUtils;
5 import com.iailab.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
6 import com.iailab.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
7 import com.iailab.module.system.api.social.dto.SocialUserBindReqDTO;
8 import com.iailab.module.system.controller.admin.auth.vo.*;
9 import com.iailab.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
10 import com.iailab.module.system.dal.dataobject.permission.MenuDO;
11 import com.iailab.module.system.dal.dataobject.permission.RoleDO;
12 import com.iailab.module.system.dal.dataobject.user.AdminUserDO;
13 import com.iailab.module.system.enums.permission.MenuTypeEnum;
14 import org.mapstruct.Mapper;
15 import org.mapstruct.factory.Mappers;
16 import org.slf4j.LoggerFactory;
17
18 import java.util.*;
19
20 import static com.iailab.framework.common.util.collection.CollectionUtils.convertSet;
21 import static com.iailab.framework.common.util.collection.CollectionUtils.filterList;
22 import static com.iailab.module.system.dal.dataobject.permission.MenuDO.ID_ROOT;
23
24 @Mapper
25 public interface AuthConvert {
26
27     AuthConvert INSTANCE = Mappers.getMapper(AuthConvert.class);
28
29     AuthLoginRespVO convert(OAuth2AccessTokenDO bean);
30
818a01 31     default AuthPermissionInfoRespVO  convert(AdminUserDO user, List<RoleDO> roleList, List<MenuDO> menuList) {
e7c126 32         return AuthPermissionInfoRespVO.builder()
H 33                 .user(BeanUtils.toBean(user, AuthPermissionInfoRespVO.UserVO.class))
34                 .roles(convertSet(roleList, RoleDO::getCode))
35                 // 权限标识信息
36                 .permissions(convertSet(menuList, MenuDO::getPermission))
37                 // 菜单树
38                 .menus(buildMenuTree(menuList))
818a01 39                 .build();
H 40     }
41
42     default AuthPermissionInfoRespVO convertAppMenu(AdminUserDO user, List<RoleDO> roleList, List<MenuDO> menuList) {
43         return AuthPermissionInfoRespVO.builder()
44                 .user(BeanUtils.toBean(user, AuthPermissionInfoRespVO.UserVO.class))
45                 .roles(convertSet(roleList, RoleDO::getCode))
46                 // 权限标识信息
47                 .permissions(convertSet(menuList, MenuDO::getPermission))
48                 // 菜单树
49                 .menus(buildAppMenuTree(menuList))
e7c126 50                 .build();
H 51     }
52
53     AuthPermissionInfoRespVO.MenuVO convertTreeNode(MenuDO menu);
54
55     /**
56      * 将菜单列表,构建成菜单树
57      *
58      * @param menuList 菜单列表
59      * @return 菜单树
60      */
61     default List<AuthPermissionInfoRespVO.MenuVO> buildMenuTree(List<MenuDO> menuList) {
62         if (CollUtil.isEmpty(menuList)) {
63             return Collections.emptyList();
64         }
818a01 65         // 移除按钮和应用菜单
e7c126 66         menuList.removeIf(menu -> menu.getType().equals(MenuTypeEnum.BUTTON.getType()));
H 67         // 排序,保证菜单的有序性
68         menuList.sort(Comparator.comparing(MenuDO::getSort));
69
70         // 构建菜单树
71         // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
72         Map<Long, AuthPermissionInfoRespVO.MenuVO> treeNodeMap = new LinkedHashMap<>();
73         menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AuthConvert.INSTANCE.convertTreeNode(menu)));
74         // 处理父子关系
75         treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(ID_ROOT)).forEach(childNode -> {
76             // 获得父节点
77             AuthPermissionInfoRespVO.MenuVO parentNode = treeNodeMap.get(childNode.getParentId());
78             if (parentNode == null) {
79                 LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]",
80                         childNode.getId(), childNode.getParentId());
81                 return;
82             }
83             // 将自己添加到父节点中
84             if (parentNode.getChildren() == null) {
85                 parentNode.setChildren(new ArrayList<>());
86             }
87             parentNode.getChildren().add(childNode);
88         });
89         // 获得到所有的根节点
90         return filterList(treeNodeMap.values(), node -> ID_ROOT.equals(node.getParentId()));
91     }
92
818a01 93     /**
H 94      * 将菜单列表,构建成菜单树
95      *
96      * @param menuList 菜单列表
97      * @return 菜单树
98      */
99     default List<AuthPermissionInfoRespVO.MenuVO> buildAppMenuTree(List<MenuDO> menuList) {
100         if (CollUtil.isEmpty(menuList)) {
101             return Collections.emptyList();
102         }
103         // 移除按钮和应用菜单
104         menuList.removeIf(menu -> menu.getType().equals(MenuTypeEnum.BUTTON.getType()));
105         // 排序,保证菜单的有序性
106         menuList.sort(Comparator.comparing(MenuDO::getSort));
107
108         // 构建菜单树
109         // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
110         Map<Long, AuthPermissionInfoRespVO.MenuVO> treeNodeMap = new LinkedHashMap<>();
111         menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AuthConvert.INSTANCE.convertTreeNode(menu)));
112         // 处理父子关系
113         treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(ID_ROOT)).forEach(childNode -> {
114             // 获得父节点
115             AuthPermissionInfoRespVO.MenuVO parentNode = treeNodeMap.get(childNode.getParentId());
116             if (parentNode == null) {
117                 LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]",
118                         childNode.getId(), childNode.getParentId());
119                 return;
120             }
121             // 将自己添加到父节点中
122             if (parentNode.getChildren() == null) {
123                 parentNode.setChildren(new ArrayList<>());
124             }
125             parentNode.getChildren().add(childNode);
126         });
127         // 获得到所有的根节点
128         return filterList(treeNodeMap.values(), node -> ID_ROOT.equals(node.getParentId()));
129     }
130
131     /**
132      * 将菜单列表,构建成菜单树
133      *
134      * @param menuList 菜单列表
135      * @return 菜单树
136      */
137     default List<AuthPermissionInfoRespVO.MenuVO> buildMenuTree(List<MenuDO> menuList, Long id, String parentPath) {
138         if (CollUtil.isEmpty(menuList)) {
139             return Collections.emptyList();
140         }
141         // 移除按钮
142         menuList.removeIf(menu -> menu.getType().equals(MenuTypeEnum.BUTTON.getType()));
143         // 排序,保证菜单的有序性
144         menuList.sort(Comparator.comparing(MenuDO::getSort));
145
146         // 构建菜单树
147         // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
148         Map<Long, AuthPermissionInfoRespVO.MenuVO> treeNodeMap = new LinkedHashMap<>();
149         menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AuthConvert.INSTANCE.convertTreeNode(menu)));
150         // 处理父子关系
151         treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(id)).forEach(childNode -> {
152             // 获得父节点
153             AuthPermissionInfoRespVO.MenuVO parentNode = treeNodeMap.get(childNode.getParentId());
154             if (parentNode == null) {
155                 LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]",
156                         childNode.getId(), childNode.getParentId());
157                 return;
158             }
159             // 将自己添加到父节点中
160             if (parentNode.getChildren() == null) {
161                 parentNode.setChildren(new ArrayList<>());
162             }
163             parentNode.getChildren().add(childNode);
164         });
165         // 获得到所有的根节点
166         List<AuthPermissionInfoRespVO.MenuVO> menuVOS = filterList(treeNodeMap.values(), node -> id.equals(node.getParentId()));
167         menuVOS.stream().forEach(menuVO -> {
ce910c 168             menuVO.setPath((parentPath + "/" + menuVO.getPath()).replace("//", "/"));
818a01 169         });
H 170         return menuVOS;
171     }
172
ce910c 173     /**
H 174      * 将菜单列表,构建成菜单树
175      *
176      * @param menuList 菜单列表
177      * @return 菜单树
178      */
179     default List<AuthPermissionInfoRespVO.MenuVO> buildMenuTree(List<MenuDO> menuList, Long id, String parentPath, Integer type) {
180         if (CollUtil.isEmpty(menuList)) {
181             return Collections.emptyList();
182         }
183         // 移除按钮
184         menuList.removeIf(menu -> menu.getType().equals(MenuTypeEnum.BUTTON.getType()));
185         // 排序,保证菜单的有序性
186         menuList.sort(Comparator.comparing(MenuDO::getSort));
187
188         // 构建菜单树
189         // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
190         Map<Long, AuthPermissionInfoRespVO.MenuVO> treeNodeMap = new LinkedHashMap<>();
191         menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AuthConvert.INSTANCE.convertTreeNode(menu)));
192         // 处理父子关系
193         treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(id)).forEach(childNode -> {
194             // 获得父节点
195             AuthPermissionInfoRespVO.MenuVO parentNode = treeNodeMap.get(childNode.getParentId());
196             if (parentNode == null) {
197                 LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]",
198                         childNode.getId(), childNode.getParentId());
199                 return;
200             }
201             // 将自己添加到父节点中
202             if (parentNode.getChildren() == null) {
203                 parentNode.setChildren(new ArrayList<>());
204             }
205             parentNode.getChildren().add(childNode);
206         });
207         // 获得到所有的根节点
208         List<AuthPermissionInfoRespVO.MenuVO> menuVOS = filterList(treeNodeMap.values(), node -> id.equals(node.getParentId()));
209         if(type == 0) {
210             menuVOS.stream().forEach(menuVO -> {
49b4b6 211                 // 不处理外链菜单path
H 212                 if(!menuVO.getPath().contains("http:") && !menuVO.getPath().contains("https:")) {
213                     menuVO.setPath((parentPath + "/" + menuVO.getPath()).replace("//", "/"));
214                 }
ce910c 215             });
H 216         }
217         return menuVOS;
218     }
219
e7c126 220     SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialLoginReqVO reqVO);
H 221
222     SmsCodeSendReqDTO convert(AuthSmsSendReqVO reqVO);
223
224     SmsCodeUseReqDTO convert(AuthSmsLoginReqVO reqVO, Integer scene, String usedIp);
225
226 }