diff --git a/milkbox-common/src/main/java/top/milkbox/common/service/CommonService.java b/milkbox-common/src/main/java/top/milkbox/common/service/CommonService.java index f7d977ef971194dab0aab3db1644440a2255bfc6..6ad28026a7d5e816734e04f32b9bbf74fb2e0195 100644 --- a/milkbox-common/src/main/java/top/milkbox/common/service/CommonService.java +++ b/milkbox-common/src/main/java/top/milkbox/common/service/CommonService.java @@ -21,7 +21,7 @@ public interface CommonService extends IService { * 注意:此方法中包含一次数据库查询 * * @param column 被操作的字段的get方法的引用 - * @param entityColumnCollection 原始集合 + * @param entityColumnCollection 原始集合,如果其为空则返回的EntityColumnExistence中是两个长度为0的集合 * @param 列的类型 * @return 并返回一个包含存在和不存在实体列信息的对象 */ diff --git a/milkbox-common/src/main/java/top/milkbox/common/service/impl/CommonServiceImpl.java b/milkbox-common/src/main/java/top/milkbox/common/service/impl/CommonServiceImpl.java index 08efb782e17eebe79a947020d858454691e7a872..ef6f294d29cbabe8d0cd95c00adc28a8b5978a89 100644 --- a/milkbox-common/src/main/java/top/milkbox/common/service/impl/CommonServiceImpl.java +++ b/milkbox-common/src/main/java/top/milkbox/common/service/impl/CommonServiceImpl.java @@ -1,5 +1,6 @@ package top.milkbox.common.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; @@ -10,6 +11,7 @@ import top.milkbox.common.service.CommonService; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; /** * 抽取通用服务
@@ -22,6 +24,9 @@ public class CommonServiceImpl, E> extends ServiceImpl EntityColumnExistence filterDoesNotExistColumn( SFunction column, Collection entityColumnCollection) { + if (ObjectUtil.isEmpty(entityColumnCollection)) { + return new EntityColumnExistence<>(Collections.emptyList(), Collections.emptyList()); + } // 创建可见性对象,用于存储存在的和不存在的实体列集合 EntityColumnExistence entityColumnExistence = new EntityColumnExistence<>(); // 查询并保存存在的实体列 diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/SysMenuService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/SysMenuService.java index af32e5def53d34fd76a76d9866e734db223269bf..ccf672070f8e18c34db210935c3d33d6e2b8cc04 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/SysMenuService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/SysMenuService.java @@ -3,6 +3,7 @@ package top.milkbox.sys.modular.menu.service; import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import top.milkbox.common.service.CommonService; import top.milkbox.sys.modular.menu.entity.SysMenuEntity; import top.milkbox.sys.modular.menu.param.SysMenuAddParam; import top.milkbox.sys.modular.menu.param.SysMenuEditParam; @@ -18,7 +19,7 @@ import java.util.List; * @author milkbox * @date 2024-1-29 */ -public interface SysMenuService extends IService { +public interface SysMenuService extends CommonService { /** * 添加 diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java index 792548e42ac4c88a8f0483b74b892bcbee87946c..53fd725a5de8057b5886bb86a989faad6e5db2fb 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import top.milkbox.common.exceprion.CommonServiceException; +import top.milkbox.common.service.impl.CommonServiceImpl; import top.milkbox.sys.modular.menu.entity.SysMenuEntity; import top.milkbox.sys.modular.menu.mapper.SysMenuMapper; import top.milkbox.sys.modular.menu.param.SysMenuAddParam; @@ -33,7 +34,7 @@ import java.util.List; @Slf4j @Service @AllArgsConstructor -public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { +public class SysMenuServiceImpl extends CommonServiceImpl implements SysMenuService { private SysMenuMapper sysMenuMapper; diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/bo/SysRelationshipObjectAuthTargetBo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/bo/SysRelationshipObjectAuthTargetBo.java new file mode 100644 index 0000000000000000000000000000000000000000..3f924442b5b09464c9a7974a42c7902091f30769 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/bo/SysRelationshipObjectAuthTargetBo.java @@ -0,0 +1,40 @@ +package top.milkbox.sys.modular.relationship.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; + +import java.util.Set; + +/** + * targetIdList集合授权给objectId
+ * 创建时间: 2024-04-08 下午 3:07 + * + * @author milkbox + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRelationshipObjectAuthTargetBo { + + /** + * targetIdList集合授权给objectId + */ + private Integer objectId; + + /** + * targetIdList集合授权给objectId + */ + private Set targetIdList; + + /** + * 是否重新授权 + */ + private Boolean isReauthorization; + + /** + * 关联的类型;枚举 + */ + private SysRelationshipTypeEnum category; +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/bo/SysRelationshipTargetAuthObjectBo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/bo/SysRelationshipTargetAuthObjectBo.java new file mode 100644 index 0000000000000000000000000000000000000000..b057a569f7bd6f2f864496b8c7f7a290a1a9a80b --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/bo/SysRelationshipTargetAuthObjectBo.java @@ -0,0 +1,40 @@ +package top.milkbox.sys.modular.relationship.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; + +import java.util.Set; + +/** + * objectIdList集合授权给targetId
+ * 创建时间: 2024-04-08 下午 3:07 + * + * @author milkbox + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRelationshipTargetAuthObjectBo { + + /** + * objectIdList集合授权给targetId + */ + private Set objectIdList; + + /** + * objectIdList集合授权给targetId + */ + private Integer targetId; + + /** + * 是否重新授权 + */ + private Boolean isReauthorization; + + /** + * 关联的类型;枚举 + */ + private SysRelationshipTypeEnum category; +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/entity/SysRelationshipEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/entity/SysRelationshipEntity.java index 177983fc9fcfe84635b9a5eb14737f2ac4cd829b..d818253aad5c179638992309ab1dde06082e4532 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/entity/SysRelationshipEntity.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/entity/SysRelationshipEntity.java @@ -10,6 +10,7 @@ import lombok.NoArgsConstructor; import top.milkbox.common.pojo.CommonEntity; import java.io.Serializable; + import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import com.baomidou.mybatisplus.annotation.FieldStrategy; @@ -29,6 +30,19 @@ import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; @Schema(description = "SysRelationshipEntity 系统_关系表_用户角色组织菜单权限综合关系表。") public class SysRelationshipEntity extends CommonEntity implements Serializable { + public SysRelationshipEntity(Integer objectId, Integer targetId, SysRelationshipTypeEnum category) { + this.objectId = objectId; + this.targetId = targetId; + this.category = category; + } + + public SysRelationshipEntity(Integer objectId, Integer targetId, SysRelationshipTypeEnum category, Object extend) { + this.objectId = objectId; + this.targetId = targetId; + this.category = category; + this.extend = extend; + } + /** * 主键 */ diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/enums/SysRelationshipTypeEnum.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/enums/SysRelationshipTypeEnum.java index ab935927275f7b4147eebbbf26531aa32b770b4d..1e1d7276d170205a75f45d0a687b68133f5d7124 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/enums/SysRelationshipTypeEnum.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/enums/SysRelationshipTypeEnum.java @@ -5,7 +5,10 @@ import com.fasterxml.jackson.annotation.JsonValue; import lombok.AllArgsConstructor; /** - * 关系表类型枚举 + * 关系表类型枚举
+ * 此类型用来标识关系表中object_id与target_id的关系
+ * 可以通过命名格式来确认谁是object_id,谁是target_id,一般在RELATE前面的是object_id,后面的是target_id
+ * 在数据库中object_id字段在前面,target_id在后面
* 创建时间: 2024-01-23 下午 4:28 * * @author milkbox @@ -19,17 +22,17 @@ public enum SysRelationshipTypeEnum { SYS_USER_RELATE_SYS_ROLE("用户与角色关系", "SYS_USER_RELATE_SYS_ROLE"), /** - * 用户与菜单关系(用户单独拥有的菜单) + * 用户与菜单关系(用户单独拥有的菜单,用户为object_id,菜单为target_id) */ SYS_USER_RELATE_SYS_MENU("用户与菜单关系", "SYS_USER_RELATE_SYS_MENU"), /** - * 用户与组织关系(用户所属与哪些组织) + * 用户与组织关系(用户所属与哪些组织,用户为object_id,组织为target_id) */ SYS_USER_RELATE_SYS_ORG("用户与组织关系", "SYS_USER_RELATE_SYS_ORG"), /** - * 角色与菜单关系(角色拥有那些菜单) + * 角色与菜单关系(角色拥有那些菜单,角色为object_id,菜单为target_id) */ SYS_ROLE_RELATE_SYS_MENU("角色与菜单关系", "SYS_ROLE_RELATE_SYS_MENU"); diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/SysRelationshipService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/SysRelationshipService.java index 6b823f14620902175468ea9afc50c4576187f3fa..4a7e2fa107173fd37722b9e6204e8a25b45ed2f3 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/SysRelationshipService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/SysRelationshipService.java @@ -3,13 +3,15 @@ package top.milkbox.sys.modular.relationship.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import top.milkbox.common.bo.EntityColumnExistence; +import top.milkbox.sys.modular.relationship.bo.SysRelationshipObjectAuthTargetBo; +import top.milkbox.sys.modular.relationship.bo.SysRelationshipTargetAuthObjectBo; import top.milkbox.sys.modular.relationship.entity.SysRelationshipEntity; -import top.milkbox.sys.modular.relationship.param.SysRelationshipAddParam; -import top.milkbox.sys.modular.relationship.param.SysRelationshipEditParam; -import top.milkbox.sys.modular.relationship.param.SysRelationshipIdParam; -import top.milkbox.sys.modular.relationship.param.SysRelationshipPageParam; +import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; +import top.milkbox.sys.modular.relationship.param.*; import top.milkbox.sys.modular.relationship.vo.SysRelationshipVo; +import top.milkbox.sys.modular.role.param.SysRoleAuthorizationMenuParam; import top.milkbox.sys.modular.role.param.SysRoleAuthorizationUserParam; +import top.milkbox.sys.modular.user.param.SysUserAuthorizationMenuParam; import java.util.List; @@ -67,24 +69,64 @@ public interface SysRelationshipService extends IService // Page page(SysRelationshipPageParam pageParam); /** - * 通过target字段删除 + * 通过object字段和类型字段删除
+ * object在前,target在后 + * + * @param deleteObjectList 要删除的记录的Object字段集合 + * @param type 关系类型,若类型为空,匹配所有类型 + */ + void deleteByObjectAndType(List deleteObjectList, SysRelationshipTypeEnum type); + + /** + * 通过target字段和类型字段删除
+ * object在前,target在后 * * @param deleteTargetList 要删除的记录的target字段集合 + * @param type 关系类型,若类型为空,匹配所有类型 + */ + void deleteByTargetAndType(List deleteTargetList, SysRelationshipTypeEnum type); + + /** + * objectId授权targetIdList + * + * @param objectAuthTargetBo objectId授权targetIdList参数,包含objectId,targetIdList,isReauthorization以及category + * @param entityColumnExistence 存在性校验对象,包含存在的实体id集合与不存在的实体id集合 + * @return 返回的对象包含两个集合,一个为授权成功的id集合,另一个为不存在的id集合 */ - void deleteByTarget(List deleteTargetList); + EntityColumnExistence objectAuthTarget( + SysRelationshipObjectAuthTargetBo objectAuthTargetBo, EntityColumnExistence entityColumnExistence); /** - * 重新给角色授权用户 + * targetId授权objectIdList * - * @param assignUserParam 角色id与用户id集合 + * @param targetAuthObjectBo targetId授权objectIdList参数,包含targetId,objectIdList,isReauthorization以及category + * @param entityColumnExistence 存在性校验对象,包含存在的实体id集合与不存在的实体id集合 + * @return 返回的对象包含两个集合,一个为授权成功的id集合,另一个为不存在的id集合 */ - EntityColumnExistence reauthorizationUsers(SysRoleAuthorizationUserParam assignUserParam); + EntityColumnExistence targetAuthObject( + SysRelationshipTargetAuthObjectBo targetAuthObjectBo, EntityColumnExistence entityColumnExistence); /** - * 给角色授权新用户,新用户中不具有此角色的将被授权,已经拥有此角色的不变 + * 角色授权用户集合 * - * @param assignUserParam 角色id与用户id集合 + * @param param 包含角色id,用户id集合,是否重新授权 + * @return 返回的对象包含两个集合,一个为授权成功的id集合,另一个为不存在的id集合 */ - EntityColumnExistence incrementAuthorizationUsers(SysRoleAuthorizationUserParam assignUserParam); + EntityColumnExistence roleIdAuthUserIdList(SysRoleAuthorizationUserParam param); + /** + * 角色授权菜单集合 + * + * @param param 包含角色id,菜单id集合,是否重新授权 + * @return 返回的对象包含两个集合,一个为授权成功的id集合,另一个为不存在的id集合 + */ + EntityColumnExistence roleIdAuthMenuIdList(SysRoleAuthorizationMenuParam param); + + /** + * 用户授权菜单集合 + * + * @param param 包含用户id,菜单id集合,是否重新授权 + * @return 返回的对象包含两个集合,一个为授权成功的id集合,另一个为不存在的id集合 + */ + EntityColumnExistence userIdAuthMenuIdList(SysUserAuthorizationMenuParam param); } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/impl/SysRelationshipServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/impl/SysRelationshipServiceImpl.java index abfefb3e097d91759217efaa78ac57e7d3330225..482fc3db20bf3a6afaa724fd4d71fe03e06027f8 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/impl/SysRelationshipServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/impl/SysRelationshipServiceImpl.java @@ -11,6 +11,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import top.milkbox.common.bo.EntityColumnExistence; import top.milkbox.common.exceprion.CommonServiceException; +import top.milkbox.sys.modular.menu.entity.SysMenuEntity; +import top.milkbox.sys.modular.menu.service.SysMenuService; +import top.milkbox.sys.modular.relationship.bo.SysRelationshipObjectAuthTargetBo; +import top.milkbox.sys.modular.relationship.bo.SysRelationshipTargetAuthObjectBo; import top.milkbox.sys.modular.relationship.entity.SysRelationshipEntity; import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; import top.milkbox.sys.modular.relationship.mapper.SysRelationshipMapper; @@ -20,9 +24,11 @@ import top.milkbox.sys.modular.relationship.param.SysRelationshipIdParam; import top.milkbox.sys.modular.relationship.service.SysRelationshipService; import top.milkbox.sys.modular.relationship.vo.SysRelationshipVo; import top.milkbox.sys.modular.role.entity.SysRoleEntity; +import top.milkbox.sys.modular.role.param.SysRoleAuthorizationMenuParam; import top.milkbox.sys.modular.role.param.SysRoleAuthorizationUserParam; import top.milkbox.sys.modular.role.service.SysRoleService; import top.milkbox.sys.modular.user.entity.SysUserEntity; +import top.milkbox.sys.modular.user.param.SysUserAuthorizationMenuParam; import top.milkbox.sys.modular.user.service.SysUserService; import java.util.ArrayList; @@ -46,6 +52,7 @@ public class SysRelationshipServiceImpl private SysUserService sysUserService; private SysRoleService sysRoleService; + private SysMenuService sysMenuService; @Override public void add(SysRelationshipAddParam addParam) { @@ -107,83 +114,190 @@ public class SysRelationshipServiceImpl // return voPage; // } + @Override + public void deleteByObjectAndType(List deleteObjectList, SysRelationshipTypeEnum type) { + if (ObjectUtil.isEmpty(deleteObjectList)) { + return; + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysRelationshipEntity::getObjectId, deleteObjectList) + // 在类型不为空的情况下,添加此条件 + .eq(ObjectUtil.isNotEmpty(type), SysRelationshipEntity::getCategory, type); + super.remove(queryWrapper); + } @Override - public void deleteByTarget(List deleteTargetList) { + public void deleteByTargetAndType(List deleteTargetList, SysRelationshipTypeEnum type) { if (ObjectUtil.isEmpty(deleteTargetList)) { return; } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SysRelationshipEntity::getTargetId, deleteTargetList); + queryWrapper.in(SysRelationshipEntity::getTargetId, deleteTargetList) + // 在类型不为空的情况下,添加此条件 + .eq(ObjectUtil.isNotEmpty(type), SysRelationshipEntity::getCategory, type); super.remove(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) - public EntityColumnExistence reauthorizationUsers(SysRoleAuthorizationUserParam reauthorizationUserParam) { - // 检查角色是否存在 - sysRoleService.findEntity(reauthorizationUserParam.getRoleId()); - // 检查用户列表中的用户是否都存在 - EntityColumnExistence columnExistence = sysUserService.filterDoesNotExistColumn( - SysUserEntity::getId, reauthorizationUserParam.getUserIdList()); - if (ObjectUtil.isEmpty(columnExistence.getExistColumnList())) { - throw new CommonServiceException("被授权的用户全部都不存在"); + public EntityColumnExistence objectAuthTarget( + SysRelationshipObjectAuthTargetBo objectAuthTargetBo, + EntityColumnExistence entityColumnExistence) { + + // 分别处理重新授权与追加授权 + if (objectAuthTargetBo.getIsReauthorization() != null && objectAuthTargetBo.getIsReauthorization()) { + // 重新授权 + + // 构造实体集合 + List relationshipEntityList = entityColumnExistence.getExistColumnList().stream() + .map(targetId -> new SysRelationshipEntity( + objectAuthTargetBo.getObjectId(), targetId, objectAuthTargetBo.getCategory())) + .toList(); + // 删除此objectId原来的授权信息 + deleteByObjectAndType(Collections.singletonList(objectAuthTargetBo.getObjectId()), + objectAuthTargetBo.getCategory()); + // 保存实体信息 + super.saveBatch(relationshipEntityList); + } else { + // 追加授权 + + // 判断targetIdList是否为空,如果为空则没必要进行授权操作 + if (ObjectUtil.isEmpty(entityColumnExistence.getExistColumnList())) { + throw new CommonServiceException("授权的集合{}中无可用的对象,授权停止", + objectAuthTargetBo.getTargetIdList()); + } + + // 查询此objectId授权的信息 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysRelationshipEntity::getObjectId, objectAuthTargetBo.getObjectId()) + .eq(SysRelationshipEntity::getCategory, objectAuthTargetBo.getCategory()); + List roleRelationshipList = super.list(queryWrapper); + + // 去掉已经授权的targetId,得到需要追加的菜单targetId + List additionAuthorizationMenuIdList = new ArrayList<>(entityColumnExistence.getExistColumnList()); + additionAuthorizationMenuIdList.removeAll(roleRelationshipList.stream() + .map(SysRelationshipEntity::getTargetId).toList()); + + // 构造实体集合 + List entityList = additionAuthorizationMenuIdList.stream() + .map(targetId -> new SysRelationshipEntity( + objectAuthTargetBo.getObjectId(), targetId, objectAuthTargetBo.getCategory())) + .toList(); + super.saveBatch(entityList); } - // 构造实体集合 - List relationshipEntityList = - columnExistence.getExistColumnList().stream().map(userId -> { - SysRelationshipEntity relationshipEntity = new SysRelationshipEntity(); - relationshipEntity.setObjectId(userId); - relationshipEntity.setTargetId(reauthorizationUserParam.getRoleId()); - relationshipEntity.setCategory(SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE); - return relationshipEntity; - }).toList(); - // 删除此角色原来的授权信息 - deleteByTarget(Collections.singletonList(reauthorizationUserParam.getRoleId())); - // 保存实体集合 - saveBatch(relationshipEntityList); - return columnExistence; + return entityColumnExistence; } @Override @Transactional(rollbackFor = Exception.class) - public EntityColumnExistence incrementAuthorizationUsers( - SysRoleAuthorizationUserParam incrementAuthorizationUserParam) { - // 检查角色是否存在 - sysRoleService.findEntity(incrementAuthorizationUserParam.getRoleId()); - // 检查用户列表中的用户是否都存在 - EntityColumnExistence columnExistence = sysUserService.filterDoesNotExistColumn( - SysUserEntity::getId, incrementAuthorizationUserParam.getUserIdList()); - if (ObjectUtil.isEmpty(columnExistence.getExistColumnList())) { - throw new CommonServiceException("被授权的用户全部都不存在"); - } + public EntityColumnExistence targetAuthObject( + SysRelationshipTargetAuthObjectBo targetAuthObjectBo, + EntityColumnExistence entityColumnExistence) { - // 查询此角色授权的信息 - LambdaQueryWrapper relationshipQueryWrapper = new LambdaQueryWrapper<>(); - relationshipQueryWrapper.eq(SysRelationshipEntity::getTargetId, incrementAuthorizationUserParam.getRoleId()) - .eq(SysRelationshipEntity::getCategory, SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE); - List roleRelationshipList = list(relationshipQueryWrapper); + // 分别处理重新授权与追加授权 + if (targetAuthObjectBo.getIsReauthorization() != null && targetAuthObjectBo.getIsReauthorization()) { + // 重新授权 - // 去掉已经授权的用户 - List incrementAuthorizationUserIdList = new ArrayList<>(columnExistence.getExistColumnList()); - incrementAuthorizationUserIdList.removeAll(roleRelationshipList.stream() - .map(SysRelationshipEntity::getObjectId).toList()); + // 构造实体集合 + List relationshipEntityList = entityColumnExistence.getExistColumnList().stream() + .map(objectId -> new SysRelationshipEntity( + objectId, targetAuthObjectBo.getTargetId(), targetAuthObjectBo.getCategory())) + .toList(); + // 删除此targetId原来的授权信息 + deleteByTargetAndType(Collections.singletonList(targetAuthObjectBo.getTargetId()), + targetAuthObjectBo.getCategory()); + // 保存实体信息 + super.saveBatch(relationshipEntityList); + } else { + // 追加授权 - if (ObjectUtil.isEmpty(incrementAuthorizationUserIdList)) { - throw new CommonServiceException("无新增授权用户"); + // 判断objectIdList是否为空,如果为空则没必要进行授权操作 + if (ObjectUtil.isEmpty(entityColumnExistence.getExistColumnList())) { + throw new CommonServiceException("授权的集合{}中无可用的对象,授权停止", + targetAuthObjectBo.getObjectIdList()); + } + + // 查询此targetId已经授权的对象信息 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysRelationshipEntity::getTargetId, targetAuthObjectBo.getTargetId()) + .eq(SysRelationshipEntity::getCategory, targetAuthObjectBo.getCategory()); + List targetRelationshipList = super.list(queryWrapper); + + // 去掉已经授权的对象id,得到需要追加的对象id列表 + List additionAuthorizationObjectList = new ArrayList<>(entityColumnExistence.getExistColumnList()); + additionAuthorizationObjectList.removeAll(targetRelationshipList.stream() + .map(SysRelationshipEntity::getObjectId).toList()); + + // 构造需要追加的实体集合 + List entityList = additionAuthorizationObjectList.stream() + .map(objectId -> new SysRelationshipEntity( + objectId, targetAuthObjectBo.getTargetId(), targetAuthObjectBo.getCategory())) + .toList(); + super.saveBatch(entityList); } + return entityColumnExistence; + } - // 将新的用户与角色关系保存 - List relationshipEntityList = incrementAuthorizationUserIdList.stream() - .map(userId -> { - SysRelationshipEntity relationshipEntity = new SysRelationshipEntity(); - relationshipEntity.setObjectId(userId); - relationshipEntity.setTargetId(incrementAuthorizationUserParam.getRoleId()); - relationshipEntity.setCategory(SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE); - return relationshipEntity; - }).toList(); - saveBatch(relationshipEntityList); - - return columnExistence; + @Override + @Transactional(rollbackFor = Exception.class) + public EntityColumnExistence roleIdAuthUserIdList(SysRoleAuthorizationUserParam param) { + // 检查角色是否存在 + sysRoleService.findEntity(param.getRoleId()); + + // 创建bo对象(实际的作用就是额外添加了category属性) + SysRelationshipTargetAuthObjectBo targetAuthObjectBo = new SysRelationshipTargetAuthObjectBo( + param.getUserIdList(), + param.getRoleId(), + param.getIsReauthorization(), + SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE + ); + + // 列存在性对象,查询用户id集合中存在的id和不存在的id + EntityColumnExistence columnExistence = + sysUserService.filterDoesNotExistColumn(SysUserEntity::getId, param.getUserIdList()); + // 调用objectId授权targetIdList方法 + return targetAuthObject(targetAuthObjectBo, columnExistence); } + + @Override + @Transactional(rollbackFor = Exception.class) + public EntityColumnExistence roleIdAuthMenuIdList(SysRoleAuthorizationMenuParam param) { + // 检查角色是否存在 + sysRoleService.findEntity(param.getRoleId()); + + // 创建bo对象(实际的作用就是额外添加了category属性) + SysRelationshipObjectAuthTargetBo objectAuthTargetBo = new SysRelationshipObjectAuthTargetBo( + param.getRoleId(), + param.getMenuIdList(), + param.getIsReauthorization(), + SysRelationshipTypeEnum.SYS_ROLE_RELATE_SYS_MENU); + + // 列存在性对象,查询菜单id集合中存在的id和不存在的id + EntityColumnExistence columnExistence = + sysMenuService.filterDoesNotExistColumn(SysMenuEntity::getId, param.getMenuIdList()); + // 调用objectId授权targetIdList方法 + return objectAuthTarget(objectAuthTargetBo, columnExistence); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public EntityColumnExistence userIdAuthMenuIdList(SysUserAuthorizationMenuParam param) { + // 检查用户是否存在 + sysUserService.findEntity(param.getUserId()); + + // 创建bo对象(实际的作用就是额外添加了category属性) + SysRelationshipObjectAuthTargetBo objectAuthTargetBo = new SysRelationshipObjectAuthTargetBo( + param.getUserId(), + param.getMenuIdList(), + param.getIsReauthorization(), + SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_MENU); + + // 列存在性对象,查询菜单id集合中存在的id和不存在的id + EntityColumnExistence columnExistence = + sysMenuService.filterDoesNotExistColumn(SysMenuEntity::getId, param.getMenuIdList()); + // 调用objectId授权targetIdList方法 + return objectAuthTarget(objectAuthTargetBo, columnExistence); + } + + } diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java index c967a7829455f3c47693c4dc5dce3610d18c0ef8..98db5add7c7d36adafb8cf4a4cb1a4eb4048e172 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java @@ -88,50 +88,37 @@ public class SysRoleController { return CommonResult.ok(sysRoleService.page(pageParam)); } -// @PostMapping("/reauthorizationUserOld") -// @Operation(summary = "重新授权用户,旧", description = "重新给角色授权用户") -// @CommonLog(value = "重新授权用户,旧", description = "重新给角色授权用户", -// module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.NOT) -// public CommonResult reauthorizationUserOld( -// @Validated @RequestBody SysRoleAuthorizationUserParam reauthorizationUserParam) { -// -// EntityColumnExistence columnExistence = sysRoleService.reauthorizationUser(reauthorizationUserParam); -// if (ObjectUtil.isEmpty(columnExistence.getDoesNotExistColumnList())) { -// return CommonResult.ok(); -// } -// -// return CommonResult.ok("用户" + JSONUtil.toJsonStr(columnExistence.getExistColumnList()) + "已授权成功。" -// + "用户" + JSONUtil.toJsonStr(columnExistence.getDoesNotExistColumnList()) -// + "由于不存在所以授权失败。", -// null); -// } - - - @PostMapping("/reauthorizationUsers") - @Operation(summary = "重新授权用户", description = "重新给角色授权用户") - @CommonLog(value = "重新授权用户", description = "重新给角色授权用户", + @PostMapping("/roleIdAuthUserIdList") + @Operation(summary = "授权用户", description = "给角色授权授权用户") + @CommonLog(value = "授权用户", description = "给角色授权授权用户", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) - public CommonResult reauthorizationUsers( - @Validated @RequestBody SysRoleAuthorizationUserParam reauthorizationUserParam) { - + public CommonResult roleIdAuthUserIdList( + @Validated @RequestBody SysRoleAuthorizationUserParam roleAuthorizationMenuParam) { EntityColumnExistence columnExistence = - sysRelationshipService.reauthorizationUsers(reauthorizationUserParam); + sysRelationshipService.roleIdAuthUserIdList(roleAuthorizationMenuParam); if (ObjectUtil.isEmpty(columnExistence.getDoesNotExistColumnList())) { return CommonResult.ok(); } return CommonResult.ok("用户" + JSONUtil.toJsonStr(columnExistence.getExistColumnList()) + "已授权成功。" + "用户" + JSONUtil.toJsonStr(columnExistence.getDoesNotExistColumnList()) - + "由于不存在所以授权失败。", null); + + "由于不存在所以未授权。", null); } - @PostMapping("/incrementAuthorizationUsers") - @Operation(summary = "授权用户", description = "给角色授权新用户,新用户中不具有此角色的将被授权,已经拥有此角色的不变") - @CommonLog(value = "授权用户", description = "给角色授权新用户", + @PostMapping("/roleIdAuthMenuIdList") + @Operation(summary = "授权菜单", description = "给角色授权授权菜单") + @CommonLog(value = "授权菜单", description = "给角色授权授权菜单", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) - public CommonResult incrementAuthorizationUsers( - @Validated @RequestBody SysRoleAuthorizationUserParam reauthorizationUserParam) { - sysRelationshipService.incrementAuthorizationUsers(reauthorizationUserParam); - return CommonResult.ok(); + public CommonResult roleIdAuthMenuIdList( + @Validated @RequestBody SysRoleAuthorizationMenuParam roleAuthorizationMenuParam) { + EntityColumnExistence columnExistence = + sysRelationshipService.roleIdAuthMenuIdList(roleAuthorizationMenuParam); + if (ObjectUtil.isEmpty(columnExistence.getDoesNotExistColumnList())) { + return CommonResult.ok(); + } + + return CommonResult.ok("菜单" + JSONUtil.toJsonStr(columnExistence.getExistColumnList()) + "已授权成功。" + + "菜单" + JSONUtil.toJsonStr(columnExistence.getDoesNotExistColumnList()) + + "由于不存在所以未授权。", null); } } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationMenuParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationMenuParam.java new file mode 100644 index 0000000000000000000000000000000000000000..53cd66424960285808ece51d4c0e0d2ffa66528a --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationMenuParam.java @@ -0,0 +1,40 @@ +package top.milkbox.sys.modular.role.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import top.milkbox.common.validation.annotation.CollectionElementNotNull; + +import java.util.Set; + +/** + * 角色授权菜单
+ * 创建时间: 2024-04-07 上午 11:42 + * + * @author milkbox + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleAuthorizationMenuParam { + + @Schema(title = "角色id", description = "角色id") + @NotNull(message = "角色id不能为空") + private Integer roleId; + + @Schema(title = "菜单id集合", description = """ + 被授权的菜单id集合。 + 在重新授权模式下,如果此字段为空或集合个数为0,则表示删除原来的授权信息而不添加新的授权信息。""") + @Size(max = 10000, message = "一次性授权的最大个数为10000") + @CollectionElementNotNull(message = "集合中的菜单id不能为空") + private Set menuIdList; + + @Schema(title = "是否重新授权", description = """ + 为true表示重新授权,false或空表示不重新授权。 + 重新授权的意思是删除原来的授权信息重新授权新的集合。 + 不重新授权就是增量授权,已经授权的不变,只添加新的授权。""") + private Boolean isReauthorization; +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationUserParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationUserParam.java index 5f164a8810757a12c822e7155eac2e6794a838e6..77fd6a6df013afd1c8aa98e2db70c21447207bd9 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationUserParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationUserParam.java @@ -25,8 +25,16 @@ public class SysRoleAuthorizationUserParam { @NotNull(message = "角色id不能为空") private Integer roleId; - @Schema(title = "用户id集合", description = "被授权的用户id集合") - @Size(min = 1, max = 10000, message = "一次性授权用户的个数范围[1, 10000]") + @Schema(title = "用户id集合", description = """ + 被授权的用户id集合。 + 在重新授权模式下,如果此字段为空或集合个数为0,则表示删除原来的授权信息而不添加新的授权信息。""") + @Size(max = 10000, message = "一次性授权的最大个数为10000") @CollectionElementNotNull(message = "集合中的用户id不能为空") private Set userIdList; + + @Schema(title = "是否重新授权", description = """ + 为true表示重新授权,false或空表示不重新授权。 + 重新授权的意思是删除原来的授权信息重新授权新的集合。 + 不重新授权就是增量授权,已经授权的不变,只添加新的授权。""") + private Boolean isReauthorization; } diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/controller/SysUserController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/controller/SysUserController.java index aae0e23f4739f17269e48c17ef2b3981dd74bb32..f364acc8ca553fd21eef71cc5262b2eb42b430aa 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/controller/SysUserController.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/controller/SysUserController.java @@ -2,6 +2,8 @@ package top.milkbox.sys.modular.user.controller; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaIgnore; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -12,9 +14,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import top.milkbox.common.annotation.CommonLog; +import top.milkbox.common.bo.EntityColumnExistence; import top.milkbox.common.enums.LogTypeEnum; import top.milkbox.common.validation.annotation.CollectionElementNotNull; import top.milkbox.sys.core.config.SysConfiguration; +import top.milkbox.sys.modular.relationship.service.SysRelationshipService; +import top.milkbox.sys.modular.role.param.SysRoleAuthorizationMenuParam; import top.milkbox.sys.modular.user.param.*; import top.milkbox.sys.modular.user.service.SysUserService; import top.milkbox.sys.modular.user.vo.SysUserVo; @@ -38,6 +43,8 @@ public class SysUserController { private SysUserService sysUserService; + private SysRelationshipService sysRelationshipService; + @PostMapping("/add") @Operation(summary = "添加", description = "添加一条数据") @CommonLog(value = "添加", description = "添加一条数据", @@ -120,5 +127,22 @@ public class SysUserController { return CommonResult.ok("登出成功", null); } + @PostMapping("/userIdAuthMenuIdList") + @Operation(summary = "授权菜单", description = "单独给用户授权菜单") + @CommonLog(value = "授权菜单", description = "单独给用户授权菜单", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) + public CommonResult userIdAuthMenuIdList( + @Validated @RequestBody SysUserAuthorizationMenuParam userAuthorizationMenuParam) { + EntityColumnExistence columnExistence = + sysRelationshipService.userIdAuthMenuIdList(userAuthorizationMenuParam); + if (ObjectUtil.isEmpty(columnExistence.getDoesNotExistColumnList())) { + return CommonResult.ok(); + } + + return CommonResult.ok("菜单" + JSONUtil.toJsonStr(columnExistence.getExistColumnList()) + "已授权成功。" + + "菜单" + JSONUtil.toJsonStr(columnExistence.getDoesNotExistColumnList()) + + "由于不存在所以未授权。", null); + } + // TODO 缺少接口,给用户分配角色assignRole } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserAuthorizationMenuParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserAuthorizationMenuParam.java new file mode 100644 index 0000000000000000000000000000000000000000..144a3052439d8aae51781bd1e408a276cf30255e --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserAuthorizationMenuParam.java @@ -0,0 +1,40 @@ +package top.milkbox.sys.modular.user.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import top.milkbox.common.validation.annotation.CollectionElementNotNull; + +import java.util.Set; + +/** + * 用户授权菜单
+ * 创建时间: 2024-04-08 + * + * @author milkbox + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysUserAuthorizationMenuParam { + + @Schema(title = "用户id", description = "用户id") + @NotNull(message = "用户id不能为空") + private Integer userId; + + @Schema(title = "菜单id集合", description = """ + 被授权的菜单id集合。 + 在重新授权模式下,如果此字段为空或集合个数为0,则表示删除原来的授权信息而不添加新的授权信息。""") + @Size(max = 10000, message = "一次性授权的最大个数为10000") + @CollectionElementNotNull(message = "集合中的菜单id不能为空") + private Set menuIdList; + + @Schema(title = "是否重新授权", description = """ + 为true表示重新授权,false或空表示不重新授权。 + 重新授权的意思是删除原来的授权信息重新授权新的集合。 + 不重新授权就是增量授权,已经授权的不变,只添加新的授权。""") + private Boolean isReauthorization; +} diff --git "a/\345\244\207\345\277\230\345\275\225.md" "b/\345\244\207\345\277\230\345\275\225.md" index cc7fba1b26bfddbad70175d9128bc60e8933b21e..d06e257c17286107a6ea5e918bcde07f196f3987 100644 --- "a/\345\244\207\345\277\230\345\275\225.md" +++ "b/\345\244\207\345\277\230\345\275\225.md" @@ -12,5 +12,7 @@ # 正在进行 - [x] 菜单表基础功能 -- [ ] 为角色和用户授予菜单权限 +- [x] 为角色授权菜单权限 +- [x] 为用户授权菜单权限 +- [x] 把用户授权角色的两个接口按照角色授权菜单的方式整合为一个接口