diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/constants/SystemConstants.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/constants/SystemConstants.java index 83e158d9b..ba37aa7a6 100644 --- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/constants/SystemConstants.java +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/constants/SystemConstants.java @@ -19,9 +19,14 @@ public interface SystemConstants { String SYSTEM_EXCEPTION_STEP_CODE = "18"; /** - * 一级节点的父节点id是0 + * 一级节点的父节点id */ - Long DEFAULT_PARENT_ID = 0L; + Long DEFAULT_PARENT_ID = -1L; + + /** + * 虚拟的根节点的父级id + */ + Long VIRTUAL_ROOT_PARENT_ID = -2L; /** * pids系列字段,每个id的左分隔符 diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/pojo/menu/SysMenuRequest.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/pojo/menu/SysMenuRequest.java index 91a7fde13..72f951705 100644 --- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/pojo/menu/SysMenuRequest.java +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/pojo/menu/SysMenuRequest.java @@ -62,7 +62,7 @@ public class SysMenuRequest extends BaseRequest { /** * 应用分类(应用编码) */ - @NotBlank(message = "appCode不能为空", groups = {add.class, edit.class, getAppMenus.class}) + @NotBlank(message = "appCode不能为空", groups = {add.class, edit.class, getAppMenusAntdVue.class}) private String appCode; /** @@ -111,9 +111,9 @@ public class SysMenuRequest extends BaseRequest { private String remark; /** - * 获取某个应用的左侧菜单树 + * 获取主页左侧菜单列表(适配Antd Vue的版本) */ - public @interface getAppMenus { + public @interface getAppMenusAntdVue { } } diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/pojo/menu/antd/AntdIndexMenuTreeNode.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/pojo/menu/antd/AntdIndexMenuTreeNode.java index afeb42f18..9150d7789 100644 --- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/pojo/menu/antd/AntdIndexMenuTreeNode.java +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/pojo/menu/antd/AntdIndexMenuTreeNode.java @@ -1,7 +1,10 @@ package cn.stylefeng.roses.kernel.system.pojo.menu.antd; +import cn.stylefeng.roses.kernel.rule.abstracts.AbstractTreeNode; import lombok.Data; +import java.util.List; + /** * 登录菜单 * @@ -9,7 +12,7 @@ import lombok.Data; * @date 2020/4/17 17:35 */ @Data -public class AntdIndexMenuTreeNode { +public class AntdIndexMenuTreeNode implements AbstractTreeNode { /** * id @@ -22,19 +25,14 @@ public class AntdIndexMenuTreeNode { private Long pid; /** - * 路由名称, 必须设置,且不能重名 + * 菜单标题 */ private String name; /** - * 组件 + * 菜单路由 */ - private String component; - - /** - * 重定向地址, 访问这个路由时, 自定进行重定向 - */ - private String redirect; + private String path; /** * 路由元信息(路由附带扩展信息) @@ -42,46 +40,41 @@ public class AntdIndexMenuTreeNode { private Meta meta; /** - * 路径 + * 子级节点 */ - private String path; - - /** - * 控制路由和子路由是否显示在 sidebar - */ - private boolean hidden; + private List children; /** * 路由元信息内部类 */ @Data - public class Meta { + public static class Meta { /** - * 路由标题, 用于显示面包屑, 页面标题 *推荐设置 - */ - public String title; - - /** - * 图标 + * 菜单图标 */ public String icon; /** - * 是否可见 + * 是否隐藏此菜单项, 默认 false,不隐藏 */ - public boolean show; - - /** - * 如需外部打开,增加:_blank - */ - public String target; - - /** - * 内链打开http链接 - */ - public String link; + public Boolean invisible = false; } + @Override + public String getNodeId() { + return this.id.toString(); + } + + @Override + public String getNodeParentId() { + return this.pid.toString(); + } + + @Override + public void setChildrenNodes(List childrenNodes) { + this.children = childrenNodes; + } + } diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/controller/SysMenuController.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/controller/SysMenuController.java index 10d93ae13..d04d95f21 100644 --- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/controller/SysMenuController.java +++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/controller/SysMenuController.java @@ -84,17 +84,6 @@ public class SysMenuController { return new SuccessResponseData(sysMenuService.list(sysMenuRequest)); } - /** - * 获取某个应用的菜单,用于系统顶部切换菜单 - * - * @author fengshuonan - * @date 2020/4/19 15:50 - */ - @GetResource(name = "获取某个应用的菜单", path = "/sysMenu/getAppMenus", requiredPermission = false) - public ResponseData getAppMenus(@Validated(SysMenuRequest.getAppMenus.class) SysMenuRequest sysMenuRequest) { - return new SuccessResponseData(sysMenuService.getAppMenusAntDesign(sysMenuRequest.getAppCode())); - } - /** * 获取系统菜单树,用于新增,编辑时选择上级节点 * @@ -117,4 +106,15 @@ public class SysMenuController { return new SuccessResponseData(sysMenuService.treeForGrant(sysMenuRequest)); } + /** + * 获取主页左侧菜单列表(适配Antd Vue的版本) + * + * @author fengshuonan + * @date 2020/4/19 15:50 + */ + @GetResource(name = "获取主页左侧菜单列表(Antd Vue)", path = "/sysMenu/getIndexMenuAntdVue", requiredPermission = false) + public ResponseData getAppMenus(@Validated(SysMenuRequest.getAppMenusAntdVue.class) SysMenuRequest sysMenuRequest) { + return new SuccessResponseData(sysMenuService.getAntDVueIndexMenus(sysMenuRequest.getAppCode())); + } + } diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/factory/AntdMenusFactory.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/factory/AntdMenusFactory.java index cc0bc7407..c7da84c68 100644 --- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/factory/AntdMenusFactory.java +++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/factory/AntdMenusFactory.java @@ -1,74 +1,76 @@ package cn.stylefeng.roses.kernel.menu.modular.factory; -import cn.hutool.core.collection.CollectionUtil; import cn.stylefeng.roses.kernel.menu.modular.entity.SysMenu; import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum; -import cn.stylefeng.roses.kernel.system.enums.LinkOpenTypeEnum; +import cn.stylefeng.roses.kernel.system.constants.SystemConstants; import cn.stylefeng.roses.kernel.system.pojo.menu.antd.AntdIndexMenuTreeNode; -import cn.stylefeng.roses.kernel.system.pojo.menu.other.MenuSelectTreeNode; +import java.util.ArrayList; import java.util.List; /** - * 针对于antd前端的菜单的组装 + * 针对于antd vue版本的前端菜单的组装 * * @author fengshuonan - * @date 2020/11/23 21:58 + * @date 2020/12/30 20:11 */ public class AntdMenusFactory { /** - * menu实体转化为菜单树节点 + * 将数据库表的菜单,转化为vue antd admin识别的菜单路由格式 * * @author fengshuonan - * @date 2020/11/23 21:54 - */ - public static MenuSelectTreeNode parseMenuBaseTreeNode(SysMenu sysMenu) { - MenuSelectTreeNode menuTreeNode = new MenuSelectTreeNode(); - menuTreeNode.setId(sysMenu.getMenuId()); - menuTreeNode.setParentId(sysMenu.getMenuParentId()); - menuTreeNode.setValue(String.valueOf(sysMenu.getMenuId())); - menuTreeNode.setTitle(sysMenu.getMenuName()); - menuTreeNode.setWeight(sysMenu.getMenuSort()); - return menuTreeNode; - } - - /** - * 将SysMenu格式菜单转换为LoginMenuTreeNode菜单 - * - * @author fengshuonan - * @date 2020/4/17 17:53 + * @date 2020/12/30 20:28 */ public static List convertSysMenuToLoginMenu(List sysMenuList) { - List antDesignMenuTreeNodeList = CollectionUtil.newArrayList(); - sysMenuList.forEach(sysMenu -> { + List antDesignMenuTreeNodeList = new ArrayList<>(sysMenuList.size()); + + // 添加根节点 + antDesignMenuTreeNodeList.add(createRootMenuNode()); + + for (SysMenu sysMenu : sysMenuList) { AntdIndexMenuTreeNode antdIndexMenuTreeNode = new AntdIndexMenuTreeNode(); - antdIndexMenuTreeNode.setComponent(sysMenu.getComponent()); + + // 设置菜单id antdIndexMenuTreeNode.setId(sysMenu.getMenuId()); - antdIndexMenuTreeNode.setName(sysMenu.getMenuCode()); - antdIndexMenuTreeNode.setPath(sysMenu.getRouter()); + + // 设置父级id antdIndexMenuTreeNode.setPid(sysMenu.getMenuParentId()); - AntdIndexMenuTreeNode.Meta mateItem = new AntdIndexMenuTreeNode().new Meta(); + + // 菜单名称 + antdIndexMenuTreeNode.setName(sysMenu.getMenuName()); + + // 菜单路由地址 + antdIndexMenuTreeNode.setPath(sysMenu.getRouter()); + + AntdIndexMenuTreeNode.Meta mateItem = new AntdIndexMenuTreeNode.Meta(); + + // 菜单图标 mateItem.setIcon(sysMenu.getIcon()); - mateItem.setTitle(sysMenu.getMenuName()); - mateItem.setLink(sysMenu.getLinkUrl()); - // 是否可见 - mateItem.setShow(YesOrNotEnum.Y.getCode().equals(sysMenu.getVisible())); - - // 是否是外链 - if (LinkOpenTypeEnum.INNER.getCode().equals(sysMenu.getLinkOpenType())) { - - // 打开外链 - mateItem.setTarget("_blank"); - antdIndexMenuTreeNode.setPath(sysMenu.getLinkUrl()); - antdIndexMenuTreeNode.setRedirect(sysMenu.getLinkUrl()); - - } + // 设置是否隐藏,true就是隐藏 + mateItem.setInvisible(YesOrNotEnum.N.getCode().equals(sysMenu.getVisible())); antdIndexMenuTreeNode.setMeta(mateItem); + antDesignMenuTreeNodeList.add(antdIndexMenuTreeNode); - }); + } + return antDesignMenuTreeNodeList; } + /** + * 创建虚拟的根节点信息 + * + * @author fengshuonan + * @date 2020/12/30 20:38 + */ + private static AntdIndexMenuTreeNode createRootMenuNode() { + AntdIndexMenuTreeNode antdIndexMenuTreeNode = new AntdIndexMenuTreeNode(); + antdIndexMenuTreeNode.setId(SystemConstants.DEFAULT_PARENT_ID); + antdIndexMenuTreeNode.setPid(SystemConstants.VIRTUAL_ROOT_PARENT_ID); + antdIndexMenuTreeNode.setName("根虚拟节点"); + antdIndexMenuTreeNode.setPath("/"); + return antdIndexMenuTreeNode; + } + } diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/factory/common/CommonMenusFactory.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/factory/common/CommonMenusFactory.java new file mode 100644 index 000000000..46ed60678 --- /dev/null +++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/factory/common/CommonMenusFactory.java @@ -0,0 +1,30 @@ +package cn.stylefeng.roses.kernel.menu.modular.factory.common; + +import cn.stylefeng.roses.kernel.menu.modular.entity.SysMenu; +import cn.stylefeng.roses.kernel.system.pojo.menu.other.MenuSelectTreeNode; + +/** + * 针对于antd前端的菜单的组装 + * + * @author fengshuonan + * @date 2020/11/23 21:58 + */ +public class CommonMenusFactory { + + /** + * menu实体转化为菜单树节点 + * + * @author fengshuonan + * @date 2020/11/23 21:54 + */ + public static MenuSelectTreeNode parseMenuBaseTreeNode(SysMenu sysMenu) { + MenuSelectTreeNode menuTreeNode = new MenuSelectTreeNode(); + menuTreeNode.setId(sysMenu.getMenuId()); + menuTreeNode.setParentId(sysMenu.getMenuParentId()); + menuTreeNode.setValue(String.valueOf(sysMenu.getMenuId())); + menuTreeNode.setTitle(sysMenu.getMenuName()); + menuTreeNode.setWeight(sysMenu.getMenuSort()); + return menuTreeNode; + } + +} diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/service/SysMenuService.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/service/SysMenuService.java index a1e2ea902..780c74254 100644 --- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/service/SysMenuService.java +++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/service/SysMenuService.java @@ -121,7 +121,7 @@ public interface SysMenuService extends IService { * @author fengshuonan * @date 2020/4/17 17:48 */ - List getAppMenusAntDesign(String appCode); + List getAntDVueIndexMenus(String appCode); /** * 获取系统菜单树,用于新增,编辑时选择上级节点 diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/service/impl/SysMenuServiceImpl.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/service/impl/SysMenuServiceImpl.java index 2bbfe5a6d..6eddcfea0 100644 --- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/service/impl/SysMenuServiceImpl.java +++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/menu/modular/service/impl/SysMenuServiceImpl.java @@ -35,6 +35,7 @@ import cn.stylefeng.roses.kernel.db.api.DbOperatorApi; import cn.stylefeng.roses.kernel.menu.modular.entity.SysMenu; import cn.stylefeng.roses.kernel.menu.modular.factory.AntdMenusFactory; import cn.stylefeng.roses.kernel.menu.modular.factory.LayuiMenusFactory; +import cn.stylefeng.roses.kernel.menu.modular.factory.common.CommonMenusFactory; import cn.stylefeng.roses.kernel.menu.modular.mapper.SysMenuMapper; import cn.stylefeng.roses.kernel.menu.modular.service.SysMenuService; import cn.stylefeng.roses.kernel.rule.enums.StatusEnum; @@ -192,13 +193,16 @@ public class SysMenuServiceImpl extends ServiceImpl impl } @Override - public List getAppMenusAntDesign(String appCode) { + public List getAntDVueIndexMenus(String appCode) { // 获取当前用户的所有菜单 List currentUserMenus = this.getCurrentUserMenus(appCode); // 转换成登录菜单格式 - return AntdMenusFactory.convertSysMenuToLoginMenu(currentUserMenus); + List antdIndexMenuTreeNodes = AntdMenusFactory.convertSysMenuToLoginMenu(currentUserMenus); + + // 转化成树结构 + return new DefaultTreeBuildFactory(SystemConstants.VIRTUAL_ROOT_PARENT_ID.toString()).doTreeBuild(antdIndexMenuTreeNodes); } @Override @@ -207,7 +211,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl LambdaQueryWrapper wrapper = createWrapper(sysMenuRequest); this.list(wrapper).forEach(sysMenu -> { - MenuSelectTreeNode menuTreeNode = AntdMenusFactory.parseMenuBaseTreeNode(sysMenu); + MenuSelectTreeNode menuTreeNode = CommonMenusFactory.parseMenuBaseTreeNode(sysMenu); menuTreeNodeList.add(menuTreeNode); }); @@ -230,7 +234,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl } this.list(wrapper).forEach(sysMenu -> { - MenuSelectTreeNode menuTreeNode = AntdMenusFactory.parseMenuBaseTreeNode(sysMenu); + MenuSelectTreeNode menuTreeNode = CommonMenusFactory.parseMenuBaseTreeNode(sysMenu); menuTreeNodeList.add(menuTreeNode); }); diff --git a/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/resource/modular/service/impl/SysResourceServiceImpl.java b/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/resource/modular/service/impl/SysResourceServiceImpl.java index 989ca4d14..262bf5ab2 100644 --- a/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/resource/modular/service/impl/SysResourceServiceImpl.java +++ b/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/resource/modular/service/impl/SysResourceServiceImpl.java @@ -14,6 +14,7 @@ import cn.stylefeng.roses.kernel.resource.modular.pojo.ResourceTreeNode; import cn.stylefeng.roses.kernel.resource.modular.service.SysResourceService; import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum; import cn.stylefeng.roses.kernel.system.ResourceServiceApi; +import cn.stylefeng.roses.kernel.system.constants.SystemConstants; import cn.stylefeng.roses.kernel.system.pojo.resource.request.ResourceRequest; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -28,8 +29,6 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.*; import java.util.stream.Collectors; -import static cn.stylefeng.roses.kernel.system.constants.SystemConstants.DEFAULT_PARENT_ID; - /** * 资源表 服务实现类 * @@ -282,7 +281,7 @@ public class SysResourceServiceImpl extends ServiceImpl> modularResources = appModularResources.get(appName);