houzhongyi
2024-07-11 e7c1260db32209a078a962aaa0ad5492c35774fb
提交 | 用户 | 时间
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
31     default AuthPermissionInfoRespVO convert(AdminUserDO user, List<RoleDO> roleList, List<MenuDO> menuList) {
32         return AuthPermissionInfoRespVO.builder()
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))
39                 .build();
40     }
41
42     AuthPermissionInfoRespVO.MenuVO convertTreeNode(MenuDO menu);
43
44     /**
45      * 将菜单列表,构建成菜单树
46      *
47      * @param menuList 菜单列表
48      * @return 菜单树
49      */
50     default List<AuthPermissionInfoRespVO.MenuVO> buildMenuTree(List<MenuDO> menuList) {
51         if (CollUtil.isEmpty(menuList)) {
52             return Collections.emptyList();
53         }
54         // 移除按钮
55         menuList.removeIf(menu -> menu.getType().equals(MenuTypeEnum.BUTTON.getType()));
56         // 排序,保证菜单的有序性
57         menuList.sort(Comparator.comparing(MenuDO::getSort));
58
59         // 构建菜单树
60         // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
61         Map<Long, AuthPermissionInfoRespVO.MenuVO> treeNodeMap = new LinkedHashMap<>();
62         menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AuthConvert.INSTANCE.convertTreeNode(menu)));
63         // 处理父子关系
64         treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(ID_ROOT)).forEach(childNode -> {
65             // 获得父节点
66             AuthPermissionInfoRespVO.MenuVO parentNode = treeNodeMap.get(childNode.getParentId());
67             if (parentNode == null) {
68                 LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]",
69                         childNode.getId(), childNode.getParentId());
70                 return;
71             }
72             // 将自己添加到父节点中
73             if (parentNode.getChildren() == null) {
74                 parentNode.setChildren(new ArrayList<>());
75             }
76             parentNode.getChildren().add(childNode);
77         });
78         // 获得到所有的根节点
79         return filterList(treeNodeMap.values(), node -> ID_ROOT.equals(node.getParentId()));
80     }
81
82     SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialLoginReqVO reqVO);
83
84     SmsCodeSendReqDTO convert(AuthSmsSendReqVO reqVO);
85
86     SmsCodeUseReqDTO convert(AuthSmsLoginReqVO reqVO, Integer scene, String usedIp);
87
88 }