From d8f47f8139ddadcd68eae29a11af90de59c2bf8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Mon, 8 Apr 2024 14:12:16 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E8=8F=9C=E5=8D=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modular/menu/service/SysMenuService.java | 3 +- .../menu/service/impl/SysMenuServiceImpl.java | 3 +- .../entity/SysRelationshipEntity.java | 14 ++++ .../enums/SysRelationshipTypeEnum.java | 11 ++- .../service/SysRelationshipService.java | 18 ++++- .../impl/SysRelationshipServiceImpl.java | 73 ++++++++++++++++++- .../role/controller/SysRoleController.java | 19 ++++- .../param/SysRoleAuthorizationMenuParam.java | 38 ++++++++++ .../param/SysRoleAuthorizationUserParam.java | 2 +- "\345\244\207\345\277\230\345\275\225.md" | 4 +- 10 files changed, 171 insertions(+), 14 deletions(-) create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationMenuParam.java 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 af32e5d..ccf6720 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 792548e..53fd725 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/entity/SysRelationshipEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/entity/SysRelationshipEntity.java index 177983f..d818253 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 ab93592..1e1d727 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 6b823f1..8672c6a 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 @@ -4,11 +4,13 @@ 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.entity.SysRelationshipEntity; +import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; 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.vo.SysRelationshipVo; +import top.milkbox.sys.modular.role.param.SysRoleAuthorizationMenuParam; import top.milkbox.sys.modular.role.param.SysRoleAuthorizationUserParam; import java.util.List; @@ -67,11 +69,22 @@ 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 deleteByTarget(List deleteTargetList); + void deleteByTargetAndType(List deleteTargetList, SysRelationshipTypeEnum type); /** * 重新给角色授权用户 @@ -87,4 +100,5 @@ public interface SysRelationshipService extends IService */ EntityColumnExistence incrementAuthorizationUsers(SysRoleAuthorizationUserParam assignUserParam); + EntityColumnExistence authorizationMenu(SysRoleAuthorizationMenuParam roleAuthorizationMenuParam); } \ 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 abfefb3..38588be 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,8 @@ 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.entity.SysRelationshipEntity; import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; import top.milkbox.sys.modular.relationship.mapper.SysRelationshipMapper; @@ -20,6 +22,7 @@ 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; @@ -46,6 +49,7 @@ public class SysRelationshipServiceImpl private SysUserService sysUserService; private SysRoleService sysRoleService; + private SysMenuService sysMenuService; @Override public void add(SysRelationshipAddParam addParam) { @@ -107,14 +111,27 @@ 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); } @@ -139,7 +156,9 @@ public class SysRelationshipServiceImpl return relationshipEntity; }).toList(); // 删除此角色原来的授权信息 - deleteByTarget(Collections.singletonList(reauthorizationUserParam.getRoleId())); + deleteByTargetAndType( + Collections.singletonList(reauthorizationUserParam.getRoleId()), + SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE); // 保存实体集合 saveBatch(relationshipEntityList); return columnExistence; @@ -186,4 +205,52 @@ public class SysRelationshipServiceImpl return columnExistence; } + + @Override + @Transactional(rollbackFor = Exception.class) + public EntityColumnExistence authorizationMenu(SysRoleAuthorizationMenuParam param) { + // 检查角色是否存在 + sysRoleService.findEntity(param.getRoleId()); + // 检查菜单列表中的菜单是否都存在 + EntityColumnExistence columnExistence = + sysMenuService.filterDoesNotExistColumn(SysMenuEntity::getId, param.getMenuIdList()); + if (ObjectUtil.isEmpty(columnExistence.getExistColumnList())) { + throw new CommonServiceException("被授权的菜单全部都不存在"); + } + + // 当前方法的授权类型 + SysRelationshipTypeEnum category = SysRelationshipTypeEnum.SYS_ROLE_RELATE_SYS_MENU; + + // 分别处理重新授权与追加授权 + if (param.getIsReauthorization() != null && param.getIsReauthorization()) { + // 重新授权 + + // 构造实体集合 + List relationshipEntityList = columnExistence.getExistColumnList().stream() + .map(menuId -> new SysRelationshipEntity(param.getRoleId(), menuId, category)).toList(); + // 删除此角色原来的菜单授权信息 + deleteByObjectAndType(Collections.singletonList(param.getRoleId()), category); + // 保存实体信息 + saveBatch(relationshipEntityList); + } else { + // 追加授权 + + // 查询此角色授权的信息 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysRelationshipEntity::getObjectId, param.getRoleId()) + .eq(SysRelationshipEntity::getCategory, category); + List roleRelationshipList = super.list(queryWrapper); + + // 去掉已经授权的菜单,得到需要追加的菜单id + List additionAuthorizationMenuIdList = new ArrayList<>(columnExistence.getExistColumnList()); + additionAuthorizationMenuIdList.removeAll(roleRelationshipList.stream() + .map(SysRelationshipEntity::getTargetId).toList()); + + // 构造实体集合 + List entityList = additionAuthorizationMenuIdList.stream() + .map(menuId -> new SysRelationshipEntity(param.getRoleId(), menuId, category)).toList(); + super.saveBatch(entityList); + } + return 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 c967a78..072d76c 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 @@ -122,7 +122,7 @@ public class SysRoleController { return CommonResult.ok("用户" + JSONUtil.toJsonStr(columnExistence.getExistColumnList()) + "已授权成功。" + "用户" + JSONUtil.toJsonStr(columnExistence.getDoesNotExistColumnList()) - + "由于不存在所以授权失败。", null); + + "由于不存在所以未授权。", null); } @PostMapping("/incrementAuthorizationUsers") @@ -134,4 +134,21 @@ public class SysRoleController { sysRelationshipService.incrementAuthorizationUsers(reauthorizationUserParam); return CommonResult.ok(); } + + @PostMapping("/authorizationMenus") + @Operation(summary = "授权菜单", description = "给角色授权授权菜单") + @CommonLog(value = "授权菜单", description = "给角色授权授权菜单", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) + public CommonResult authorizationMenus( + @Validated @RequestBody SysRoleAuthorizationMenuParam roleAuthorizationMenuParam) { + EntityColumnExistence columnExistence = + sysRelationshipService.authorizationMenu(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 0000000..350a51a --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationMenuParam.java @@ -0,0 +1,38 @@ +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集合") + @Size(min = 1, max = 10000, message = "一次性授权个数范围[1, 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 5f164a8..34d3047 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 @@ -26,7 +26,7 @@ public class SysRoleAuthorizationUserParam { private Integer roleId; @Schema(title = "用户id集合", description = "被授权的用户id集合") - @Size(min = 1, max = 10000, message = "一次性授权用户的个数范围[1, 10000]") + @Size(min = 1, max = 10000, message = "一次性授权个数范围[1, 10000]") @CollectionElementNotNull(message = "集合中的用户id不能为空") private Set userIdList; } 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 cc7fba1..f8f5262 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] 为角色授权菜单权限 +- [ ] 为用户授权菜单权限 +- [ ] 把用户授权角色的两个结构按照角色授权菜单的方式整合为一个接口 -- Gitee From 941c2f74c541fb7655cd7467146c944813485fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Mon, 8 Apr 2024 17:26:15 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bo/SysRelationshipObjectAuthTargetBo.java | 40 ++++ .../bo/SysRelationshipTargetAuthObjectBo.java | 40 ++++ .../service/SysRelationshipService.java | 42 +++- .../impl/SysRelationshipServiceImpl.java | 196 ++++++++++-------- .../role/controller/SysRoleController.java | 48 +---- .../param/SysRoleAuthorizationUserParam.java | 6 + .../user/controller/SysUserController.java | 18 ++ 7 files changed, 252 insertions(+), 138 deletions(-) create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/bo/SysRelationshipObjectAuthTargetBo.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/bo/SysRelationshipTargetAuthObjectBo.java 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 0000000..3f92444 --- /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 0000000..b057a56 --- /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/service/SysRelationshipService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/SysRelationshipService.java index 8672c6a..d7382fd 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,12 +3,11 @@ 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.enums.SysRelationshipTypeEnum; -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.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; @@ -87,18 +86,39 @@ public interface SysRelationshipService extends IService void deleteByTargetAndType(List deleteTargetList, SysRelationshipTypeEnum type); /** - * 重新给角色授权用户 + * objectId授权targetIdList * - * @param assignUserParam 角色id与用户id集合 + * @param objectAuthTargetBo objectId授权targetIdList参数,包含objectId,targetIdList,isReauthorization以及category + * @param entityColumnExistence 存在性校验对象,包含存在的实体id集合与不存在的实体id集合 + * @return 返回的对象包含两个集合,一个为授权成功的id集合,另一个为不存在的id集合 */ - EntityColumnExistence reauthorizationUsers(SysRoleAuthorizationUserParam assignUserParam); + 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 incrementAuthorizationUsers(SysRoleAuthorizationUserParam assignUserParam); + EntityColumnExistence targetAuthObject( + SysRelationshipTargetAuthObjectBo targetAuthObjectBo, EntityColumnExistence entityColumnExistence); + + /** + * 角色授权用户集合 + * + * @param roleAuthorizationMenuParam 包含角色id,用户id集合,是否重新授权 + * @return 返回的对象包含两个集合,一个为授权成功的id集合,另一个为不存在的id集合 + */ + EntityColumnExistence roleIdAuthUserIdList(SysRoleAuthorizationUserParam roleAuthorizationMenuParam); + + /** + * 角色授权菜单集合 + * + * @param param 包含角色id,菜单id集合,是否重新授权 + * @return 返回的对象包含两个集合,一个为授权成功的id集合,另一个为不存在的id集合 + */ + EntityColumnExistence roleIdAuthMenuIdList(SysRoleAuthorizationMenuParam param); - EntityColumnExistence authorizationMenu(SysRoleAuthorizationMenuParam roleAuthorizationMenuParam); } \ 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 38588be..49175d8 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 @@ -13,6 +13,8 @@ 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; @@ -137,78 +139,119 @@ public class SysRelationshipServiceImpl @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 { + // 追加授权 + + // 查询此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(); - // 删除此角色原来的授权信息 - deleteByTargetAndType( - Collections.singletonList(reauthorizationUserParam.getRoleId()), - SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE); - // 保存实体集合 - saveBatch(relationshipEntityList); - return columnExistence; + return entityColumnExistence; } @Override @Transactional(rollbackFor = Exception.class) - public EntityColumnExistence incrementAuthorizationUsers( - SysRoleAuthorizationUserParam incrementAuthorizationUserParam) { + public EntityColumnExistence targetAuthObject( + SysRelationshipTargetAuthObjectBo targetAuthObjectBo, + EntityColumnExistence entityColumnExistence) { + + // 分别处理重新授权与追加授权 + if (targetAuthObjectBo.getIsReauthorization() != null && targetAuthObjectBo.getIsReauthorization()) { + // 重新授权 + + // 构造实体集合 + 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 { + // 追加授权 + + // 查询此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; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public EntityColumnExistence roleIdAuthUserIdList(SysRoleAuthorizationUserParam param) { // 检查角色是否存在 - sysRoleService.findEntity(incrementAuthorizationUserParam.getRoleId()); + sysRoleService.findEntity(param.getRoleId()); // 检查用户列表中的用户是否都存在 - EntityColumnExistence columnExistence = sysUserService.filterDoesNotExistColumn( - SysUserEntity::getId, incrementAuthorizationUserParam.getUserIdList()); + EntityColumnExistence columnExistence = + sysUserService.filterDoesNotExistColumn(SysUserEntity::getId, param.getUserIdList()); if (ObjectUtil.isEmpty(columnExistence.getExistColumnList())) { throw new CommonServiceException("被授权的用户全部都不存在"); } - // 查询此角色授权的信息 - LambdaQueryWrapper relationshipQueryWrapper = new LambdaQueryWrapper<>(); - relationshipQueryWrapper.eq(SysRelationshipEntity::getTargetId, incrementAuthorizationUserParam.getRoleId()) - .eq(SysRelationshipEntity::getCategory, SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE); - List roleRelationshipList = list(relationshipQueryWrapper); - - // 去掉已经授权的用户 - List incrementAuthorizationUserIdList = new ArrayList<>(columnExistence.getExistColumnList()); - incrementAuthorizationUserIdList.removeAll(roleRelationshipList.stream() - .map(SysRelationshipEntity::getObjectId).toList()); - - if (ObjectUtil.isEmpty(incrementAuthorizationUserIdList)) { - throw new CommonServiceException("无新增授权用户"); - } + // 创建bo对象(实际的作用就是额外添加了category属性) + SysRelationshipTargetAuthObjectBo targetAuthObjectBo = new SysRelationshipTargetAuthObjectBo( + param.getUserIdList(), + param.getRoleId(), + param.getIsReauthorization(), + SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE + ); - // 将新的用户与角色关系保存 - 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; + // 调用objectId授权targetIdList方法 + return targetAuthObject(targetAuthObjectBo, columnExistence); } @Override @Transactional(rollbackFor = Exception.class) - public EntityColumnExistence authorizationMenu(SysRoleAuthorizationMenuParam param) { + public EntityColumnExistence roleIdAuthMenuIdList(SysRoleAuthorizationMenuParam param) { // 检查角色是否存在 sysRoleService.findEntity(param.getRoleId()); // 检查菜单列表中的菜单是否都存在 @@ -218,39 +261,16 @@ public class SysRelationshipServiceImpl throw new CommonServiceException("被授权的菜单全部都不存在"); } - // 当前方法的授权类型 - SysRelationshipTypeEnum category = SysRelationshipTypeEnum.SYS_ROLE_RELATE_SYS_MENU; - - // 分别处理重新授权与追加授权 - if (param.getIsReauthorization() != null && param.getIsReauthorization()) { - // 重新授权 + // 创建bo对象(实际的作用就是额外添加了category属性) + SysRelationshipObjectAuthTargetBo objectAuthTargetBo = new SysRelationshipObjectAuthTargetBo( + param.getRoleId(), + param.getMenuIdList(), + param.getIsReauthorization(), + SysRelationshipTypeEnum.SYS_ROLE_RELATE_SYS_MENU); - // 构造实体集合 - List relationshipEntityList = columnExistence.getExistColumnList().stream() - .map(menuId -> new SysRelationshipEntity(param.getRoleId(), menuId, category)).toList(); - // 删除此角色原来的菜单授权信息 - deleteByObjectAndType(Collections.singletonList(param.getRoleId()), category); - // 保存实体信息 - saveBatch(relationshipEntityList); - } else { - // 追加授权 + // 调用objectId授权targetIdList方法 + return objectAuthTarget(objectAuthTargetBo, columnExistence); + } - // 查询此角色授权的信息 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysRelationshipEntity::getObjectId, param.getRoleId()) - .eq(SysRelationshipEntity::getCategory, category); - List roleRelationshipList = super.list(queryWrapper); - // 去掉已经授权的菜单,得到需要追加的菜单id - List additionAuthorizationMenuIdList = new ArrayList<>(columnExistence.getExistColumnList()); - additionAuthorizationMenuIdList.removeAll(roleRelationshipList.stream() - .map(SysRelationshipEntity::getTargetId).toList()); - - // 构造实体集合 - List entityList = additionAuthorizationMenuIdList.stream() - .map(menuId -> new SysRelationshipEntity(param.getRoleId(), menuId, category)).toList(); - super.saveBatch(entityList); - } - return 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 072d76c..98db5ad 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,34 +88,14 @@ 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(); } @@ -125,24 +105,14 @@ public class SysRoleController { + "由于不存在所以未授权。", null); } - @PostMapping("/incrementAuthorizationUsers") - @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(); - } - - @PostMapping("/authorizationMenus") + @PostMapping("/roleIdAuthMenuIdList") @Operation(summary = "授权菜单", description = "给角色授权授权菜单") @CommonLog(value = "授权菜单", description = "给角色授权授权菜单", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) - public CommonResult authorizationMenus( + public CommonResult roleIdAuthMenuIdList( @Validated @RequestBody SysRoleAuthorizationMenuParam roleAuthorizationMenuParam) { EntityColumnExistence columnExistence = - sysRelationshipService.authorizationMenu(roleAuthorizationMenuParam); + sysRelationshipService.roleIdAuthMenuIdList(roleAuthorizationMenuParam); if (ObjectUtil.isEmpty(columnExistence.getDoesNotExistColumnList())) { return CommonResult.ok(); } 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 34d3047..0f318d8 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 @@ -29,4 +29,10 @@ public class SysRoleAuthorizationUserParam { @Size(min = 1, max = 10000, message = "一次性授权个数范围[1, 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 aae0e23..a9d4af0 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 @@ -120,5 +120,23 @@ public class SysUserController { return CommonResult.ok("登出成功", null); } + // TODO 单独给用户授权菜单 +// @PostMapping("/authorizationMenus") +// @Operation(summary = "授权菜单", description = "单独给用户授权菜单") +// @CommonLog(value = "授权菜单", description = "单独给用户授权菜单", +// module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) +// public CommonResult authorizationMenus( +// @Validated @RequestBody SysRoleAuthorizationMenuParam roleAuthorizationMenuParam) { +// EntityColumnExistence columnExistence = +// sysRelationshipService.authorizationMenu(roleAuthorizationMenuParam); +// 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 -- Gitee From a83d82f18151fdfe387fb90d844b5cca8e0514b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Tue, 9 Apr 2024 15:40:14 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=EF=BC=8C=E5=85=81=E8=AE=B8=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=8E=88=E6=9D=83=EF=BC=8C=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E8=8F=9C=E5=8D=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../milkbox/common/service/CommonService.java | 2 +- .../service/impl/CommonServiceImpl.java | 5 ++ .../service/SysRelationshipService.java | 12 ++++- .../impl/SysRelationshipServiceImpl.java | 51 ++++++++++++++----- .../param/SysRoleAuthorizationMenuParam.java | 6 ++- .../param/SysRoleAuthorizationUserParam.java | 6 ++- .../user/controller/SysUserController.java | 40 ++++++++------- .../param/SysUserAuthorizationMenuParam.java | 40 +++++++++++++++ "\345\244\207\345\277\230\345\275\225.md" | 4 +- 9 files changed, 128 insertions(+), 38 deletions(-) create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserAuthorizationMenuParam.java 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 f7d977e..6ad2802 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 08efb78..ef6f294 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/relationship/service/SysRelationshipService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/SysRelationshipService.java index d7382fd..4a7e2fa 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 @@ -11,6 +11,7 @@ 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; @@ -108,10 +109,10 @@ public interface SysRelationshipService extends IService /** * 角色授权用户集合 * - * @param roleAuthorizationMenuParam 包含角色id,用户id集合,是否重新授权 + * @param param 包含角色id,用户id集合,是否重新授权 * @return 返回的对象包含两个集合,一个为授权成功的id集合,另一个为不存在的id集合 */ - EntityColumnExistence roleIdAuthUserIdList(SysRoleAuthorizationUserParam roleAuthorizationMenuParam); + EntityColumnExistence roleIdAuthUserIdList(SysRoleAuthorizationUserParam param); /** * 角色授权菜单集合 @@ -121,4 +122,11 @@ public interface SysRelationshipService extends IService */ 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 49175d8..482fc3d 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 @@ -28,6 +28,7 @@ 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; @@ -160,6 +161,12 @@ public class SysRelationshipServiceImpl } else { // 追加授权 + // 判断targetIdList是否为空,如果为空则没必要进行授权操作 + if (ObjectUtil.isEmpty(entityColumnExistence.getExistColumnList())) { + throw new CommonServiceException("授权的集合{}中无可用的对象,授权停止", + objectAuthTargetBo.getTargetIdList()); + } + // 查询此objectId授权的信息 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysRelationshipEntity::getObjectId, objectAuthTargetBo.getObjectId()) @@ -204,6 +211,12 @@ public class SysRelationshipServiceImpl } else { // 追加授权 + // 判断objectIdList是否为空,如果为空则没必要进行授权操作 + if (ObjectUtil.isEmpty(entityColumnExistence.getExistColumnList())) { + throw new CommonServiceException("授权的集合{}中无可用的对象,授权停止", + targetAuthObjectBo.getObjectIdList()); + } + // 查询此targetId已经授权的对象信息 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysRelationshipEntity::getTargetId, targetAuthObjectBo.getTargetId()) @@ -230,12 +243,6 @@ public class SysRelationshipServiceImpl public EntityColumnExistence roleIdAuthUserIdList(SysRoleAuthorizationUserParam param) { // 检查角色是否存在 sysRoleService.findEntity(param.getRoleId()); - // 检查用户列表中的用户是否都存在 - EntityColumnExistence columnExistence = - sysUserService.filterDoesNotExistColumn(SysUserEntity::getId, param.getUserIdList()); - if (ObjectUtil.isEmpty(columnExistence.getExistColumnList())) { - throw new CommonServiceException("被授权的用户全部都不存在"); - } // 创建bo对象(实际的作用就是额外添加了category属性) SysRelationshipTargetAuthObjectBo targetAuthObjectBo = new SysRelationshipTargetAuthObjectBo( @@ -245,6 +252,9 @@ public class SysRelationshipServiceImpl SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE ); + // 列存在性对象,查询用户id集合中存在的id和不存在的id + EntityColumnExistence columnExistence = + sysUserService.filterDoesNotExistColumn(SysUserEntity::getId, param.getUserIdList()); // 调用objectId授权targetIdList方法 return targetAuthObject(targetAuthObjectBo, columnExistence); } @@ -254,12 +264,6 @@ public class SysRelationshipServiceImpl public EntityColumnExistence roleIdAuthMenuIdList(SysRoleAuthorizationMenuParam param) { // 检查角色是否存在 sysRoleService.findEntity(param.getRoleId()); - // 检查菜单列表中的菜单是否都存在 - EntityColumnExistence columnExistence = - sysMenuService.filterDoesNotExistColumn(SysMenuEntity::getId, param.getMenuIdList()); - if (ObjectUtil.isEmpty(columnExistence.getExistColumnList())) { - throw new CommonServiceException("被授权的菜单全部都不存在"); - } // 创建bo对象(实际的作用就是额外添加了category属性) SysRelationshipObjectAuthTargetBo objectAuthTargetBo = new SysRelationshipObjectAuthTargetBo( @@ -268,6 +272,29 @@ public class SysRelationshipServiceImpl 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/param/SysRoleAuthorizationMenuParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationMenuParam.java index 350a51a..53cd664 100644 --- 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 @@ -25,8 +25,10 @@ public class SysRoleAuthorizationMenuParam { @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 menuIdList; 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 0f318d8..77fd6a6 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,10 @@ 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; 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 a9d4af0..f364acc 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,23 +127,22 @@ public class SysUserController { return CommonResult.ok("登出成功", null); } - // TODO 单独给用户授权菜单 -// @PostMapping("/authorizationMenus") -// @Operation(summary = "授权菜单", description = "单独给用户授权菜单") -// @CommonLog(value = "授权菜单", description = "单独给用户授权菜单", -// module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) -// public CommonResult authorizationMenus( -// @Validated @RequestBody SysRoleAuthorizationMenuParam roleAuthorizationMenuParam) { -// EntityColumnExistence columnExistence = -// sysRelationshipService.authorizationMenu(roleAuthorizationMenuParam); -// if (ObjectUtil.isEmpty(columnExistence.getDoesNotExistColumnList())) { -// return CommonResult.ok(); -// } -// -// return CommonResult.ok("菜单" + JSONUtil.toJsonStr(columnExistence.getExistColumnList()) + "已授权成功。" -// + "菜单" + JSONUtil.toJsonStr(columnExistence.getDoesNotExistColumnList()) -// + "由于不存在所以未授权。", 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 0000000..144a305 --- /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 f8f5262..d06e257 100644 --- "a/\345\244\207\345\277\230\345\275\225.md" +++ "b/\345\244\207\345\277\230\345\275\225.md" @@ -13,6 +13,6 @@ - [x] 菜单表基础功能 - [x] 为角色授权菜单权限 -- [ ] 为用户授权菜单权限 -- [ ] 把用户授权角色的两个结构按照角色授权菜单的方式整合为一个接口 +- [x] 为用户授权菜单权限 +- [x] 把用户授权角色的两个接口按照角色授权菜单的方式整合为一个接口 -- Gitee