diff --git a/db/update.sql b/db/update.sql new file mode 100644 index 000000000..3bde6b23e --- /dev/null +++ b/db/update.sql @@ -0,0 +1,2 @@ +-- 更新历史菜单排序避免空指针 +UPDATE `sys_menu` SET `sort`=1 WHERE ISNULL(`sort`) diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxTokenDealServiceImpl.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxTokenDealServiceImpl.java index 737aa79b7..dd83cd60c 100644 --- a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxTokenDealServiceImpl.java +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxTokenDealServiceImpl.java @@ -144,7 +144,7 @@ public class PigxTokenDealServiceImpl { try { cursor.close(); } - catch (IOException e) { + catch (Exception e) { log.error("关闭cursor 失败"); } return result; diff --git a/pigx-common/pigx-common-log/src/main/resources/META-INF/spring.factories b/pigx-common/pigx-common-log/src/main/resources/META-INF/spring.factories index b9931ece1..cb83cd112 100644 --- a/pigx-common/pigx-common-log/src/main/resources/META-INF/spring.factories +++ b/pigx-common/pigx-common-log/src/main/resources/META-INF/spring.factories @@ -1,4 +1,4 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.pig4cloud.pigx.common.log.LogAutoConfiguration -org.springframework.context.ApplicationContextInitializer=\ +org.springframework.boot.env.EnvironmentPostProcessor=\ com.pig4cloud.pigx.common.log.init.ApplicationLoggerInitializer \ No newline at end of file diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/DeptTree.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/DeptTree.java deleted file mode 100644 index 3ab54fddb..000000000 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/DeptTree.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - * - */ - -package com.pig4cloud.pigx.admin.api.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 部门树对象 - * - * @author lengleng - * @date 2020-06-19 - */ -@Data -@ApiModel(value = "部门树") -@EqualsAndHashCode(callSuper = true) -public class DeptTree extends TreeNode { - - @ApiModelProperty(value = "部门名称") - private String name; - - /** - * 是否显示被锁定 - */ - private Boolean isLock = true; - -} diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/MenuTree.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/MenuTree.java deleted file mode 100644 index 617e6e111..000000000 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/MenuTree.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - * - */ - -package com.pig4cloud.pigx.admin.api.dto; - -import com.pig4cloud.pigx.admin.api.vo.MenuVO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * @author lengleng - * @date 2017年11月9日23:33:27 - */ -@Data -@ApiModel(value = "菜单树") -@EqualsAndHashCode(callSuper = true) -public class MenuTree extends TreeNode implements Serializable { - - /** - * 菜单图标 - */ - @ApiModelProperty(value = "菜单图标") - private String icon; - - /** - * 菜单名称 - */ - @ApiModelProperty(value = "菜单名称") - private String name; - - private boolean spread = false; - - /** - * 前端路由标识路径 - */ - @ApiModelProperty(value = "前端路由标识路径") - private String path; - - /** - * 路由缓冲 - */ - @ApiModelProperty(value = "路由缓冲") - private String keepAlive; - - /** - * 权限编码 - */ - @ApiModelProperty(value = "权限编码") - private String permission; - - /** - * 菜单类型 (0菜单 1按钮) - */ - @ApiModelProperty(value = "菜单类型,0:菜单 1:按钮") - private String type; - - /** - * 菜单标签 - */ - @ApiModelProperty(value = "菜单标签") - private String label; - - /** - * 排序值 - */ - @ApiModelProperty(value = "排序值") - private Integer sort; - - /** - * 是否包含子节点 - * - * @since 3.7 - */ - private Boolean hasChildren; - - public MenuTree() { - } - - public MenuTree(int id, String name, int parentId) { - this.id = id; - this.parentId = parentId; - this.name = name; - this.label = name; - } - - public MenuTree(int id, String name, MenuTree parent) { - this.id = id; - this.parentId = parent.getId(); - this.name = name; - this.label = name; - } - - public MenuTree(MenuVO menuVo) { - this.id = menuVo.getMenuId(); - this.parentId = menuVo.getParentId(); - this.icon = menuVo.getIcon(); - this.name = menuVo.getName(); - this.path = menuVo.getPath(); - this.type = menuVo.getType(); - this.permission = menuVo.getPermission(); - this.label = menuVo.getName(); - this.sort = menuVo.getSort(); - this.keepAlive = menuVo.getKeepAlive(); - } - -} diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/TreeNode.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/TreeNode.java deleted file mode 100644 index e0022f4cb..000000000 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/dto/TreeNode.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - * - */ - -package com.pig4cloud.pigx.admin.api.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author lengleng - * @date 2017年11月9日23:33:45 - */ -@Data -@ApiModel(value = "树形节点") -public class TreeNode { - - @ApiModelProperty(value = "当前节点id") - protected int id; - - @ApiModelProperty(value = "父节点id") - protected int parentId; - - @ApiModelProperty(value = "子节点列表") - protected List children = new ArrayList(); - - public void add(TreeNode node) { - children.add(node); - } - -} diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/util/TreeUtil.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/util/TreeUtil.java deleted file mode 100644 index 4a1409981..000000000 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/util/TreeUtil.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - * - */ - -package com.pig4cloud.pigx.admin.api.util; - -import com.pig4cloud.pigx.admin.api.dto.MenuTree; -import com.pig4cloud.pigx.admin.api.dto.TreeNode; -import com.pig4cloud.pigx.admin.api.entity.SysMenu; -import lombok.experimental.UtilityClass; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author lengleng - * @date 2020-02-09 - */ -@UtilityClass -public class TreeUtil { - - /** - * 两层循环实现建树 - * @param treeNodes 传入的树节点列表 - * @return - */ - public List build(List treeNodes, Object root) { - - List trees = new ArrayList<>(); - - for (T treeNode : treeNodes) { - - if (root.equals(treeNode.getParentId())) { - trees.add(treeNode); - } - - for (T it : treeNodes) { - if (it.getParentId() == treeNode.getId()) { - if (treeNode.getChildren() == null) { - treeNode.setChildren(new ArrayList<>()); - } - treeNode.add(it); - } - } - } - return trees; - } - - /** - * 使用递归方法建树 - * @param treeNodes - * @return - */ - public List buildByRecursive(List treeNodes, Object root) { - List trees = new ArrayList(); - for (T treeNode : treeNodes) { - if (root.equals(treeNode.getParentId())) { - trees.add(findChildren(treeNode, treeNodes)); - } - } - return trees; - } - - /** - * 递归查找子节点 - * @param treeNodes - * @return - */ - public T findChildren(T treeNode, List treeNodes) { - for (T it : treeNodes) { - if (treeNode.getId() == it.getParentId()) { - if (treeNode.getChildren() == null) { - treeNode.setChildren(new ArrayList<>()); - } - treeNode.add(findChildren(it, treeNodes)); - } - } - return treeNode; - } - - /** - * 通过sysMenu创建树形节点 - * @param menus - * @param root - * @return - */ - public List buildTree(List menus, int root) { - List trees = new ArrayList<>(); - MenuTree node; - for (SysMenu menu : menus) { - node = new MenuTree(); - node.setId(menu.getMenuId()); - node.setParentId(menu.getParentId()); - node.setName(menu.getName()); - node.setPath(menu.getPath()); - node.setPermission(menu.getPermission()); - node.setLabel(menu.getName()); - node.setIcon(menu.getIcon()); - node.setType(menu.getType()); - node.setSort(menu.getSort()); - node.setHasChildren(true); - node.setKeepAlive(menu.getKeepAlive()); - trees.add(node); - } - return TreeUtil.build(trees, root); - } - -} diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/MenuVO.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/MenuVO.java deleted file mode 100644 index e059ef0c3..000000000 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/MenuVO.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - * - */ - -package com.pig4cloud.pigx.admin.api.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 菜单权限表 - *

- * - * @author lengleng - * @since 2017-11-08 - */ -@Data -@ApiModel(value = "菜单展示对象") -public class MenuVO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 菜单ID - */ - @ApiModelProperty(value = "菜单id") - private Integer menuId; - - /** - * 菜单名称 - */ - @ApiModelProperty(value = "菜单名称") - private String name; - - /** - * 菜单权限标识 - */ - @ApiModelProperty(value = "菜单权限标识") - private String permission; - - /** - * 父菜单ID - */ - @ApiModelProperty(value = "父菜单id") - private Integer parentId; - - /** - * 图标 - */ - @ApiModelProperty(value = "图标") - private String icon; - - /** - * 前端路由标识路径 - */ - @ApiModelProperty(value = "前端路由标识路径") - private String path; - - /** - * 排序值 - */ - @ApiModelProperty(value = "排序值") - private Integer sort; - - /** - * 菜单类型 (0菜单 1按钮) - */ - @ApiModelProperty(value = "菜单类型,0:菜单 1:按钮") - private String type; - - /** - * 是否缓冲 - */ - @ApiModelProperty(value = "路由缓冲") - private String keepAlive; - - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间") - private LocalDateTime createTime; - - /** - * 更新时间 - */ - @ApiModelProperty(value = "更新时间") - private LocalDateTime updateTime; - - /** - * 0--正常 1--删除 - */ - @ApiModelProperty(value = "删除标记,1:已删除,0:正常") - private String delFlag; - - @Override - public int hashCode() { - return menuId.hashCode(); - } - - /** - * menuId 相同则相同 - * @param obj - * @return - */ - @Override - public boolean equals(Object obj) { - if (obj instanceof MenuVO) { - Integer targetMenuId = ((MenuVO) obj).getMenuId(); - return menuId.equals(targetMenuId); - } - return super.equals(obj); - } - -} diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMenuController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMenuController.java index c51bc6afe..24887bbea 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMenuController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysMenuController.java @@ -20,7 +20,6 @@ package com.pig4cloud.pigx.admin.controller; import com.pig4cloud.pigx.admin.api.entity.SysMenu; -import com.pig4cloud.pigx.admin.api.vo.MenuVO; import com.pig4cloud.pigx.admin.service.SysMenuService; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.log.annotation.SysLog; @@ -57,7 +56,7 @@ public class SysMenuController { public R getUserMenu(String type, Integer parentId) { // 获取符合条件的菜单 - Set all = new HashSet<>(); + Set all = new HashSet<>(); SecurityUtils.getRoles().forEach(roleId -> all.addAll(sysMenuService.findMenuByRoleId(roleId))); return R.ok(sysMenuService.filterMenu(all, type, parentId)); } @@ -81,7 +80,7 @@ public class SysMenuController { @GetMapping("/tree/{roleId}") public R getRoleTree(@PathVariable Integer roleId) { return R.ok( - sysMenuService.findMenuByRoleId(roleId).stream().map(MenuVO::getMenuId).collect(Collectors.toList())); + sysMenuService.findMenuByRoleId(roleId).stream().map(SysMenu::getMenuId).collect(Collectors.toList())); } /** diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysMenuMapper.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysMenuMapper.java index 98cf57667..c7c9cdf05 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysMenuMapper.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysMenuMapper.java @@ -20,7 +20,6 @@ package com.pig4cloud.pigx.admin.mapper; import com.pig4cloud.pigx.admin.api.entity.SysMenu; -import com.pig4cloud.pigx.admin.api.vo.MenuVO; import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -42,7 +41,7 @@ public interface SysMenuMapper extends PigxBaseMapper { * @param roleId 角色ID * @return */ - List listMenusByRoleId(Integer roleId); + List listMenusByRoleId(Integer roleId); /** * 通过角色ID查询权限 diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java index 477ed9173..c2de05ea8 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java @@ -19,8 +19,8 @@ package com.pig4cloud.pigx.admin.service; +import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pigx.admin.api.dto.DeptTree; import com.pig4cloud.pigx.admin.api.entity.SysDept; import java.util.List; @@ -39,7 +39,7 @@ public interface SysDeptService extends IService { * 查询部门树菜单 * @return 树 */ - List selectTree(); + List> selectTree(); /** * 添加信息部门 diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMenuService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMenuService.java index 2dc6f6a58..4311757ad 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMenuService.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysMenuService.java @@ -19,10 +19,9 @@ package com.pig4cloud.pigx.admin.service; +import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.extension.service.IService; -import com.pig4cloud.pigx.admin.api.dto.MenuTree; import com.pig4cloud.pigx.admin.api.entity.SysMenu; -import com.pig4cloud.pigx.admin.api.vo.MenuVO; import com.pig4cloud.pigx.common.core.util.R; import java.util.List; @@ -43,7 +42,7 @@ public interface SysMenuService extends IService { * @param roleId 角色ID * @return 菜单列表 */ - List findMenuByRoleId(Integer roleId); + List findMenuByRoleId(Integer roleId); /** * 级联删除菜单 @@ -65,7 +64,7 @@ public interface SysMenuService extends IService { * @param parentId 父节点ID * @return */ - List treeMenu(boolean lazy, Integer parentId); + List> treeMenu(boolean lazy, Integer parentId); /** * 查询菜单 @@ -73,6 +72,6 @@ public interface SysMenuService extends IService { * @param parentId * @return */ - List filterMenu(Set voSet, String type, Integer parentId); + List> filterMenu(Set voSet, String type, Integer parentId); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java index 0862ed44c..c0f92d6c8 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java @@ -20,12 +20,14 @@ package com.pig4cloud.pigx.admin.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.map.MapUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.pig4cloud.pigx.admin.api.dto.DeptTree; import com.pig4cloud.pigx.admin.api.entity.SysDept; import com.pig4cloud.pigx.admin.api.entity.SysDeptRelation; -import com.pig4cloud.pigx.admin.api.util.TreeUtil; import com.pig4cloud.pigx.admin.mapper.SysDeptMapper; import com.pig4cloud.pigx.admin.service.SysDeptRelationService; import com.pig4cloud.pigx.admin.service.SysDeptService; @@ -115,7 +117,7 @@ public class SysDeptServiceImpl extends ServiceImpl impl * @return 树 */ @Override - public List selectTree() { + public List> selectTree() { // 查询全部部门 List deptAllList = deptMapper.selectList(Wrappers.emptyWrapper()); // 查询数据权限内部门 @@ -123,19 +125,20 @@ public class SysDeptServiceImpl extends ServiceImpl impl .map(SysDept::getDeptId).collect(Collectors.toList()); // 权限内部门 - List collect = deptAllList.stream().filter(dept -> dept.getDeptId().intValue() != dept.getParentId()) + List> collect = deptAllList.stream() + .filter(dept -> dept.getDeptId().intValue() != dept.getParentId()) .sorted(Comparator.comparingInt(SysDept::getSort)).map(dept -> { - DeptTree node = new DeptTree(); - node.setId(dept.getDeptId()); - node.setParentId(dept.getParentId()); - node.setName(dept.getName()); - + TreeNode treeNode = new TreeNode(); + treeNode.setId(dept.getDeptId()); + treeNode.setParentId(dept.getParentId()); + treeNode.setName(dept.getName()); // 有权限不返回标识 if (deptOwnIdList.contains(dept.getDeptId())) { - node.setIsLock(Boolean.FALSE); + treeNode.setExtra(MapUtil.of("isLock", Boolean.FALSE)); } - return node; + return treeNode; }).collect(Collectors.toList()); + return TreeUtil.build(collect, 0); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java index 2f00cde3d..8e7c7caa6 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java @@ -20,13 +20,13 @@ package com.pig4cloud.pigx.admin.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.pig4cloud.pigx.admin.api.dto.MenuTree; import com.pig4cloud.pigx.admin.api.entity.SysMenu; import com.pig4cloud.pigx.admin.api.entity.SysRoleMenu; -import com.pig4cloud.pigx.admin.api.vo.MenuVO; -import com.pig4cloud.pigx.admin.api.util.TreeUtil; import com.pig4cloud.pigx.admin.mapper.SysMenuMapper; import com.pig4cloud.pigx.admin.mapper.SysRoleMenuMapper; import com.pig4cloud.pigx.admin.service.SysMenuService; @@ -35,14 +35,17 @@ import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.core.constant.enums.MenuTypeEnum; import com.pig4cloud.pigx.common.core.util.R; import lombok.AllArgsConstructor; +import org.jetbrains.annotations.NotNull; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -62,7 +65,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override @Cacheable(value = CacheConstants.MENU_DETAILS, key = "#roleId", unless = "#result.isEmpty()") - public List findMenuByRoleId(Integer roleId) { + public List findMenuByRoleId(Integer roleId) { return baseMapper.listMenusByRoleId(roleId); } @@ -94,18 +97,23 @@ public class SysMenuServiceImpl extends ServiceImpl impl * @return */ @Override - public List treeMenu(boolean lazy, Integer parentId) { + public List> treeMenu(boolean lazy, Integer parentId) { if (!lazy) { - return TreeUtil.buildTree( - baseMapper.selectList(Wrappers.lambdaQuery().orderByAsc(SysMenu::getSort)), - CommonConstants.MENU_TREE_ROOT_ID); + List> collect = baseMapper + .selectList(Wrappers.lambdaQuery().orderByAsc(SysMenu::getSort)).stream() + .map(getNodeFunction()).collect(Collectors.toList()); + + return TreeUtil.build(collect, CommonConstants.MENU_TREE_ROOT_ID); } Integer parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; - return TreeUtil.buildTree( - baseMapper.selectList( - Wrappers.lambdaQuery().eq(SysMenu::getParentId, parent).orderByAsc(SysMenu::getSort)), - parent); + + List> collect = baseMapper + .selectList( + Wrappers.lambdaQuery().eq(SysMenu::getParentId, parent).orderByAsc(SysMenu::getSort)) + .stream().map(getNodeFunction()).collect(Collectors.toList()); + + return TreeUtil.build(collect, parent); } /** @@ -116,11 +124,33 @@ public class SysMenuServiceImpl extends ServiceImpl impl * @return */ @Override - public List filterMenu(Set all, String type, Integer parentId) { - List menuTreeList = all.stream().filter(menuTypePredicate(type)).map(MenuTree::new) - .sorted(Comparator.comparingInt(MenuTree::getSort)).collect(Collectors.toList()); + public List> filterMenu(Set all, String type, Integer parentId) { + List> collect = all.stream().filter(menuTypePredicate(type)).map(getNodeFunction()) + .collect(Collectors.toList()); Integer parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; - return TreeUtil.build(menuTreeList, parent); + return TreeUtil.build(collect, parent); + } + + @NotNull + private Function> getNodeFunction() { + return menu -> { + TreeNode node = new TreeNode<>(); + node.setId(menu.getMenuId()); + node.setName(menu.getName()); + node.setParentId(menu.getParentId()); + node.setWeight(menu.getSort()); + // 扩展属性 + Map extra = new HashMap<>(); + extra.put("icon", menu.getIcon()); + extra.put("path", menu.getPath()); + extra.put("type", menu.getType()); + extra.put("permission", menu.getPermission()); + extra.put("label", menu.getName()); + extra.put("sort", menu.getSort()); + extra.put("keepAlive", menu.getKeepAlive()); + node.setExtra(extra); + return node; + }; } /** @@ -128,7 +158,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl * @param type 类型 * @return Predicate */ - private Predicate menuTypePredicate(String type) { + private Predicate menuTypePredicate(String type) { return vo -> { if (MenuTypeEnum.TOP_MENU.getDescription().equals(type)) { return MenuTypeEnum.TOP_MENU.getType().equals(vo.getType()); diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java index 543b767ce..0431c055d 100755 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java @@ -16,12 +16,9 @@ */ package com.pig4cloud.pigx.admin.service.impl; -import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.pig4cloud.pigx.admin.api.dto.MenuTree; import com.pig4cloud.pigx.admin.api.entity.*; -import com.pig4cloud.pigx.admin.api.util.TreeUtil; import com.pig4cloud.pigx.admin.mapper.SysRoleMenuMapper; import com.pig4cloud.pigx.admin.mapper.SysTenantMapper; import com.pig4cloud.pigx.admin.service.*; @@ -30,7 +27,6 @@ import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.data.resolver.ParamResolver; import com.pig4cloud.pigx.common.data.tenant.TenantBroker; import lombok.AllArgsConstructor; -import org.springframework.beans.BeanUtils; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -159,8 +155,7 @@ public class SysTenantServiceImpl extends ServiceImpl newMenuList = menuService.list(); // 查询全部菜单,构造角色菜单关系 @@ -189,21 +184,19 @@ public class SysTenantServiceImpl extends ServiceImpl nodeList, Integer parent) { - for (MenuTree node : nodeList) { - SysMenu menu = new SysMenu(); - BeanUtils.copyProperties(node, menu, "parentId"); - menu.setParentId(parent); + private void saveTenantMenu(List menuList, Integer originParentId, Integer targetParentId) { + menuList.stream().filter(menu -> menu.getParentId().equals(originParentId)).forEach(menu -> { + // 保存菜单原始menuId, 方便查询子节点使用 + Integer originMenuId = menu.getMenuId(); + menu.setParentId(targetParentId); menuService.save(menu); - if (CollUtil.isNotEmpty(node.getChildren())) { - List childrenList = node.getChildren().stream().map(treeNode -> (MenuTree) treeNode) - .collect(Collectors.toList()); - saveTenantMenu(childrenList, menu.getMenuId()); - } - } + // 查找此节点的子节点,然后子节点的重新插入父节点更改为新的menuId + saveTenantMenu(menuList, originMenuId, menu.getMenuId()); + }); } } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java index 9f9e45cf4..38e8915b5 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java @@ -19,12 +19,6 @@ package com.pig4cloud.pigx.admin.service.impl; -import java.time.LocalDateTime; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -33,20 +27,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pigx.admin.api.dto.UserDTO; import com.pig4cloud.pigx.admin.api.dto.UserInfo; -import com.pig4cloud.pigx.admin.api.entity.SysDept; -import com.pig4cloud.pigx.admin.api.entity.SysDeptRelation; -import com.pig4cloud.pigx.admin.api.entity.SysRole; -import com.pig4cloud.pigx.admin.api.entity.SysUser; -import com.pig4cloud.pigx.admin.api.entity.SysUserRole; -import com.pig4cloud.pigx.admin.api.vo.MenuVO; +import com.pig4cloud.pigx.admin.api.entity.*; import com.pig4cloud.pigx.admin.api.vo.UserVO; import com.pig4cloud.pigx.admin.mapper.SysUserMapper; -import com.pig4cloud.pigx.admin.service.SysDeptRelationService; -import com.pig4cloud.pigx.admin.service.SysDeptService; -import com.pig4cloud.pigx.admin.service.SysMenuService; -import com.pig4cloud.pigx.admin.service.SysRoleService; -import com.pig4cloud.pigx.admin.service.SysUserRoleService; -import com.pig4cloud.pigx.admin.service.SysUserService; +import com.pig4cloud.pigx.admin.service.*; import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.core.util.R; @@ -61,6 +45,12 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + /** * @author lengleng * @date 2017/10/31 @@ -122,7 +112,7 @@ public class SysUserServiceImpl extends ServiceImpl impl Set permissions = new HashSet<>(); roleIds.forEach(roleId -> { List permissionList = sysMenuService.findMenuByRoleId(roleId).stream() - .filter(menuVo -> StrUtil.isNotEmpty(menuVo.getPermission())).map(MenuVO::getPermission) + .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())).map(SysMenu::getPermission) .collect(Collectors.toList()); permissions.addAll(permissionList); }); diff --git a/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysMenuMapper.xml b/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysMenuMapper.xml index 194f65bcc..c61510f40 100644 --- a/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysMenuMapper.xml +++ b/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysMenuMapper.xml @@ -37,23 +37,8 @@ - - - - - - - - - - - - - - - - SELECT sys_menu.* FROM diff --git a/pom.xml b/pom.xml index ac5893cfe..a7906eac9 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ - 2.4.5 + 2.5.0 2020.0.2 2021.1 UTF-8