diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/service/SysAppService.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/service/SysAppService.java index a6b31fa58..80810a647 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/service/SysAppService.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/service/SysAppService.java @@ -3,6 +3,7 @@ package cn.stylefeng.roses.kernel.sys.modular.app.service; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; import cn.stylefeng.roses.kernel.sys.modular.app.entity.SysApp; import cn.stylefeng.roses.kernel.sys.modular.app.pojo.request.SysAppRequest; +import cn.stylefeng.roses.kernel.sys.modular.menu.pojo.response.AppGroupDetail; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -79,4 +80,12 @@ public interface SysAppService extends IService { */ PageResult findPage(SysAppRequest sysAppRequest); + /** + * 获取启用的应用列表(用在给菜单界面用) + * + * @author fengshuonan + * @since 2023/6/14 21:48 + */ + List getAppList(); + } \ No newline at end of file diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/service/impl/SysAppServiceImpl.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/service/impl/SysAppServiceImpl.java index dbb780ba8..4e845f6ce 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/service/impl/SysAppServiceImpl.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/app/service/impl/SysAppServiceImpl.java @@ -7,12 +7,14 @@ import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory; import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; +import cn.stylefeng.roses.kernel.rule.enums.StatusEnum; import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; import cn.stylefeng.roses.kernel.sys.modular.app.entity.SysApp; import cn.stylefeng.roses.kernel.sys.modular.app.enums.SysAppExceptionEnum; import cn.stylefeng.roses.kernel.sys.modular.app.mapper.SysAppMapper; import cn.stylefeng.roses.kernel.sys.modular.app.pojo.request.SysAppRequest; import cn.stylefeng.roses.kernel.sys.modular.app.service.SysAppService; +import cn.stylefeng.roses.kernel.sys.modular.menu.pojo.response.AppGroupDetail; import cn.stylefeng.roses.kernel.sys.modular.menu.service.SysMenuService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -21,6 +23,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -99,6 +102,29 @@ public class SysAppServiceImpl extends ServiceImpl impleme return PageResultFactory.createPageResult(sysAppPage); } + @Override + public List getAppList() { + + LambdaQueryWrapper wrapper = this.createWrapper(new SysAppRequest()); + + // 只查询启用的 + wrapper.eq(SysApp::getStatusFlag, StatusEnum.ENABLE.getCode()); + + // 查询有效字段 + wrapper.select(SysApp::getAppId, SysApp::getAppName, SysApp::getAppIcon, SysApp::getRemark); + + List appList = this.list(wrapper); + + // 结果转化为指定格式 + ArrayList appGroupDetails = new ArrayList<>(); + for (SysApp sysApp : appList) { + AppGroupDetail appGroupDetail = new AppGroupDetail(sysApp.getAppId(), sysApp.getAppName(), sysApp.getAppIcon(), sysApp.getRemark()); + appGroupDetails.add(appGroupDetail); + } + + return appGroupDetails; + } + @Override public List findList(SysAppRequest sysAppRequest) { LambdaQueryWrapper wrapper = this.createWrapper(sysAppRequest); diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/factory/MenuFactory.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/factory/MenuFactory.java new file mode 100644 index 000000000..78dfc3f5e --- /dev/null +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/factory/MenuFactory.java @@ -0,0 +1,60 @@ +package cn.stylefeng.roses.kernel.sys.modular.menu.factory; + +import cn.stylefeng.roses.kernel.rule.constants.TreeConstants; +import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 菜单信息组装工厂 + * + * @author fengshuonan + * @since 2023/6/14 22:05 + */ +public class MenuFactory { + + /** + * 获取指定参数的菜单集合,缺失的所有的父级菜单id + *

+ * 此方法用在菜单管理界面,带搜索条件查询时,组装菜单树使用 + * + * @author fengshuonan + * @since 2023/6/14 22:05 + */ + public static Set getMenuParentIds(List sysMenus) { + + // 已经有的菜单id集合 + Set alreadyMenuIdList = sysMenus.stream().map(SysMenu::getMenuId).collect(Collectors.toSet()); + + // 需要补全的父级id集合 + Set needToAddResult = new HashSet<>(); + + // 遍历菜单,找到所有的菜单父级集合 + for (SysMenu sysMenu : sysMenus) { + String menuPidsStr = sysMenu.getMenuPids(); + + // 去掉中括号符号 + menuPidsStr = menuPidsStr.replaceAll("\\[", ""); + menuPidsStr = menuPidsStr.replaceAll("]", ""); + + // 获取所有上级id列表 + String[] menuParentIdList = menuPidsStr.split(","); + + // 查找到缺失的父级id + for (String parentMenuIdItem : menuParentIdList) { + Long menuId = Long.valueOf(parentMenuIdItem); + if (!alreadyMenuIdList.contains(menuId)) { + if (!parentMenuIdItem.equals(TreeConstants.DEFAULT_PARENT_ID.toString())) { + needToAddResult.add(menuId); + } + } + } + } + + return needToAddResult; + } + +} diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/pojo/response/AppGroupDetail.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/pojo/response/AppGroupDetail.java index a9f529644..24d0beb16 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/pojo/response/AppGroupDetail.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/pojo/response/AppGroupDetail.java @@ -40,4 +40,13 @@ public class AppGroupDetail { */ private List menuList; + public AppGroupDetail() { + } + + public AppGroupDetail(Long appId, String appName, Long appIcon, String remark) { + this.appId = appId; + this.appName = appName; + this.appIcon = appIcon; + this.remark = remark; + } } diff --git a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/service/impl/SysMenuServiceImpl.java b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/service/impl/SysMenuServiceImpl.java index 69ffd0810..fe62c378b 100644 --- a/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/service/impl/SysMenuServiceImpl.java +++ b/kernel-s-sys/sys-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/menu/service/impl/SysMenuServiceImpl.java @@ -4,8 +4,10 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; +import cn.stylefeng.roses.kernel.sys.modular.app.service.SysAppService; import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu; import cn.stylefeng.roses.kernel.sys.modular.menu.enums.SysMenuExceptionEnum; +import cn.stylefeng.roses.kernel.sys.modular.menu.factory.MenuFactory; import cn.stylefeng.roses.kernel.sys.modular.menu.mapper.SysMenuMapper; import cn.stylefeng.roses.kernel.sys.modular.menu.pojo.request.SysMenuRequest; import cn.stylefeng.roses.kernel.sys.modular.menu.pojo.response.AppGroupDetail; @@ -14,9 +16,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * 系统菜单业务实现层 @@ -27,6 +31,9 @@ import java.util.Set; @Service public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { + @Resource + private SysAppService sysAppService; + @Override public void add(SysMenuRequest sysMenuRequest) { SysMenu sysMenu = new SysMenu(); @@ -78,7 +85,39 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List getAppMenuGroupDetail(SysMenuRequest sysMenuRequest) { + + // 1. 获取所有应用列表 + List appList = sysAppService.getAppList(); + if (ObjectUtil.isEmpty(appList)) { + return new ArrayList<>(); + } + + // 所有的应用id + Set totalAppIds = appList.stream().map(AppGroupDetail::getAppId).collect(Collectors.toSet()); + + // 2. 获取应用对应的所有菜单 LambdaQueryWrapper wrapper = this.createWrapper(sysMenuRequest); + wrapper.in(SysMenu::getAppId, totalAppIds); + wrapper.select(SysMenu::getMenuId, SysMenu::getMenuParentId, SysMenu::getMenuPids, SysMenu::getMenuName, SysMenu::getAppId, SysMenu::getMenuType); + List sysMenuList = this.list(wrapper); + if (ObjectUtil.isEmpty(sysMenuList)) { + return appList; + } + + // 2.1 如果查询条件不为空,则需要补全被查询菜单的父级结构,否则组不成树结构 + if (StrUtil.isNotBlank(sysMenuRequest.getSearchText())) { + Set menuParentIds = MenuFactory.getMenuParentIds(sysMenuList); + if (ObjectUtil.isNotEmpty(menuParentIds)) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysMenu::getMenuId, menuParentIds); + queryWrapper.select(SysMenu::getMenuId, SysMenu::getMenuParentId, SysMenu::getMenuPids, SysMenu::getMenuName, SysMenu::getAppId, SysMenu::getMenuType); + queryWrapper.orderByAsc(SysMenu::getMenuSort); + List parentMenus = this.list(queryWrapper); + sysMenuList.addAll(parentMenus); + } + } + + // 3. 组装应用信息和菜单信息 return new ArrayList<>(); } @@ -114,6 +153,9 @@ public class SysMenuServiceImpl extends ServiceImpl impl queryWrapper.or().like(SysMenu::getAntdvComponent, searchText); } + // 根据顺序排序 + queryWrapper.orderByAsc(SysMenu::getMenuSort); + return queryWrapper; }