From 0c4a1e9e825ac9fe38b24b322d37b318289996d6 Mon Sep 17 00:00:00 2001 From: "zhang.xw" Date: Sat, 23 Jul 2022 17:53:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BE=9B=E9=92=89=E9=92=89=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/iservice/busi/ICoreMemTreeService.java | 11 ++- .../i3plus/core/api/iservice/dto/SysMenuDTO.java | 51 ++++++++++ .../controller/base/WhiteController.java | 103 ++++++++++++++++++++- .../serviceimpl/busi/CoreMemTreeService.java | 51 ++++++++++ 4 files changed, 210 insertions(+), 6 deletions(-) create mode 100644 modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/SysMenuDTO.java diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java index 49fbbf1..2b0b10c 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java @@ -1,5 +1,6 @@ package cn.estsh.i3plus.core.api.iservice.busi; +import cn.estsh.i3plus.core.api.iservice.dto.SysMenuDTO; import cn.estsh.i3plus.pojo.model.platform.CommonTreeModel; import cn.estsh.i3plus.pojo.platform.bean.*; import io.swagger.annotations.ApiOperation; @@ -160,7 +161,8 @@ public interface ICoreMemTreeService { @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 查询功能树") List packTreeSysMenuByUserId(Long userId); - + @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 查询功能树") + public List packTreeDingSysMenuByUserId(Long userId); /** * 根据用户ID 和 节点ID 查询功能树 * @param userId @@ -170,12 +172,19 @@ public interface ICoreMemTreeService { @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 和 节点ID 查询功能树") List packTreeSysMenuByUserIdAndParentId(Long userId,Long parentId); + @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 和 节点ID 查询功能树") + List packTreeDingSysMenuByUserIdAndParentId(Long userId,Long parentId); + @ApiOperation(value = "查询功能子节点",notes = "根据父节点ID 和 菜单类型 查询功能树") List packTreeSysMenuByParentIdAndMenuType(List list,Long parentId,Integer menuType); @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 查询功能树") List packTreeSysMenu(); + @ApiOperation(value = "查询功能子节点",notes = "根据父节点ID 和 菜单类型 查询功能树") + List packTreeToDto(List list); + + /********************************************* End SysMenu Tree *********************************************/ } diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/SysMenuDTO.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/SysMenuDTO.java new file mode 100644 index 0000000..d74810f --- /dev/null +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/SysMenuDTO.java @@ -0,0 +1,51 @@ +package cn.estsh.i3plus.core.api.iservice.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description : 对外菜单dto + * @Reference : + * @Author : zhangxw + * @CreateDate :2022/7/23 0023 + **/ +@Data +public class SysMenuDTO implements Serializable { + + private static final long serialVersionUID = -4365785452541938586L; + /** + * 菜单id + */ + private long id; + /** + * 父菜单id + */ + private long parentId; + /** + * 组织编码 + */ + private String organizeCode; + /** + * 菜单code + */ + private String menuCode; + /** + * 菜单名称 + */ + private String name; + /** + * 父类菜单名称 + */ + private String parentNameRdd; + /** + * 菜单排序id + */ + private Integer menuSort; + /** + * 子菜单 + */ + private List childList; + +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java index dc17295..d0ed38c 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java @@ -4,15 +4,13 @@ import cn.estsh.i3plus.core.api.iservice.base.ISynchronizedService; import cn.estsh.i3plus.core.api.iservice.base.ISystemInitService; import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginStrategyService; import cn.estsh.i3plus.core.api.iservice.busi.*; +import cn.estsh.i3plus.core.api.iservice.dto.SysMenuDTO; import cn.estsh.i3plus.core.apiservice.controller.busi.*; import cn.estsh.i3plus.core.apiservice.util.MailUtil; import cn.estsh.i3plus.core.apiservice.util.SysUserPasswordUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; -import cn.estsh.i3plus.platform.common.tool.JsonUtilTool; -import cn.estsh.i3plus.platform.common.tool.ServletRequestTool; -import cn.estsh.i3plus.platform.common.tool.StringTool; -import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.platform.common.tool.*; import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.annotation.AnnoIgnoreLog; @@ -24,6 +22,7 @@ import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.base.util.BeanMapUtils; import cn.estsh.i3plus.pojo.model.common.CloudPagerModel; import cn.estsh.i3plus.pojo.model.common.ImppEmail; import cn.estsh.i3plus.pojo.model.common.ImppSmsContent; @@ -62,12 +61,14 @@ import com.google.common.cache.CacheBuilder; import com.taobao.api.ApiException; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import jodd.bean.BeanUtil; import jodd.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -169,6 +170,9 @@ public class WhiteController extends CoreBaseController { @Autowired private SysFileController sysFileController; + @Autowired + private ICoreMemTreeService memTreeService; + private Cache unsavedLocaleResSwitch = CacheBuilder.newBuilder() .maximumSize(1) .expireAfterWrite(1, TimeUnit.MINUTES) @@ -191,6 +195,7 @@ public class WhiteController extends CoreBaseController { @ApiOperation(value = "查询可用语言", notes = "查询可用语言") public ResultBean getSystemInfo() { try { + LOGGER.info("调用了/system-info"); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(configService.findSystemInfoConfig()); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); @@ -1328,6 +1333,7 @@ public class WhiteController extends CoreBaseController { } } + /** * 获取accessToken * @@ -1373,7 +1379,6 @@ public class WhiteController extends CoreBaseController { return ""; } - private OapiV2UserGetResponse getDingTalkUserInfo(String dingTalkTmpAuthCode) { String dingTalkUrl = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_URL); String dingTalkAppKey = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_APP_KEY); @@ -1407,4 +1412,92 @@ public class WhiteController extends CoreBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + /** + * 获取登录用户功能权限信息 + * + * @param dingTalkTmpAuthCode + * @return + */ + @GetMapping(value = "/find-menu-list") + @ApiOperation(value = "获取登录用户功能权限信息", notes = "获取首页权限信息") + public ResultBean findHomeList(HttpServletRequest request,@RequestParam String dingTalkTmpAuthCode, @RequestParam(required = false)String mobile) { + try { + if (Objects.isNull(dingTalkTmpAuthCode)) { + return ResultBean.fail("操作失败").setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()).setErrorMsg("授权码不能为空"); + } + // 根据dingTalkTmpAuthCode 获取 平台的用户信息 + SysUser sysUser = getUserInfo(dingTalkTmpAuthCode); + if (sysUser == null && !Objects.isNull(mobile)) { + LOGGER.info("code未查询到用默认"); + sysUser = userService.getSysUserByPhone(mobile); + } + + if(sysUser == null) { + return ResultBean.fail("操作失败").setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()).setErrorMsg("用户信息不存在"); + } + Long startTime = System.currentTimeMillis(); + List menuList = memTreeService.packTreeDingSysMenuByUserId(sysUser.getId()); + Long menuSelectTime = System.currentTimeMillis(); + LOGGER.info("第一段耗时:{}", menuSelectTime - startTime); + List syslist = memTreeService.packTreeSysMenuByParentIdAndMenuType(menuList, CommonConstWords.SYSTEM_MENU_ROOT_ID, CommonEnumUtil.METHOD_LEVEL.PLUGIN.getValue()); + LOGGER.info("第二段耗时:{}", System.currentTimeMillis() - menuSelectTime); + + List resList = memTreeService.packTreeToDto(syslist); + + if (resList != null && resList.size() > 0) { + // 翻译第一级 + resList.forEach(menu -> menu.setName(LocaleUtils.getLocaleRes("MENU_" + menu.getName()))); + // 内存排序 Sort 降序 code 升序 + resList.sort(Comparator.comparing(SysMenuDTO::getMenuSort).reversed().thenComparing(SysMenuDTO::getMenuCode)); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(resList); + } else { + return ResultBean.fail("操作失败").setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()).setErrorMsg("菜单信息不存在"); + } + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + /** + * 获取用户信息 + * getUserInfo + * @param dingTalkTmpAuthCode + * @return + */ + private SysUser getUserInfo(String dingTalkTmpAuthCode) { + + SysUser sysUser = null; + + String dingTalkUrl = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_URL); + String dingTalkAppKey = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_APP_KEY); + String dingTalkAppSecret = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_APP_SECRET); + String dingTalkWhiteList = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_WHITE_LIST); + + if (StringUtils.isEmpty(dingTalkUrl) || + StringUtils.isEmpty(dingTalkAppKey) || + StringUtils.isEmpty(dingTalkAppSecret) || + StringUtils.isEmpty(dingTalkWhiteList)) { + //todo errorcode 需要修改 + ImppExceptionBuilder.newInstance().setErrorCode("0000431").setErrorDetail("访问钉钉的系统参数缺失,请在平台的系统参数中进行配置"); + + } + Optional userInfo = + dingTalkService.getUserInfo(dingTalkUrl, dingTalkAppKey, dingTalkAppSecret, dingTalkTmpAuthCode); + if (userInfo.isPresent()) { + String mobile = userInfo.get().getResult().getMobile(); + if (StringUtils.isEmpty(mobile)) { + ImppExceptionBuilder.newInstance().setErrorCode("0000431").setErrorDetail("用户并未在钉钉中设置手机号 或 钉钉接口权限不足无法获取到手机号"); + } + if (!Arrays.asList(dingTalkWhiteList.split(",")).contains(mobile)) { + ImppExceptionBuilder.newInstance().setErrorCode("0000431").setErrorDetail("对指定手机号允许,权限不足,请联系管理员"); + } + sysUser = userService.getSysUserByPhone(mobile); + if (sysUser == null) { + ImppExceptionBuilder.newInstance().setErrorCode("0000431").setErrorDetail("未根据用户手机在平台中找到相应记录 钉钉获取的手机号为\" + mobile"); + } + } + return sysUser; + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java index 096912b..5556859 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.*; +import cn.estsh.i3plus.core.api.iservice.dto.SysMenuDTO; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ModelEnumUtil; import cn.estsh.i3plus.pojo.model.platform.CommonTreeModel; @@ -8,6 +9,7 @@ import cn.estsh.i3plus.pojo.platform.bean.*; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -627,6 +629,11 @@ public class CoreMemTreeService implements ICoreMemTreeService { return packTreeSysMenuByUserIdAndParentId(userId, CommonEnumUtil.PARENT.DEFAULT.getValue()); } + @Override + public List packTreeDingSysMenuByUserId(Long userId) { + return packTreeDingSysMenuByUserIdAndParentId(userId, CommonEnumUtil.PARENT.DEFAULT.getValue()); + } + /** * 根据用户ID 和 节点ID 查询功能树 * @param userId @@ -648,7 +655,35 @@ public class CoreMemTreeService implements ICoreMemTreeService { LOGGER.info("查询角色关联菜单:{}",refRoleMenuTime - roleTime); if (refRoleMenuList != null && refRoleMenuList.size() > 0) { List menuList = menuService.findAll(); + // 构建菜单树 + List menuRootTree = packTreeSysMenu(menuList, parentId); + // + return packTreeSysMenuBySysRefRoleMenu(menuRootTree, refRoleMenuList); + } + } + return Collections.emptyList(); + } + @Override + public List packTreeDingSysMenuByUserIdAndParentId(Long userId, Long parentId) { + // 查询用户关联角色 + long startTime = System.currentTimeMillis(); + List roleList = personnelService.findSysRefUserRole(userId); + long roleTime = System.currentTimeMillis(); + LOGGER.info("查询用户所关联的角色信息耗时:{}",roleTime - startTime); + + if (roleList != null && roleList.size() > 0) { + // 查询角色关联菜单 + List refRoleMenuList = personnelService.findSysRefRoleMenuByRefUserRole(roleList); + long refRoleMenuTime = System.currentTimeMillis(); + LOGGER.info("查询角色关联菜单:{}",refRoleMenuTime - roleTime); + List menuIdList = refRoleMenuList.stream().map(SysRefRoleMenu::getMenuId).collect(Collectors.toList()); + if (refRoleMenuList != null && refRoleMenuList.size() > 0) { + //todo 暂时先加入一个根节点,避免全查询 + List copyMenuIdList = new ArrayList<>(menuIdList); + // copyMenuIdList.add(100000000l); + // List menuList = menuService.findByIdList(copyMenuIdList); + List menuList = menuService.findAll(); // 构建菜单树 List menuRootTree = packTreeSysMenu(menuList, parentId); // @@ -682,6 +717,22 @@ public class CoreMemTreeService implements ICoreMemTreeService { return packTreeSysMenu(menuList, CommonEnumUtil.PARENT.DEFAULT.getValue()); } + @Override + public List packTreeToDto(List list) { + + List sysMenuDTOList = new ArrayList<>(); + + list.stream().forEach(sysMenu -> { + SysMenuDTO sysMenuDTO = new SysMenuDTO(); + BeanUtils.copyProperties(sysMenu, sysMenuDTO); + if (CollectionUtils.isNotEmpty(sysMenu.getChildList())) { + sysMenuDTO.setChildList(packTreeToDto(sysMenu.getChildList())); + } + sysMenuDTOList.add(sysMenuDTO); + }); + return sysMenuDTOList; + } + /********************************************* End SysMenu Tree *********************************************/ }