diff --git a/opsli-api/src/main/java/org/opsli/api/wrapper/system/menu/MenuModel.java b/opsli-api/src/main/java/org/opsli/api/wrapper/system/menu/MenuModel.java index c286e96a..01a555d7 100644 --- a/opsli-api/src/main/java/org/opsli/api/wrapper/system/menu/MenuModel.java +++ b/opsli-api/src/main/java/org/opsli/api/wrapper/system/menu/MenuModel.java @@ -16,6 +16,7 @@ package org.opsli.api.wrapper.system.menu; import com.alibaba.excel.annotation.ExcelIgnore; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -40,6 +41,11 @@ public class MenuModel extends ApiWrapper { @ValidatorLenMax(20) private String parentId; + /** 父级主键 ID集合 */ + @ApiModelProperty(value = "父级主键") + @ExcelIgnore + private String parentIds; + /** 权限编号 */ @ApiModelProperty(value = "权限编号") @ExcelIgnore diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/SystemMsg.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/SystemMsg.java index 6e6153c8..5ffbc951 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/SystemMsg.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/SystemMsg.java @@ -36,6 +36,8 @@ public enum SystemMsg implements BaseMsg { */ EXCEPTION_MENU_PERMISSIONS_UNIQUE(20050,"权限重复,该权限编号已存在"), EXCEPTION_MENU_HANDLE_SELF(20051,"不可操作自身"), + EXCEPTION_MENU_NULL(20052,"未找到菜单"), + /** * 数据字典 diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/entity/SysMenu.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/entity/SysMenu.java index 9c359881..dea16994 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/entity/SysMenu.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/entity/SysMenu.java @@ -36,6 +36,9 @@ public class SysMenu extends BaseEntity { /** 父级主键 */ private String parentId; + /** 父级主键 集合 */ + private String parentIds; + /** 权限编号 */ private String permissions; diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/factory/MenuFactory.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/factory/MenuFactory.java index e273d048..d7ffc093 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/factory/MenuFactory.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/factory/MenuFactory.java @@ -97,6 +97,7 @@ public enum MenuFactory { menu.setUrl(subModuleName); menu.setType(DictType.MENU_MENU.getValue()); menu.setSortNo(1); + menu.setLabel(DictType.MENU_LABEL_SYSTEM.getValue()); menu.setComponent("views/modules/"+model.getModuleName()+"/"+model.getSubModuleName()+"/index"); return menu; diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/impl/MenuServiceImpl.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/impl/MenuServiceImpl.java index 38b90c8e..68c49495 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/impl/MenuServiceImpl.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/menu/service/impl/MenuServiceImpl.java @@ -17,13 +17,17 @@ package org.opsli.modulars.system.menu.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.google.common.collect.Lists; import org.apache.commons.lang3.StringUtils; import org.opsli.api.wrapper.system.menu.MenuFullModel; import org.opsli.api.wrapper.system.menu.MenuModel; import org.opsli.api.wrapper.system.user.UserModel; import org.opsli.common.constants.MenuConstants; import org.opsli.common.constants.MyBatisConstants; +import org.opsli.common.constants.TreeConstants; import org.opsli.common.enums.DictType; import org.opsli.common.exception.ServiceException; import org.opsli.common.utils.FieldUtil; @@ -33,6 +37,7 @@ import org.opsli.core.msg.CoreMsg; import org.opsli.core.persistence.querybuilder.GenQueryBuilder; import org.opsli.core.persistence.querybuilder.QueryBuilder; import org.opsli.core.utils.MenuUtil; +import org.opsli.core.utils.TreeBuildUtil; import org.opsli.core.utils.UserUtil; import org.opsli.modulars.system.SystemMsg; import org.opsli.modulars.system.menu.entity.SysMenu; @@ -45,6 +50,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -87,6 +93,9 @@ public class MenuServiceImpl extends CrudServiceImpl findChildWrapper = new QueryWrapper<>(); + findChildWrapper.likeRight("parent_ids", ordParentIds); + List menuList = this.list(findChildWrapper); + // 循环变更 parentIds + for (SysMenu sysMenu : menuList) { + String parentIds = sysMenu.getParentIds(); + if(StringUtils.isBlank(parentIds)){ + parentIds = newParentIds; + }else { + parentIds = StrUtil.replace(parentIds, ordParentIds, newParentIds); + } + sysMenu.setParentIds(parentIds); + // 内部修改 防止版本行锁出现问题 + sysMenu.setVersion(null); + } + this.saveOrUpdateBatch(menuList); + } + + // 如果 原始标签 与 当前标签发送变更 则逐级变更子类标签 + if(!sourceModel.getLabel().equals(model.getLabel())){ + // 查询所有受影响的子集菜单 + QueryWrapper findChildWrapper = new QueryWrapper<>(); + findChildWrapper.likeRight("parent_ids", newParentIds); + List menuList = super.transformTs2Ms(this.list(findChildWrapper)); + + // 刷新缓存 + this.clearCache(menuList); + + // 修改所有子集 label + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("label", model.getLabel()); + updateWrapper.likeRight("parent_ids", newParentIds); + this.update(updateWrapper); + } + // 容错处理 // 如果根结点为0 且 为菜单类型 判断首位是否为 / 如果没有则自动加 / if(MenuConstants.GEN_ID.equals(model.getParentId())){ if(StringUtils.isNotEmpty(model.getUrl())){ - char firstChar = '/'; - char first = model.getUrl().charAt(0); - if(firstChar != first){ - model.setUrl("/"+model.getUrl()); - } + String url = StrUtil.addPrefixIfNot(model.getUrl(), "/"); + model.setUrl(url); } } MenuModel menuModel = super.update(model); if(menuModel != null){ - // 清除缓存 - this.clearCache(model); + // 刷新缓存 + this.clearCache(Collections.singletonList(model)); } return menuModel; } + /** + * 获得父级菜单 model + * @param parentId 父级菜单ID + * @return MenuModel + */ + private MenuModel getParentMenuModel(String parentId) { + // 父类菜单 + MenuModel parentModel; + if(TreeBuildUtil.DEF_PARENT_ID.equals(parentId)){ + parentModel = new MenuModel(); + parentModel.setId(TreeBuildUtil.DEF_PARENT_ID); + parentModel.setParentId(""); + parentModel.setParentIds(""); + parentModel.setLabel(DictType.MENU_LABEL_SYSTEM.getValue()); + }else { + parentModel = this.get(parentId); + if(null == parentModel){ + // 未找到菜单 + throw new ServiceException(SystemMsg.EXCEPTION_MENU_NULL); + } + } + return parentModel; + } + @Override @Transactional(rollbackFor = Exception.class) public void saveMenuByFull(MenuFullModel menuFullModel) { @@ -184,6 +255,7 @@ public class MenuServiceImpl extends CrudServiceImpl menuModelList){ + if(CollUtil.isEmpty(menuModelList)){ + return; + } + boolean cacheRet; // 计数器 - int cacheCount = 1; - // 先清除缓存 - // 清空编号缓存 - cacheRet = MenuUtil.refreshMenu(menuModel); - if(cacheRet){ - cacheCount--; + int cacheCount = menuModelList.size(); + + // 菜单ID + List menuIdList = Lists.newArrayListWithCapacity(menuModelList.size()); + for (MenuModel menuModel : menuModelList) { + menuIdList.add(menuModel.getId()); + // 先清除缓存 + // 清空编号缓存 + cacheRet = MenuUtil.refreshMenu(menuModel); + if(cacheRet){ + cacheCount--; + } + } + + // 菜单有变动 直接刷新超级管理员 菜单缓存 + UserModel adminUser = UserUtil.getUserByUserName(UserUtil.SUPER_ADMIN); + if(adminUser != null){ + cacheCount += 2; + cacheRet = UserUtil.refreshUserAllPerms(adminUser.getId()); + if(cacheRet){ + cacheCount--; + } + cacheRet = UserUtil.refreshUserMenus(adminUser.getId()); + if(cacheRet){ + cacheCount--; + } } + + // 刷新用户缓存 // 清空该菜单下 用户缓存 - List userIdList = iUserRoleRefService.getUserIdListByMenuId(menuModel.getId()); + List userIdList = iUserRoleRefService.getUserIdListByMenuIdList(menuIdList); if(CollUtil.isNotEmpty(userIdList)){ for (String userId : userIdList) { - cacheCount += 6; + cacheCount += 3; // 清空当期用户缓存角色、权限、菜单 cacheRet = UserUtil.refreshUserRoles(userId); if(cacheRet){ @@ -388,32 +486,6 @@ public class MenuServiceImpl extends CrudServiceImpl { */ List getUserIdList(@Param(Constants.WRAPPER) Wrapper wrapper); + /** + * 根据条件 获得当前用户Id集合 + * + * @param wrapper wrapper + * @return List + */ + List getUserIdListByMenu(@Param(Constants.WRAPPER) Wrapper wrapper); + /** * 根据菜单ID 获得当前用户Id集合 * @param menuId 菜单ID diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/user/mapper/xml/UserRoleRefMapper.xml b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/user/mapper/xml/UserRoleRefMapper.xml index ab1f463f..491f6ab7 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/user/mapper/xml/UserRoleRefMapper.xml +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/user/mapper/xml/UserRoleRefMapper.xml @@ -106,6 +106,16 @@ ${ew.customSqlSegment} + +