From d3c9445b77a68391443b6a71adce70041723150c 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, 29 Jan 2024 18:13:24 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=A1=AB=E5=85=85=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E6=A0=A1=E9=AA=8C=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 + .../mybatisPlus/MyMetaObjectHandler.java | 25 +++- .../annotation/CollectionElementNotNull.java | 41 ++++++ .../CollectionElementNotNullValidator.java | 24 ++++ .../main/controller/LogMainController.java | 3 +- .../modular/main/param/LogMainAddParam.java | 8 ++ .../main/service/impl/LogMainServiceImpl.java | 24 +++- .../menu/controller/SysMenuController.java | 97 +++++++++++++ .../modular/menu/entity/SysMenuEntity.java | 127 ++++++++++++++++++ .../modular/menu/enums/SysMenuTypeEnum.java | 40 ++++++ .../modular/menu/mapper/SysMenuMapper.java | 16 +++ .../menu/mapper/mapping/SysMenuMapper.xml | 6 + .../modular/menu/param/SysMenuAddParam.java | 102 ++++++++++++++ .../modular/menu/param/SysMenuEditParam.java | 111 +++++++++++++++ .../modular/menu/param/SysMenuIdParam.java | 30 +++++ .../modular/menu/param/SysMenuPageParam.java | 103 ++++++++++++++ .../modular/menu/service/SysMenuService.java | 75 +++++++++++ .../menu/service/impl/SysMenuServiceImpl.java | 114 ++++++++++++++++ .../sys/modular/menu/vo/SysMenuVo.java | 111 +++++++++++++++ .../controller/SysRelationshipController.java | 93 ++++++------- .../enums/SysRelationshipTypeEnum.java | 2 +- .../service/SysRelationshipService.java | 16 +-- .../impl/SysRelationshipServiceImpl.java | 46 +++---- .../role/controller/SysRoleController.java | 17 ++- .../role/param/SysRoleAssignUserParam.java | 30 +++++ .../modular/role/service/SysRoleService.java | 12 +- .../role/service/impl/SysRoleServiceImpl.java | 11 +- .../user/controller/SysUserController.java | 5 +- 28 files changed, 1188 insertions(+), 103 deletions(-) create mode 100644 milkbox-common/src/main/java/top/milkbox/common/validation/annotation/CollectionElementNotNull.java create mode 100644 milkbox-common/src/main/java/top/milkbox/common/validation/validator/CollectionElementNotNullValidator.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/controller/SysMenuController.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/entity/SysMenuEntity.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/enums/SysMenuTypeEnum.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapper/SysMenuMapper.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapper/mapping/SysMenuMapper.xml create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuAddParam.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuEditParam.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuIdParam.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuPageParam.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/SysMenuService.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/vo/SysMenuVo.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAssignUserParam.java diff --git a/README.md b/README.md index 445a366..3d0cf33 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ 权限认证(SaToken) +密码保护(BCrypt) + # 升级java21的问题 升级到java21以后的启动参数,不加会报错 diff --git a/milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java b/milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java index a425dcb..8439190 100644 --- a/milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java +++ b/milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java @@ -1,5 +1,8 @@ package top.milkbox.app.core.handler.mybatisPlus; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.exception.NotWebContextException; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.date.DateTime; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; @@ -9,21 +12,31 @@ import top.milkbox.common.enums.CommonDeleteFlagEnum; import java.util.Date; /** - * 常用字段自动填充器 + * 常用字段自动填充器
+ * 默认填充策略:如果原来的属性有值则不覆盖,如果手动在这里改为null则不填充 * 创建时间: 2024-01-15 下午 4:08 * * @author milkbox */ @Component public class MyMetaObjectHandler implements MetaObjectHandler { + + private Integer getLoginId() { + try { + return StpUtil.getLoginIdAsInt(); + } catch (NotLoginException e) { // 未登录 + return null; + } catch (NotWebContextException e) { // 非web上下文,无法使用sa-token + return null; + } + } + @Override public void insertFill(MetaObject metaObject) { // 删除字段 this.strictInsertFill(metaObject, "deleteFlag", () -> CommonDeleteFlagEnum.NOT_DELETE, CommonDeleteFlagEnum.class); - // TODO 创建人,这个需要saToken - this.strictInsertFill(metaObject, "createUser", - () -> -1, Integer.class); + this.strictInsertFill(metaObject, "createUser", this::getLoginId, Integer.class); // 创建时间 this.strictInsertFill(metaObject, "createTime", DateTime::now, Date.class); @@ -31,9 +44,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void updateFill(MetaObject metaObject) { - // TODO 更新人,这个需要saToken - this.strictUpdateFill(metaObject, "updateUser", - () -> -1, Integer.class); + this.strictUpdateFill(metaObject, "updateUser", this::getLoginId, Integer.class); // 更新时间 this.strictUpdateFill(metaObject, "updateTime", DateTime::now, Date.class); diff --git a/milkbox-common/src/main/java/top/milkbox/common/validation/annotation/CollectionElementNotNull.java b/milkbox-common/src/main/java/top/milkbox/common/validation/annotation/CollectionElementNotNull.java new file mode 100644 index 0000000..534ab5b --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/validation/annotation/CollectionElementNotNull.java @@ -0,0 +1,41 @@ +package top.milkbox.common.validation.annotation; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import top.milkbox.common.validation.validator.CollectionElementNotNullValidator; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +// TODO 请参照此注解编写更多的自定义校验,例如手机号、邮箱等 + +/** + * 自定义校验注解
+ * 校验集合中的每一个元素都不为空
+ * 如果校验对象为空、集合元素为0或集合中的所有元素都不为空则校验通过
+ * 创建时间: 2024-01-29 下午 2:22 + * + * @author milkbox + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = CollectionElementNotNullValidator.class) // 校验的逻辑处理类 +public @interface CollectionElementNotNull { + + /** + * 提示的信息 + * + * @return 默认值:集合中不能出现空元素 + */ + String message() default "集合中不能出现空元素"; + + /** + * 分组验证 + * + * @return 默认值:{} + */ + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/milkbox-common/src/main/java/top/milkbox/common/validation/validator/CollectionElementNotNullValidator.java b/milkbox-common/src/main/java/top/milkbox/common/validation/validator/CollectionElementNotNullValidator.java new file mode 100644 index 0000000..f97708f --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/validation/validator/CollectionElementNotNullValidator.java @@ -0,0 +1,24 @@ +package top.milkbox.common.validation.validator; + +import cn.hutool.core.util.ObjectUtil; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import top.milkbox.common.validation.annotation.CollectionElementNotNull; + +import java.util.Collection; + +/** + * 创建时间: 2024-01-29 下午 2:27 + * + * @author milkbox + */ +public class CollectionElementNotNullValidator implements ConstraintValidator> { + + @Override + public boolean isValid(Collection value, ConstraintValidatorContext context) { + if (ObjectUtil.isNotEmpty(value)) { + return value.stream().noneMatch(ObjectUtil::isNull); + } + return true; + } +} diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java index 874881f..4d1d855 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java @@ -11,6 +11,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import top.milkbox.common.annotation.CommonLog; import top.milkbox.common.enums.LogTypeEnum; +import top.milkbox.common.validation.annotation.CollectionElementNotNull; import top.milkbox.log.core.config.LogConfiguration; import top.milkbox.log.modular.main.param.LogMainAddParam; import top.milkbox.log.modular.main.param.LogMainEditParam; @@ -50,9 +51,9 @@ public class LogMainController { @Operation(summary = "批量删除") @CommonLog(value = "批量删除", module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) public CommonResult delete( - @Validated @RequestBody @Size(min = 1, message = "请至少传递一个删除对象") + @CollectionElementNotNull(message = "集合中的删除对象不能为空") List<@Valid LogMainIdParam> paramList ) { logMainService.delete(paramList); diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java index 903c6b3..9934a20 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java @@ -117,4 +117,12 @@ public class LogMainAddParam implements Serializable { description = "类型。枚举") private LogTypeEnum type; + /** + * 创建人
+ * 日志的添加不存在api添加的情况
+ * 由于日志是异步保存的,在mybatis-plus的自动填充功能中无法使用sa-token,所以这个字段需要手动赋值 + */ + @Schema(title = "创建人") + private Integer createUser; + } \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java index 4a7c5c0..bc99591 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java @@ -1,5 +1,7 @@ package top.milkbox.log.modular.main.service.impl; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -120,9 +122,10 @@ public class LogMainServiceImpl extends ServiceImpl { LogMainAddParam addParam = - createLogMainAddParam(servletRequestAttributes, joinPoint, result, null); + createLogMainAddParam(servletRequestAttributes, joinPoint, result, null, loginIdAsInt); add(addParam); }); } @@ -131,13 +134,25 @@ public class LogMainServiceImpl extends ServiceImpl { LogMainAddParam addParam = - createLogMainAddParam(servletRequestAttributes, joinPoint, null, throwable); + createLogMainAddParam(servletRequestAttributes, joinPoint, null, throwable, loginIdAsInt); add(addParam); }); } + /** + * @return 返回当前登录用户的id,如果未登录则返回空 + */ + private Integer getLoginId() { + try { + return StpUtil.getLoginIdAsInt(); + } catch (NotLoginException e) { + return null; + } + } + /** * 构建日志addParam对象 * @@ -145,11 +160,12 @@ public class LogMainServiceImpl extends ServiceImpl add(@Validated @RequestBody SysMenuAddParam addParam) { + sysMenuService.add(addParam); + return CommonResult.ok(); + } + + @DeleteMapping("/delete") + @Operation(summary = "批量删除") + @CommonLog(value = "批量删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) + public CommonResult delete( + @RequestBody + @Size(min = 1, message = "请至少传递一个删除对象") + @CollectionElementNotNull(message = "集合中的删除对象不能为空") + List<@Valid SysMenuIdParam> paramList + ) { + sysMenuService.delete(paramList); + return CommonResult.ok(); + } + + @PutMapping("/edit") + @Operation(summary = "修改", description = "修改一条数据") + @CommonLog(value = "修改", description = "修改一条数据", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) + public CommonResult edit(@Validated @RequestBody SysMenuEditParam editParam) { + sysMenuService.edit(editParam); + return CommonResult.ok(); + } + + @GetMapping("/detail") + @Operation(summary = "详情", description = "查询一条数据的详情") + @CommonLog(value = "详情", description = "查询一条数据的详情", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + public CommonResult detail(@Validated SysMenuIdParam idParam) { + return CommonResult.ok(sysMenuService.detail(idParam)); + } + +// @GetMapping("/page") +// @Operation(summary = "分页查询", description = "查询条件分页查询") +// @CommonLog(value = "分页查询", description = "查询条件分页查询", +// module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) +// public CommonResult> page(@Validated SysMenuPageParam pageParam) { +// return CommonResult.ok(sysMenuService.page(pageParam)); +// } + + @GetMapping("/forest") + @Operation(summary = "获取菜单森林", description = "获取当前登录用户拥有权限的菜单森林") + @CommonLog(value = "获取菜单森林", description = "获取当前登录用户拥有权限的菜单森林", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + public CommonResult>> forest() { + return CommonResult.ok(sysMenuService.forest()); + } + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/entity/SysMenuEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/entity/SysMenuEntity.java new file mode 100644 index 0000000..ef540d0 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/entity/SysMenuEntity.java @@ -0,0 +1,127 @@ +package top.milkbox.sys.modular.menu.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.common.pojo.CommonEntity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import top.milkbox.sys.modular.menu.enums.SysMenuTypeEnum; + +/** + * 系统_菜单表 + * + * @author milkbox + * @date 2024-1-29 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "sys_menu", autoResultMap = true) +@Schema(description = "SysMenuEntity 系统_菜单表。") +public class SysMenuEntity extends CommonEntity implements Serializable { + + /** + * 主键 + */ + @TableId + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 上级id + */ + @Schema(title = "上级id", + description = "上级id") + private String parentId; + + /** + * 中文名 + */ + @Schema(title = "中文名", + description = "中文名") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String title; + + /** + * 组件唯一别名 + */ + @Schema(title = "组件唯一别名", + description = "组件唯一别名") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String name; + + /** + * 组件的导包路径;相对于组件的基准目录,基准目录单独配置,开头不加反斜杠 + */ + @Schema(title = "组件的导包路径", + description = "组件的导包路径。相对于组件的基准目录,基准目录单独配置,开头不加反斜杠") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String component; + + /** + * 相对于父级的路由地址;开头要加反斜杠,可以多级 + */ + @Schema(title = "相对于父级的路由地址", + description = "相对于父级的路由地址。开头要加反斜杠,可以多级") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String path; + + /** + * 重定向地址;当这个字段不为空表示有重定向,开启重定向后component字段失效 + */ + @Schema(title = "重定向地址", + description = "重定向地址。当这个字段不为空表示有重定向,开启重定向后component字段失效") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String redirect; + + /** + * 扩展信息;Json格式 + */ + @Schema(title = "扩展信息", + description = "扩展信息。Json格式") + @TableField(typeHandler = JacksonTypeHandler.class, updateStrategy = FieldStrategy.ALWAYS) + private Object extend; + + /** + * 是否可见;隐藏后可以访问页面,但不在菜单列表显示。1可见,0不可见 + */ + @Schema(title = "是否可见", + description = "是否可见。隐藏后可以访问页面,但不在菜单列表显示。1可见,0不可见") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private Integer isShow; + + /** + * 类型;菜单MENU或目录CATALOG + */ + @Schema(title = "类型", + description = "类型。菜单MENU或目录CATALOG") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private SysMenuTypeEnum type; + + /** + * 图标 + */ + @Schema(title = "图标", + description = "图标") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String icon; + + /** + * 主题颜色 + */ + @Schema(title = "主题颜色", + description = "主题颜色") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String color; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/enums/SysMenuTypeEnum.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/enums/SysMenuTypeEnum.java new file mode 100644 index 0000000..03cb4e4 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/enums/SysMenuTypeEnum.java @@ -0,0 +1,40 @@ +package top.milkbox.sys.modular.menu.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; + +/** + * 菜单类型枚举
+ * 创建时间: 2024-01-29 下午 12:02 + * + * @author milkbox + */ +@AllArgsConstructor // 如果使用此注解,请勿随意修改成员变量的定义顺序 +public enum SysMenuTypeEnum { + + MENU("菜单", "MENU"), + CATEGORY("目录", "CATEGORY"); + + private final String label; + + @EnumValue // mybatis-plus控制数据库字段,数据库中保存的字段。如果数据库中的字段与不在枚举中则返回空 + private final String value; + + public String getLabel() { + return label; + } + + @JsonValue // jackson的标识,用于json转枚举的时候使用的字段 + public String getValue() { + return value; + } + + /** + * 枚举对象转为json的时候,字段的值 + */ + @Override + public String toString() { + return value; + } +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapper/SysMenuMapper.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapper/SysMenuMapper.java new file mode 100644 index 0000000..6ebb1f1 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapper/SysMenuMapper.java @@ -0,0 +1,16 @@ +package top.milkbox.sys.modular.menu.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import top.milkbox.sys.modular.menu.entity.SysMenuEntity; + +/** + * 系统_菜单表(sys_menu)表数据库访问层 + * + * @author milkbox + * @date 2024-1-29 + */ +@Mapper +public interface SysMenuMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapper/mapping/SysMenuMapper.xml b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapper/mapping/SysMenuMapper.xml new file mode 100644 index 0000000..3d5da26 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapper/mapping/SysMenuMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuAddParam.java new file mode 100644 index 0000000..587fa20 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuAddParam.java @@ -0,0 +1,102 @@ +package top.milkbox.sys.modular.menu.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import jakarta.validation.constraints.NotBlank; +import top.milkbox.sys.modular.menu.entity.SysMenuEntity; +import top.milkbox.sys.modular.menu.enums.SysMenuTypeEnum; + +/** + * 添加参数对象 + * + * @author milkbox + * @date 2024-1-29 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysMenuAddParam implements Serializable { + + /** + * 上级id + */ + @Schema(title = "上级id", + description = "上级id") + @NotBlank(message = "上级id不能为空") + private String parentId; + + /** + * 中文名 + */ + @Schema(title = "中文名", + description = "中文名") + private String title; + + /** + * 组件唯一别名 + */ + @Schema(title = "组件唯一别名", + description = "组件唯一别名") + private String name; + + /** + * 组件的导包路径;相对于组件的基准目录,基准目录单独配置,开头不加反斜杠 + */ + @Schema(title = "组件的导包路径", + description = "组件的导包路径。相对于组件的基准目录,基准目录单独配置,开头不加反斜杠") + private String component; + + /** + * 相对于父级的路由地址;开头要加反斜杠,可以多级 + */ + @Schema(title = "相对于父级的路由地址", + description = "相对于父级的路由地址。开头要加反斜杠,可以多级") + private String path; + + /** + * 重定向地址;当这个字段不为空表示有重定向,开启重定向后component字段失效 + */ + @Schema(title = "重定向地址", + description = "重定向地址。当这个字段不为空表示有重定向,开启重定向后component字段失效") + private String redirect; + + /** + * 扩展信息;Json格式 + */ + @Schema(title = "扩展信息", + description = "扩展信息。Json格式") + private Object extend; + + /** + * 是否可见;隐藏后可以访问页面,但不在菜单列表显示。1可见,0不可见 + */ + @Schema(title = "是否可见", + description = "是否可见。隐藏后可以访问页面,但不在菜单列表显示。1可见,0不可见") + private Integer isShow; + + /** + * 类型;菜单MENU或目录CATALOG + */ + @Schema(title = "类型", + description = "类型。菜单MENU或目录CATALOG") + private SysMenuTypeEnum type; + + /** + * 图标 + */ + @Schema(title = "图标", + description = "图标") + private String icon; + + /** + * 主题颜色 + */ + @Schema(title = "主题颜色", + description = "主题颜色") + private String color; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuEditParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuEditParam.java new file mode 100644 index 0000000..b07a658 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuEditParam.java @@ -0,0 +1,111 @@ +package top.milkbox.sys.modular.menu.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; +import top.milkbox.sys.modular.menu.entity.SysMenuEntity; +import top.milkbox.sys.modular.menu.enums.SysMenuTypeEnum; + +/** + * 编辑参数对象 + * + * @author milkbox + * @date 2024-1-29 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysMenuEditParam implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + @NotNull(message = "主键不能为空") + private Integer id; + + /** + * 上级id + */ + @Schema(title = "上级id", + description = "上级id") + @NotBlank(message = "上级id不能为空") + private String parentId; + + /** + * 中文名 + */ + @Schema(title = "中文名", + description = "中文名") + private String title; + + /** + * 组件唯一别名 + */ + @Schema(title = "组件唯一别名", + description = "组件唯一别名") + private String name; + + /** + * 组件的导包路径;相对于组件的基准目录,基准目录单独配置,开头不加反斜杠 + */ + @Schema(title = "组件的导包路径", + description = "组件的导包路径。相对于组件的基准目录,基准目录单独配置,开头不加反斜杠") + private String component; + + /** + * 相对于父级的路由地址;开头要加反斜杠,可以多级 + */ + @Schema(title = "相对于父级的路由地址", + description = "相对于父级的路由地址。开头要加反斜杠,可以多级") + private String path; + + /** + * 重定向地址;当这个字段不为空表示有重定向,开启重定向后component字段失效 + */ + @Schema(title = "重定向地址", + description = "重定向地址。当这个字段不为空表示有重定向,开启重定向后component字段失效") + private String redirect; + + /** + * 扩展信息;Json格式 + */ + @Schema(title = "扩展信息", + description = "扩展信息。Json格式") + private Object extend; + + /** + * 是否可见;隐藏后可以访问页面,但不在菜单列表显示。1可见,0不可见 + */ + @Schema(title = "是否可见", + description = "是否可见。隐藏后可以访问页面,但不在菜单列表显示。1可见,0不可见") + private Integer isShow; + + /** + * 类型;菜单MENU或目录CATALOG + */ + @Schema(title = "类型", + description = "类型。菜单MENU或目录CATALOG") + private SysMenuTypeEnum type; + + /** + * 图标 + */ + @Schema(title = "图标", + description = "图标") + private String icon; + + /** + * 主题颜色 + */ + @Schema(title = "主题颜色", + description = "主题颜色") + private String color; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuIdParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuIdParam.java new file mode 100644 index 0000000..ccdcaf5 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuIdParam.java @@ -0,0 +1,30 @@ +package top.milkbox.sys.modular.menu.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 主键参数对象 + * + * @author milkbox + * @date 2024-1-29 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysMenuIdParam implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + @NotNull(message = "主键不能为空") + private Integer id; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuPageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuPageParam.java new file mode 100644 index 0000000..94097ab --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/param/SysMenuPageParam.java @@ -0,0 +1,103 @@ +package top.milkbox.sys.modular.menu.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.common.pojo.CommonPageParam; +import top.milkbox.sys.modular.menu.entity.SysMenuEntity; +import top.milkbox.sys.modular.menu.enums.SysMenuTypeEnum; + +import java.io.Serializable; + +/** + * 分页参数对象 + * + * @author milkbox + * @date 2024-1-29 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysMenuPageParam extends CommonPageParam implements Serializable { + + /** + * 上级id + */ + @Schema(title = "上级id", + description = "上级id") + private String parentId; + + /** + * 中文名 + */ + @Schema(title = "中文名", + description = "中文名") + private String title; + + /** + * 组件唯一别名 + */ + @Schema(title = "组件唯一别名", + description = "组件唯一别名") + private String name; + + /** + * 组件的导包路径;相对于组件的基准目录,基准目录单独配置,开头不加反斜杠 + */ + @Schema(title = "组件的导包路径", + description = "组件的导包路径。相对于组件的基准目录,基准目录单独配置,开头不加反斜杠") + private String component; + + /** + * 相对于父级的路由地址;开头要加反斜杠,可以多级 + */ + @Schema(title = "相对于父级的路由地址", + description = "相对于父级的路由地址。开头要加反斜杠,可以多级") + private String path; + + /** + * 重定向地址;当这个字段不为空表示有重定向,开启重定向后component字段失效 + */ + @Schema(title = "重定向地址", + description = "重定向地址。当这个字段不为空表示有重定向,开启重定向后component字段失效") + private String redirect; + + /** + * 扩展信息;Json格式 + */ + @Schema(title = "扩展信息", + description = "扩展信息。Json格式") + private Object extend; + + /** + * 是否可见;隐藏后可以访问页面,但不在菜单列表显示。1可见,0不可见 + */ + @Schema(title = "是否可见", + description = "是否可见。隐藏后可以访问页面,但不在菜单列表显示。1可见,0不可见") + private Integer isShow; + + /** + * 类型;菜单MENU或目录CATALOG + */ + @Schema(title = "类型", + description = "类型。菜单MENU或目录CATALOG") + private SysMenuTypeEnum type; + + /** + * 图标 + */ + @Schema(title = "图标", + description = "图标") + private String icon; + + /** + * 主题颜色 + */ + @Schema(title = "主题颜色", + description = "主题颜色") + private String color; + +} \ No newline at end of file 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 new file mode 100644 index 0000000..ea32e88 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/SysMenuService.java @@ -0,0 +1,75 @@ +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.sys.modular.menu.entity.SysMenuEntity; +import top.milkbox.sys.modular.menu.param.SysMenuAddParam; +import top.milkbox.sys.modular.menu.param.SysMenuEditParam; +import top.milkbox.sys.modular.menu.param.SysMenuIdParam; +import top.milkbox.sys.modular.menu.param.SysMenuPageParam; +import top.milkbox.sys.modular.menu.vo.SysMenuVo; + +import java.util.List; + +/** + * 系统_菜单表(sys_menu)服务层接口 + * + * @author milkbox + * @date 2024-1-29 + */ +public interface SysMenuService extends IService { + + /** + * 添加 + * + * @param addParam 添加参数 + */ + void add(SysMenuAddParam addParam); + + /** + * 删除 + * + * @param paramList 删除id对象集合 + */ + void delete(List paramList); + + /** + * 通过id编辑 + * + * @param editParam 编辑参数 + */ + void edit(SysMenuEditParam editParam); + + /** + * 通过id查询详情 + * + * @param idParam id参数 + * @return 返回查询的详情,如果没有则返回空 + */ + SysMenuVo detail(SysMenuIdParam idParam); + + /** + * 查询实体,即简单查询,包含存在性校验,不存在报业务异常 + * + * @param entityId 实体id + * @return 返回实体 + */ + SysMenuEntity findEntity(Integer entityId); + + +// /** +// * 分页查询 +// * +// * @param pageParam 分页查询参数 +// * @return 返回苞米豆的分页对象,没有数据,则record长度为0 +// */ +// Page page(SysMenuPageParam pageParam); + + /** + * 获取当前登录用户拥有权限的菜单森林 + * + * @return 菜单森林 + */ + List> forest(); +} \ No newline at end of file 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 new file mode 100644 index 0000000..bc6b17e --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,114 @@ +package top.milkbox.sys.modular.menu.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import top.milkbox.common.enums.CommonSortTypeEnum; +import top.milkbox.common.exceprion.CommonServiceException; +import top.milkbox.sys.modular.menu.entity.SysMenuEntity; +import top.milkbox.sys.modular.menu.mapper.SysMenuMapper; +import top.milkbox.sys.modular.menu.param.SysMenuAddParam; +import top.milkbox.sys.modular.menu.param.SysMenuEditParam; +import top.milkbox.sys.modular.menu.param.SysMenuIdParam; +import top.milkbox.sys.modular.menu.param.SysMenuPageParam; +import top.milkbox.sys.modular.menu.service.SysMenuService; +import top.milkbox.sys.modular.menu.vo.SysMenuVo; +import top.milkbox.common.utils.CommonUtil; + +import java.util.List; + +/** + * 系统_菜单表(sys_menu)服务层实现类 + * + * @author milkbox + * @date 2024-1-29 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { + + private SysMenuMapper sysMenuMapper; + + @Override + public void add(SysMenuAddParam addParam) { + SysMenuEntity entity = BeanUtil.toBean(addParam, SysMenuEntity.class); + super.save(entity); + } + + @Override + public void delete(List paramList) { + super.removeByIds(paramList.stream().map(SysMenuIdParam::getId).toList()); + } + + @Override + public void edit(SysMenuEditParam editParam) { + findEntity(editParam.getId()); + SysMenuEntity entity = BeanUtil.toBean(editParam, SysMenuEntity.class); + super.updateById(entity); + } + + @Override + public SysMenuVo detail(SysMenuIdParam idParam) { + SysMenuEntity entity = findEntity(idParam.getId()); + SysMenuVo vo = BeanUtil.toBean(entity, SysMenuVo.class); + // 此处进行数据翻译操作,,根据不同的业务逻辑将entity对象转为vo对象...... + + return vo; + } + + @Override + public SysMenuEntity findEntity(Integer entityId) { + SysMenuEntity entity = super.getById(entityId); + if (ObjectUtil.isEmpty(entity)) { + throw new CommonServiceException("实体未找到({})", entityId); + } + return entity; + } + +// @Override +// public Page page(SysMenuPageParam pageParam) { +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// if (ObjectUtil.isAllNotEmpty(pageParam.getSortField(), pageParam.getSortType())) { +// queryWrapper.orderBy(true, +// pageParam.getSortType() == CommonSortTypeEnum.ASC, +// StrUtil.toUnderlineCase(pageParam.getSortField())); +// } else { +// queryWrapper.lambda().orderByAsc(SysMenuEntity::getSortCode); +// } +// queryWrapper.lambda().orderByAsc(SysMenuEntity::getId); +// +// Page entityPage = super.page(pageParam.toBaomidouPage(), queryWrapper); +// // 此处进行远程调用或关联查询...... +// +// Page voPage = CommonUtil.convertPage(entityPage, entity -> { +// SysMenuVo vo = BeanUtil.toBean(entity, SysMenuVo.class); +// // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... +// +// return vo; +// }); +// return voPage; +// } + + + @Override + public List> forest() { + int loginUserId = StpUtil.getLoginIdAsInt(); + // TODO 获取当前登录用户拥有权限的菜单森林 + // 查询用户所属的角色拥有权限的菜单id集合 + // 查询用户独有权限的菜单id集合 + // 合并两个集合 + // 根据id集合查询菜单表 + // 将菜单表转换为森林结构 + return null; + } + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/vo/SysMenuVo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/vo/SysMenuVo.java new file mode 100644 index 0000000..d06abb7 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/vo/SysMenuVo.java @@ -0,0 +1,111 @@ +package top.milkbox.sys.modular.menu.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.common.pojo.CommonVo; +import top.milkbox.sys.modular.menu.entity.SysMenuEntity; +import top.milkbox.sys.modular.menu.enums.SysMenuTypeEnum; + +import java.io.Serializable; + +/** + * 系统_菜单表默认vo + * + * @author milkbox + * @date 2024-1-29 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(description = "SysMenuEntity 系统_菜单表。") +public class SysMenuVo extends CommonVo implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 上级id + */ + @Schema(title = "上级id", + description = "上级id") + private String parentId; + + /** + * 中文名 + */ + @Schema(title = "中文名", + description = "中文名") + private String title; + + /** + * 组件唯一别名 + */ + @Schema(title = "组件唯一别名", + description = "组件唯一别名") + private String name; + + /** + * 组件的导包路径;相对于组件的基准目录,基准目录单独配置,开头不加反斜杠 + */ + @Schema(title = "组件的导包路径", + description = "组件的导包路径。相对于组件的基准目录,基准目录单独配置,开头不加反斜杠") + private String component; + + /** + * 相对于父级的路由地址;开头要加反斜杠,可以多级 + */ + @Schema(title = "相对于父级的路由地址", + description = "相对于父级的路由地址。开头要加反斜杠,可以多级") + private String path; + + /** + * 重定向地址;当这个字段不为空表示有重定向,开启重定向后component字段失效 + */ + @Schema(title = "重定向地址", + description = "重定向地址。当这个字段不为空表示有重定向,开启重定向后component字段失效") + private String redirect; + + /** + * 扩展信息;Json格式 + */ + @Schema(title = "扩展信息", + description = "扩展信息。Json格式") + private Object extend; + + /** + * 是否可见;隐藏后可以访问页面,但不在菜单列表显示。1可见,0不可见 + */ + @Schema(title = "是否可见", + description = "是否可见。隐藏后可以访问页面,但不在菜单列表显示。1可见,0不可见") + private Integer isShow; + + /** + * 类型;菜单MENU或目录CATALOG + */ + @Schema(title = "类型", + description = "类型。菜单MENU或目录CATALOG") + private SysMenuTypeEnum type; + + /** + * 图标 + */ + @Schema(title = "图标", + description = "图标") + private String icon; + + /** + * 主题颜色 + */ + @Schema(title = "主题颜色", + description = "主题颜色") + private String color; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/controller/SysRelationshipController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/controller/SysRelationshipController.java index 116e619..cc93346 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/controller/SysRelationshipController.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/controller/SysRelationshipController.java @@ -11,6 +11,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import top.milkbox.common.annotation.CommonLog; 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.param.SysRelationshipAddParam; import top.milkbox.sys.modular.relationship.param.SysRelationshipEditParam; @@ -37,51 +38,51 @@ public class SysRelationshipController { private SysRelationshipService sysRelationshipService; - @PostMapping("/add") - @Operation(summary = "添加", description = "添加一条数据") - @CommonLog(value = "添加", description = "添加一条数据", - module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) - public CommonResult add(@Validated @RequestBody SysRelationshipAddParam addParam) { - sysRelationshipService.add(addParam); - return CommonResult.ok(); - } - - @DeleteMapping("/delete") - @Operation(summary = "批量删除") - @CommonLog(value = "批量删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) - public CommonResult delete( - @Validated - @RequestBody - @Size(min = 1, message = "请至少传递一个删除对象") - List<@Valid SysRelationshipIdParam> paramList - ) { - sysRelationshipService.delete(paramList); - return CommonResult.ok(); - } - - @PutMapping("/edit") - @Operation(summary = "修改", description = "修改一条数据") - @CommonLog(value = "修改", description = "修改一条数据", - module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) - public CommonResult edit(@Validated @RequestBody SysRelationshipEditParam editParam) { - sysRelationshipService.edit(editParam); - return CommonResult.ok(); - } - - @GetMapping("/detail") - @Operation(summary = "详情", description = "查询一条数据的详情") - @CommonLog(value = "详情", description = "查询一条数据的详情", - module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) - public CommonResult detail(@Validated SysRelationshipIdParam idParam) { - return CommonResult.ok(sysRelationshipService.detail(idParam)); - } - - @GetMapping("/page") - @Operation(summary = "分页查询", description = "查询条件分页查询") - @CommonLog(value = "分页查询", description = "查询条件分页查询", - module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) - public CommonResult> page(@Validated SysRelationshipPageParam pageParam) { - return CommonResult.ok(sysRelationshipService.page(pageParam)); - } +// @PostMapping("/add") +// @Operation(summary = "添加", description = "添加一条数据") +// @CommonLog(value = "添加", description = "添加一条数据", +// module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) +// public CommonResult add(@Validated @RequestBody SysRelationshipAddParam addParam) { +// sysRelationshipService.add(addParam); +// return CommonResult.ok(); +// } +// +// @DeleteMapping("/delete") +// @Operation(summary = "批量删除") +// @CommonLog(value = "批量删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) +// public CommonResult delete( +// @RequestBody +// @Size(min = 1, message = "请至少传递一个删除对象") +// @CollectionElementNotNull(message = "集合中的删除对象不能为空") +// List<@Valid SysRelationshipIdParam> paramList +// ) { +// sysRelationshipService.delete(paramList); +// return CommonResult.ok(); +// } +// +// @PutMapping("/edit") +// @Operation(summary = "修改", description = "修改一条数据") +// @CommonLog(value = "修改", description = "修改一条数据", +// module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) +// public CommonResult edit(@Validated @RequestBody SysRelationshipEditParam editParam) { +// sysRelationshipService.edit(editParam); +// return CommonResult.ok(); +// } +// +// @GetMapping("/detail") +// @Operation(summary = "详情", description = "查询一条数据的详情") +// @CommonLog(value = "详情", description = "查询一条数据的详情", +// module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) +// public CommonResult detail(@Validated SysRelationshipIdParam idParam) { +// return CommonResult.ok(sysRelationshipService.detail(idParam)); +// } +// +// @GetMapping("/page") +// @Operation(summary = "分页查询", description = "查询条件分页查询") +// @CommonLog(value = "分页查询", description = "查询条件分页查询", +// module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) +// public CommonResult> page(@Validated SysRelationshipPageParam pageParam) { +// return CommonResult.ok(sysRelationshipService.page(pageParam)); +// } } \ No newline at end of file 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 ad37c61..ab93592 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 @@ -14,7 +14,7 @@ import lombok.AllArgsConstructor; public enum SysRelationshipTypeEnum { /** - * 用户与角色关系(用户属于哪些角色) + * 用户与角色关系(用户属于哪些角色,用户为object_id,角色为target_id) */ SYS_USER_RELATE_SYS_ROLE("用户与角色关系", "SYS_USER_RELATE_SYS_ROLE"), 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 92ad418..51ab0b4 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 @@ -55,13 +55,13 @@ public interface SysRelationshipService extends IService * @return 返回实体 */ SysRelationshipEntity findEntity(Integer entityId); - - /** - * 分页查询 - * - * @param pageParam 分页查询参数 - * @return 返回苞米豆的分页对象,没有数据,则record长度为0 - */ - Page page(SysRelationshipPageParam pageParam); +// +// /** +// * 分页查询 +// * +// * @param pageParam 分页查询参数 +// * @return 返回苞米豆的分页对象,没有数据,则record长度为0 +// */ +// Page page(SysRelationshipPageParam pageParam); } \ 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 9c6e076..705bef6 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 @@ -72,28 +72,28 @@ public class SysRelationshipServiceImpl extends ServiceImpl page(SysRelationshipPageParam pageParam) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if (ObjectUtil.isAllNotEmpty(pageParam.getSortField(), pageParam.getSortType())) { - queryWrapper.orderBy(true, - pageParam.getSortType() == CommonSortTypeEnum.ASC, - StrUtil.toUnderlineCase(pageParam.getSortField())); - } else { - queryWrapper.lambda().orderByAsc(SysRelationshipEntity::getSortCode); - } - queryWrapper.lambda().orderByAsc(SysRelationshipEntity::getId); - - Page entityPage = super.page(pageParam.toBaomidouPage(), queryWrapper); - // 此处进行远程调用或关联查询...... - - Page voPage = CommonUtil.convertPage(entityPage, entity -> { - SysRelationshipVo vo = BeanUtil.toBean(entity, SysRelationshipVo.class); - // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... - - return vo; - }); - return voPage; - } +// @Override +// public Page page(SysRelationshipPageParam pageParam) { +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// if (ObjectUtil.isAllNotEmpty(pageParam.getSortField(), pageParam.getSortType())) { +// queryWrapper.orderBy(true, +// pageParam.getSortType() == CommonSortTypeEnum.ASC, +// StrUtil.toUnderlineCase(pageParam.getSortField())); +// } else { +// queryWrapper.lambda().orderByAsc(SysRelationshipEntity::getSortCode); +// } +// queryWrapper.lambda().orderByAsc(SysRelationshipEntity::getId); +// +// Page entityPage = super.page(pageParam.toBaomidouPage(), queryWrapper); +// // 此处进行远程调用或关联查询...... +// +// Page voPage = CommonUtil.convertPage(entityPage, entity -> { +// SysRelationshipVo vo = BeanUtil.toBean(entity, SysRelationshipVo.class); +// // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... +// +// return vo; +// }); +// return voPage; +// } } \ No newline at end of file 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 abcf719..f26e2ef 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 @@ -11,11 +11,9 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import top.milkbox.common.annotation.CommonLog; 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.role.param.SysRoleAddParam; -import top.milkbox.sys.modular.role.param.SysRoleEditParam; -import top.milkbox.sys.modular.role.param.SysRoleIdParam; -import top.milkbox.sys.modular.role.param.SysRolePageParam; +import top.milkbox.sys.modular.role.param.*; import top.milkbox.sys.modular.role.service.SysRoleService; import top.milkbox.sys.modular.role.vo.SysRoleVo; import top.milkbox.common.pojo.CommonResult; @@ -50,9 +48,9 @@ public class SysRoleController { @Operation(summary = "批量删除") @CommonLog(value = "批量删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) public CommonResult delete( - @Validated @RequestBody @Size(min = 1, message = "请至少传递一个删除对象") + @CollectionElementNotNull(message = "集合中的删除对象不能为空") List<@Valid SysRoleIdParam> paramList ) { sysRoleService.delete(paramList); @@ -84,4 +82,13 @@ public class SysRoleController { return CommonResult.ok(sysRoleService.page(pageParam)); } + @PostMapping("/assignUser") + @Operation(summary = "授权用户", description = "给角色授权用户") + @CommonLog(value = "授权用户", description = "给角色授权用户", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.NOT) + public CommonResult assignUser(@Validated @RequestBody SysRoleAssignUserParam assignUserParam) { + sysRoleService.assignUser(assignUserParam); + return CommonResult.ok(); + } + } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAssignUserParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAssignUserParam.java new file mode 100644 index 0000000..ff806fa --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAssignUserParam.java @@ -0,0 +1,30 @@ +package top.milkbox.sys.modular.role.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import top.milkbox.common.validation.annotation.CollectionElementNotNull; + +import java.util.Set; + +/** + * 角色授权用户
+ * 创建时间: 2024-01-29 下午 3:27 + * + * @author milkbox + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleAssignUserParam { + + @Schema(title = "角色id", description = "角色id") + @NotNull(message = "角色id不能为空") + private Integer roleId; + + @Schema(title = "用户id集合", description = "被授权的用户id集合") + @CollectionElementNotNull(message = "集合中的用户id不能为空") + private Set userIdList; +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java index d30b545..38b6b84 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java @@ -3,13 +3,11 @@ package top.milkbox.sys.modular.role.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import top.milkbox.sys.modular.role.entity.SysRoleEntity; -import top.milkbox.sys.modular.role.param.SysRoleAddParam; -import top.milkbox.sys.modular.role.param.SysRoleEditParam; -import top.milkbox.sys.modular.role.param.SysRoleIdParam; -import top.milkbox.sys.modular.role.param.SysRolePageParam; +import top.milkbox.sys.modular.role.param.*; import top.milkbox.sys.modular.role.vo.SysRoleVo; import java.util.List; +import java.util.Set; /** * 系统_角色表(sys_role)服务层接口 @@ -64,4 +62,10 @@ public interface SysRoleService extends IService { */ Page page(SysRolePageParam pageParam); + /** + * 给角色授权用户 + * + * @param assignUserParam 角色id与用户id集合 + */ + void assignUser(SysRoleAssignUserParam assignUserParam); } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java index f18cdcb..196701e 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java @@ -13,10 +13,7 @@ import top.milkbox.common.enums.CommonSortTypeEnum; import top.milkbox.common.exceprion.CommonServiceException; import top.milkbox.sys.modular.role.entity.SysRoleEntity; import top.milkbox.sys.modular.role.mapper.SysRoleMapper; -import top.milkbox.sys.modular.role.param.SysRoleAddParam; -import top.milkbox.sys.modular.role.param.SysRoleEditParam; -import top.milkbox.sys.modular.role.param.SysRoleIdParam; -import top.milkbox.sys.modular.role.param.SysRolePageParam; +import top.milkbox.sys.modular.role.param.*; import top.milkbox.sys.modular.role.service.SysRoleService; import top.milkbox.sys.modular.role.vo.SysRoleVo; import top.milkbox.common.utils.CommonUtil; @@ -44,6 +41,7 @@ public class SysRoleServiceImpl extends ServiceImpl paramList) { + // TODO 同时需要将关系表的角色信息删除 super.removeByIds(paramList.stream().map(SysRoleIdParam::getId).toList()); } @@ -96,4 +94,9 @@ public class SysRoleServiceImpl extends ServiceImpl delete( - @Validated @RequestBody @Size(min = 1, message = "请至少传递一个删除对象") + @CollectionElementNotNull(message = "集合中的删除对象不能为空") List<@Valid SysUserIdParam> paramList ) { sysUserService.delete(paramList); @@ -118,4 +119,6 @@ public class SysUserController { sysUserService.logout(); return CommonResult.ok("登出成功", null); } + + // TODO 缺少接口,给用户分配角色assignRole } \ No newline at end of file -- Gitee From 77d5f12e37f573b5a6b8f4159659938a91c7ad17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Sun, 4 Feb 2024 17:34:31 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=8A=BD=E5=8F=96=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/bo/EntityColumnExistence.java | 30 ++++++++++++++ .../milkbox/common/service/CommonService.java | 30 ++++++++++++++ .../service/impl/CommonServiceImpl.java | 39 ++++++++++++++++++ .../service/SysRelationshipService.java | 7 ++++ .../impl/SysRelationshipServiceImpl.java | 19 +++++---- .../role/controller/SysRoleController.java | 25 ++++++++--- ...ava => SysRoleAuthorizationUserParam.java} | 4 +- .../modular/role/service/SysRoleService.java | 6 +-- .../role/service/impl/SysRoleServiceImpl.java | 41 ++++++++++++++++++- .../modular/user/service/SysUserService.java | 4 +- .../user/service/impl/SysUserServiceImpl.java | 4 +- 11 files changed, 186 insertions(+), 23 deletions(-) create mode 100644 milkbox-common/src/main/java/top/milkbox/common/bo/EntityColumnExistence.java create mode 100644 milkbox-common/src/main/java/top/milkbox/common/service/CommonService.java create mode 100644 milkbox-common/src/main/java/top/milkbox/common/service/impl/CommonServiceImpl.java rename milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/{SysRoleAssignUserParam.java => SysRoleAuthorizationUserParam.java} (81%) diff --git a/milkbox-common/src/main/java/top/milkbox/common/bo/EntityColumnExistence.java b/milkbox-common/src/main/java/top/milkbox/common/bo/EntityColumnExistence.java new file mode 100644 index 0000000..db70c38 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/bo/EntityColumnExistence.java @@ -0,0 +1,30 @@ +package top.milkbox.common.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 存在性类,对应数据库的同一列中哪些是存在的字段,哪些是不存在的字段
+ * 创建时间: 2024-02-04 下午 1:48 + * + * @param 列的类型 + * @author milkbox + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EntityColumnExistence { + + /** + * 存在的列 + */ + private List existColumnList; + + /** + * 不存在的列 + */ + private List doesNotExistColumnList; +} 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 new file mode 100644 index 0000000..f7d977e --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/service/CommonService.java @@ -0,0 +1,30 @@ +package top.milkbox.common.service; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.baomidou.mybatisplus.extension.service.IService; +import top.milkbox.common.bo.EntityColumnExistence; + +import java.io.Serializable; +import java.util.Collection; + +/** + * 抽取通用服务层接口
+ * 创建时间: 2024-02-04 下午 3:09 + * + * @param 实体类类型 + * @author milkbox + */ +public interface CommonService extends IService { + + /** + * 过滤出在数据库中不存在的实体列
+ * 注意:此方法中包含一次数据库查询 + * + * @param column 被操作的字段的get方法的引用 + * @param entityColumnCollection 原始集合 + * @param 列的类型 + * @return 并返回一个包含存在和不存在实体列信息的对象 + */ + EntityColumnExistence filterDoesNotExistColumn( + SFunction column, Collection entityColumnCollection); +} 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 new file mode 100644 index 0000000..08efb78 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/service/impl/CommonServiceImpl.java @@ -0,0 +1,39 @@ +package top.milkbox.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import top.milkbox.common.bo.EntityColumnExistence; +import top.milkbox.common.service.CommonService; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; + +/** + * 抽取通用服务
+ * 创建时间: 2024-02-04 下午 2:26 + * + * @author milkbox + */ +public class CommonServiceImpl, E> extends ServiceImpl implements CommonService { + + @Override + public EntityColumnExistence filterDoesNotExistColumn( + SFunction column, Collection entityColumnCollection) { + // 创建可见性对象,用于存储存在的和不存在的实体列集合 + EntityColumnExistence entityColumnExistence = new EntityColumnExistence<>(); + // 查询并保存存在的实体列 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(column, entityColumnCollection); + entityColumnExistence.setExistColumnList(super.list(queryWrapper).stream().map(column).toList()); + // 在原实体中移除已经存在的实体 + // 注意:removeAll方法仅支持可变类型的集合,即ArrayList类型 + ArrayList entityColumnList = new ArrayList<>(entityColumnCollection); + entityColumnList.removeAll(entityColumnExistence.getExistColumnList()); + // 将不存在的id集合保存到可见性对象 + entityColumnExistence.setDoesNotExistColumnList(entityColumnList); + return 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 51ab0b4..52d06ce 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 @@ -64,4 +64,11 @@ public interface SysRelationshipService extends IService // */ // Page page(SysRelationshipPageParam pageParam); + /** + * 通过target字段删除 + * + * @param deleteTargetList 要删除的记录的target字段集合 + */ + void deleteByTarget(List deleteTargetList); + } \ 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 705bef6..8ce056b 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 @@ -2,24 +2,19 @@ package top.milkbox.sys.modular.relationship.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import top.milkbox.common.enums.CommonSortTypeEnum; import top.milkbox.common.exceprion.CommonServiceException; import top.milkbox.sys.modular.relationship.entity.SysRelationshipEntity; import top.milkbox.sys.modular.relationship.mapper.SysRelationshipMapper; 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.service.SysRelationshipService; import top.milkbox.sys.modular.relationship.vo.SysRelationshipVo; -import top.milkbox.common.utils.CommonUtil; import java.util.List; @@ -96,4 +91,14 @@ public class SysRelationshipServiceImpl extends ServiceImpl deleteTargetList) { + if (ObjectUtil.isEmpty(deleteTargetList)) { + return; + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysRelationshipEntity::getTargetId, deleteTargetList); + super.remove(queryWrapper); + } +} 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 f26e2ef..d4ee3d1 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 @@ -1,6 +1,8 @@ package top.milkbox.sys.modular.role.controller; import cn.dev33.satoken.annotation.SaCheckLogin; +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; @@ -10,6 +12,7 @@ import lombok.AllArgsConstructor; 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; @@ -82,13 +85,23 @@ public class SysRoleController { return CommonResult.ok(sysRoleService.page(pageParam)); } - @PostMapping("/assignUser") - @Operation(summary = "授权用户", description = "给角色授权用户") - @CommonLog(value = "授权用户", description = "给角色授权用户", + @PostMapping("/reauthorizationUser") + @Operation(summary = "重新授权用户", description = "重新给角色授权用户") + @CommonLog(value = "重新授权用户", description = "重新给角色授权用户", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.NOT) - public CommonResult assignUser(@Validated @RequestBody SysRoleAssignUserParam assignUserParam) { - sysRoleService.assignUser(assignUserParam); - return CommonResult.ok(); + public CommonResult reauthorizationUser( + @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); } + // TODO 还需要创建一个增量授权用户接口 + } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAssignUserParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationUserParam.java similarity index 81% rename from milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAssignUserParam.java rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationUserParam.java index ff806fa..5f164a8 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAssignUserParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAuthorizationUserParam.java @@ -2,6 +2,7 @@ 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; @@ -18,13 +19,14 @@ import java.util.Set; @Data @NoArgsConstructor @AllArgsConstructor -public class SysRoleAssignUserParam { +public class SysRoleAuthorizationUserParam { @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 userIdList; } diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java index 38b6b84..fd49065 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java @@ -2,12 +2,12 @@ package top.milkbox.sys.modular.role.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.role.entity.SysRoleEntity; import top.milkbox.sys.modular.role.param.*; import top.milkbox.sys.modular.role.vo.SysRoleVo; import java.util.List; -import java.util.Set; /** * 系统_角色表(sys_role)服务层接口 @@ -63,9 +63,9 @@ public interface SysRoleService extends IService { Page page(SysRolePageParam pageParam); /** - * 给角色授权用户 + * 重新给角色授权用户 * * @param assignUserParam 角色id与用户id集合 */ - void assignUser(SysRoleAssignUserParam assignUserParam); + EntityColumnExistence reauthorizationUser(SysRoleAuthorizationUserParam assignUserParam); } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java index 196701e..21f4db7 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java @@ -9,15 +9,23 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import top.milkbox.common.bo.EntityColumnExistence; import top.milkbox.common.enums.CommonSortTypeEnum; import top.milkbox.common.exceprion.CommonServiceException; +import top.milkbox.sys.modular.relationship.entity.SysRelationshipEntity; +import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; +import top.milkbox.sys.modular.relationship.service.SysRelationshipService; import top.milkbox.sys.modular.role.entity.SysRoleEntity; import top.milkbox.sys.modular.role.mapper.SysRoleMapper; import top.milkbox.sys.modular.role.param.*; import top.milkbox.sys.modular.role.service.SysRoleService; import top.milkbox.sys.modular.role.vo.SysRoleVo; import top.milkbox.common.utils.CommonUtil; +import top.milkbox.sys.modular.user.entity.SysUserEntity; +import top.milkbox.sys.modular.user.service.SysUserService; +import java.util.Collections; import java.util.List; /** @@ -33,19 +41,26 @@ public class SysRoleServiceImpl extends ServiceImpl paramList) { // TODO 同时需要将关系表的角色信息删除 super.removeByIds(paramList.stream().map(SysRoleIdParam::getId).toList()); } @Override + @Transactional(rollbackFor = Exception.class) public void edit(SysRoleEditParam editParam) { findEntity(editParam.getId()); SysRoleEntity entity = BeanUtil.toBean(editParam, SysRoleEntity.class); @@ -95,8 +110,30 @@ public class SysRoleServiceImpl extends ServiceImpl reauthorizationUser(SysRoleAuthorizationUserParam reauthorizationUserParam) { + // 检查角色是否存在 + findEntity(reauthorizationUserParam.getRoleId()); + // 检查用户列表中的用户是否都存在 + EntityColumnExistence columnExistence = sysUserService.filterDoesNotExistColumn( + SysUserEntity::getId, reauthorizationUserParam.getUserIdList()); + if (ObjectUtil.isEmpty(columnExistence.getExistColumnList())) { + throw new CommonServiceException("被授权的用户全部都不存在"); + } + // 构造实体集合 + 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(); + // 删除此角色原来的授权信息 + sysRelationshipService.deleteByTarget(Collections.singletonList(reauthorizationUserParam.getRoleId())); + // 保存实体集合 + sysRelationshipService.saveBatch(relationshipEntityList); + return columnExistence; } } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/SysUserService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/SysUserService.java index ba8a8f0..d1dcc68 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/SysUserService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/SysUserService.java @@ -1,7 +1,7 @@ package top.milkbox.sys.modular.user.service; 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.user.entity.SysUserEntity; import top.milkbox.sys.modular.user.param.*; import top.milkbox.sys.modular.user.vo.SysUserVo; @@ -14,7 +14,7 @@ import java.util.List; * @author milkbox * @date 2024-1-23 */ -public interface SysUserService extends IService { +public interface SysUserService extends CommonService { /** * 添加 diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/impl/SysUserServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/impl/SysUserServiceImpl.java index d1f084e..dad219b 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/impl/SysUserServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/impl/SysUserServiceImpl.java @@ -8,12 +8,12 @@ import cn.hutool.crypto.digest.BCrypt; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import top.milkbox.common.enums.CommonSortTypeEnum; import top.milkbox.common.exceprion.CommonServiceException; +import top.milkbox.common.service.impl.CommonServiceImpl; import top.milkbox.sys.modular.user.entity.SysUserEntity; import top.milkbox.sys.modular.user.enums.SysUserGenderEnum; import top.milkbox.sys.modular.user.enums.SysUserStatusEnum; @@ -34,7 +34,7 @@ import java.util.List; @Slf4j @Service @AllArgsConstructor -public class SysUserServiceImpl extends ServiceImpl implements SysUserService { +public class SysUserServiceImpl extends CommonServiceImpl implements SysUserService { private SysUserMapper sysUserMapper; -- Gitee From ad9cdb5e1e29e4fffb6af3f1a64d1c9601abe892 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, 27 Feb 2024 17:41:40 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E5=BE=AA=E7=8E=AF=E4=BE=9D=E8=B5=96=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/top/milkbox/Application.java | 1 + .../main/service/impl/LogMainServiceImpl.java | 1 + .../service/SysRelationshipService.java | 9 +++ .../impl/SysRelationshipServiceImpl.java | 38 +++++++++++++ .../role/controller/SysRoleController.java | 34 +++++++++-- .../modular/role/service/SysRoleService.java | 12 ++-- .../role/service/impl/SysRoleServiceImpl.java | 56 +++++++++---------- "\345\244\207\345\277\230\345\275\225.md" | 10 ++++ 8 files changed, 121 insertions(+), 40 deletions(-) create mode 100644 "\345\244\207\345\277\230\345\275\225.md" diff --git a/milkbox-app/src/main/java/top/milkbox/Application.java b/milkbox-app/src/main/java/top/milkbox/Application.java index 37e8e2c..7914742 100644 --- a/milkbox-app/src/main/java/top/milkbox/Application.java +++ b/milkbox-app/src/main/java/top/milkbox/Application.java @@ -38,6 +38,7 @@ public class Application { new Date() + "," + JSONUtil.toJsonStr(TimeZone.getDefault())); log.info("当前服务器公共字段默认注入时间(DateTime.now()):" + DateTime.now()); // log.info("通用配置:\n" + JSONUtil.toJsonPrettyStr(app.getBean("commonProperties"))); + log.info("文档地址:swagger-ui/index.html"); log.info(">>> {}", Application.class.getSimpleName().toUpperCase() + " STARTING SUCCESS 启动成功"); } diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java index bc99591..4719cd1 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java @@ -155,6 +155,7 @@ public class LogMainServiceImpl extends ServiceImpl */ void deleteByTarget(List deleteTargetList); + /** + * 重新给角色授权用户 + * + * @param assignUserParam 角色id与用户id集合 + */ + EntityColumnExistence reauthorizationUser(SysRoleAuthorizationUserParam assignUserParam); + } \ 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 8ce056b..2d6beb4 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 @@ -7,15 +7,23 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; 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.relationship.entity.SysRelationshipEntity; +import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; import top.milkbox.sys.modular.relationship.mapper.SysRelationshipMapper; 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.service.SysRelationshipService; import top.milkbox.sys.modular.relationship.vo.SysRelationshipVo; +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.service.SysUserService; +import java.util.Collections; import java.util.List; /** @@ -31,6 +39,9 @@ public class SysRelationshipServiceImpl extends ServiceImpl reauthorizationUser(SysRoleAuthorizationUserParam reauthorizationUserParam) { + // 检查角色是否存在 + sysRoleService.findEntity(reauthorizationUserParam.getRoleId()); + // 检查用户列表中的用户是否都存在 + EntityColumnExistence columnExistence = sysUserService.filterDoesNotExistColumn( + SysUserEntity::getId, reauthorizationUserParam.getUserIdList()); + if (ObjectUtil.isEmpty(columnExistence.getExistColumnList())) { + throw new CommonServiceException("被授权的用户全部都不存在"); + } + // 构造实体集合 + 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; + } } 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 d4ee3d1..8fa0b43 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 @@ -16,6 +16,7 @@ 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.*; import top.milkbox.sys.modular.role.service.SysRoleService; import top.milkbox.sys.modular.role.vo.SysRoleVo; @@ -36,6 +37,8 @@ import java.util.List; @Tag(name = "角色表控制器", description = "SysRoleController") public class SysRoleController { + private SysRelationshipService sysRelationshipService; + private SysRoleService sysRoleService; @PostMapping("/add") @@ -85,23 +88,42 @@ 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); +// } + + // TODO 还需要创建一个增量授权用户接口 + @PostMapping("/reauthorizationUser") @Operation(summary = "重新授权用户", description = "重新给角色授权用户") @CommonLog(value = "重新授权用户", description = "重新给角色授权用户", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.NOT) public CommonResult reauthorizationUser( @Validated @RequestBody SysRoleAuthorizationUserParam reauthorizationUserParam) { - EntityColumnExistence columnExistence = sysRoleService.reauthorizationUser(reauthorizationUserParam); + + EntityColumnExistence columnExistence = + sysRelationshipService.reauthorizationUser(reauthorizationUserParam); if (ObjectUtil.isEmpty(columnExistence.getDoesNotExistColumnList())) { return CommonResult.ok(); } return CommonResult.ok("用户" + JSONUtil.toJsonStr(columnExistence.getExistColumnList()) + "已授权成功。" - + "用户" + JSONUtil.toJsonStr(columnExistence.getDoesNotExistColumnList()) - + "由于不存在所以授权失败。", - null); + + "用户" + JSONUtil.toJsonStr(columnExistence.getDoesNotExistColumnList()) + + "由于不存在所以授权失败。", null); } - // TODO 还需要创建一个增量授权用户接口 - } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java index fd49065..1f90d01 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java @@ -62,10 +62,10 @@ public interface SysRoleService extends IService { */ Page page(SysRolePageParam pageParam); - /** - * 重新给角色授权用户 - * - * @param assignUserParam 角色id与用户id集合 - */ - EntityColumnExistence reauthorizationUser(SysRoleAuthorizationUserParam assignUserParam); +// /** +// * 重新给角色授权用户 +// * +// * @param assignUserParam 角色id与用户id集合 +// */ +// EntityColumnExistence reauthorizationUser(SysRoleAuthorizationUserParam assignUserParam); } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java index 21f4db7..176b0ef 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java @@ -41,9 +41,9 @@ public class SysRoleServiceImpl extends ServiceImpl reauthorizationUser(SysRoleAuthorizationUserParam reauthorizationUserParam) { - // 检查角色是否存在 - findEntity(reauthorizationUserParam.getRoleId()); - // 检查用户列表中的用户是否都存在 - EntityColumnExistence columnExistence = sysUserService.filterDoesNotExistColumn( - SysUserEntity::getId, reauthorizationUserParam.getUserIdList()); - if (ObjectUtil.isEmpty(columnExistence.getExistColumnList())) { - throw new CommonServiceException("被授权的用户全部都不存在"); - } - // 构造实体集合 - 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(); - // 删除此角色原来的授权信息 - sysRelationshipService.deleteByTarget(Collections.singletonList(reauthorizationUserParam.getRoleId())); - // 保存实体集合 - sysRelationshipService.saveBatch(relationshipEntityList); - return columnExistence; - } +// @Override +// @Transactional(rollbackFor = Exception.class) +// public EntityColumnExistence reauthorizationUser(SysRoleAuthorizationUserParam reauthorizationUserParam) { +// // 检查角色是否存在 +// findEntity(reauthorizationUserParam.getRoleId()); +// // 检查用户列表中的用户是否都存在 +// EntityColumnExistence columnExistence = sysUserService.filterDoesNotExistColumn( +// SysUserEntity::getId, reauthorizationUserParam.getUserIdList()); +// if (ObjectUtil.isEmpty(columnExistence.getExistColumnList())) { +// throw new CommonServiceException("被授权的用户全部都不存在"); +// } +// // 构造实体集合 +// 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(); +// // 删除此角色原来的授权信息 +// sysRelationshipService.deleteByTarget(Collections.singletonList(reauthorizationUserParam.getRoleId())); +// // 保存实体集合 +// sysRelationshipService.saveBatch(relationshipEntityList); +// return columnExistence; +// } } \ No newline at end of file diff --git "a/\345\244\207\345\277\230\345\275\225.md" "b/\345\244\207\345\277\230\345\275\225.md" new file mode 100644 index 0000000..f917149 --- /dev/null +++ "b/\345\244\207\345\277\230\345\275\225.md" @@ -0,0 +1,10 @@ +# 进度备忘 + +- [x] 现在需要考虑SysRoleService和SysUserService之间循环依赖的函数放到SysRelationshipService中,在SysRoleService和SysUserService的controller调用SysRelationshipService。 +- [ ] 在子线程保存日志的过程中,有可能request对象被收回,导致报错。考虑将所有request对象的操作放到子线程外面运行,将所有对request的处理操作完成后再开启日志子线程。通过传参的方式将对request处理的结果传入日志子线程。 +- [ ] 考虑按钮权限功能。 +- [ ] 考虑进行单元测试,两种方案。1:在各个子模块中编写测试用例,但是需要解决模块依赖启动类的问题。2:专门编写一个测试子模块,将其他模块的测试用例写到这个测试子模块中。 +- [ ] 考虑使用一个注解对密级字段进行权限控制。将注解放到实体类的指定字段上,就可以控制整条数据的权限。 +- [ ] 需要接口调用频率的控制。 + + -- Gitee From 147789833e102d55f3bf92f73592ce2a49f0da70 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, 27 Feb 2024 18:06:42 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=B0=86=E6=97=A5=E5=BF=97=E7=9A=84?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=93=8D=E4=BD=9C=E7=A7=BB=E5=8A=A8=E5=88=B0?= =?UTF-8?q?=E4=B8=BB=E8=BF=9B=E7=A8=8B=EF=BC=8C=E8=A7=A3=E5=86=B3=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=8A=A5=E9=94=99The=20request=20object=20has=20been?= =?UTF-8?q?=20recycled=20and=20is=20no=20longer=20associated=20with=20this?= =?UTF-8?q?=20facade?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modular/main/service/LogMainService.java | 4 +- .../main/service/impl/LogMainServiceImpl.java | 102 +++++++++--------- 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java index d963653..72f47ed 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java @@ -66,7 +66,7 @@ public interface LogMainService extends IService { Page page(LogMainPageParam pageParam); /** - * 异步保存日志 + * 异步保存日志,保存正常日志 * * @param joinPoint 切点 * @param result 方法的返回值 @@ -74,7 +74,7 @@ public interface LogMainService extends IService { void saveNormalLogAsync(ProceedingJoinPoint joinPoint, Object result); /** - * 异步保存报错日志 + * 异步保存报错日志,保存异常日志 * * @param joinPoint 切点 * @param throwable 报错信息 diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java index 4719cd1..e66ef9a 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java @@ -120,25 +120,21 @@ public class LogMainServiceImpl extends ServiceImpl { - LogMainAddParam addParam = - createLogMainAddParam(servletRequestAttributes, joinPoint, result, null, loginIdAsInt); - add(addParam); + LogMainAddParam finaAddParam = + processLogMainAddParam(addParam, joinPoint, result, null); + add(finaAddParam); // 保存到数据库 }); } @Override public void saveThrowableLogAsync(ProceedingJoinPoint joinPoint, Throwable throwable) { - ServletRequestAttributes servletRequestAttributes - = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - Integer loginIdAsInt = getLoginId(); + LogMainAddParam addParam = createLogMainAddParam(); logExecute.execute(() -> { - LogMainAddParam addParam = - createLogMainAddParam(servletRequestAttributes, joinPoint, null, throwable, loginIdAsInt); - add(addParam); + LogMainAddParam finaAddParam = + processLogMainAddParam(addParam, joinPoint, null, throwable); + add(finaAddParam); // 保存到数据库 }); } @@ -154,25 +150,59 @@ public class LogMainServiceImpl extends ServiceImpl Date: Tue, 2 Apr 2024 15:00:04 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=A2=9E=E9=87=8F=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../service/SysRelationshipService.java | 9 +++- .../impl/SysRelationshipServiceImpl.java | 51 ++++++++++++++++++- .../role/controller/SysRoleController.java | 18 +++++-- "\345\244\207\345\277\230\345\275\225.md" | 6 ++- 5 files changed, 76 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index d769462..3878d2c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ +.run ### IntelliJ IDEA ### .idea 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 711ab99..6b823f1 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 @@ -78,6 +78,13 @@ public interface SysRelationshipService extends IService * * @param assignUserParam 角色id与用户id集合 */ - EntityColumnExistence reauthorizationUser(SysRoleAuthorizationUserParam assignUserParam); + EntityColumnExistence reauthorizationUsers(SysRoleAuthorizationUserParam assignUserParam); + + /** + * 给角色授权新用户,新用户中不具有此角色的将被授权,已经拥有此角色的不变 + * + * @param assignUserParam 角色id与用户id集合 + */ + EntityColumnExistence incrementAuthorizationUsers(SysRoleAuthorizationUserParam assignUserParam); } \ 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 2d6beb4..abfefb3 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 @@ -3,6 +3,7 @@ package top.milkbox.sys.modular.relationship.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -18,11 +19,13 @@ import top.milkbox.sys.modular.relationship.param.SysRelationshipEditParam; 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.SysRoleAuthorizationUserParam; import top.milkbox.sys.modular.role.service.SysRoleService; import top.milkbox.sys.modular.user.entity.SysUserEntity; import top.milkbox.sys.modular.user.service.SysUserService; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -35,7 +38,9 @@ import java.util.List; @Slf4j @Service @AllArgsConstructor -public class SysRelationshipServiceImpl extends ServiceImpl implements SysRelationshipService { +public class SysRelationshipServiceImpl + extends ServiceImpl + implements SysRelationshipService { private SysRelationshipMapper sysRelationshipMapper; @@ -115,7 +120,7 @@ public class SysRelationshipServiceImpl extends ServiceImpl reauthorizationUser(SysRoleAuthorizationUserParam reauthorizationUserParam) { + public EntityColumnExistence reauthorizationUsers(SysRoleAuthorizationUserParam reauthorizationUserParam) { // 检查角色是否存在 sysRoleService.findEntity(reauthorizationUserParam.getRoleId()); // 检查用户列表中的用户是否都存在 @@ -139,4 +144,46 @@ public class SysRelationshipServiceImpl extends ServiceImpl incrementAuthorizationUsers( + SysRoleAuthorizationUserParam incrementAuthorizationUserParam) { + // 检查角色是否存在 + sysRoleService.findEntity(incrementAuthorizationUserParam.getRoleId()); + // 检查用户列表中的用户是否都存在 + EntityColumnExistence columnExistence = sysUserService.filterDoesNotExistColumn( + SysUserEntity::getId, incrementAuthorizationUserParam.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("无新增授权用户"); + } + + // 将新的用户与角色关系保存 + 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; + } } 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 8fa0b43..c967a78 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 @@ -106,17 +106,16 @@ public class SysRoleController { // null); // } - // TODO 还需要创建一个增量授权用户接口 - @PostMapping("/reauthorizationUser") + @PostMapping("/reauthorizationUsers") @Operation(summary = "重新授权用户", description = "重新给角色授权用户") @CommonLog(value = "重新授权用户", description = "重新给角色授权用户", - module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.NOT) - public CommonResult reauthorizationUser( + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) + public CommonResult reauthorizationUsers( @Validated @RequestBody SysRoleAuthorizationUserParam reauthorizationUserParam) { EntityColumnExistence columnExistence = - sysRelationshipService.reauthorizationUser(reauthorizationUserParam); + sysRelationshipService.reauthorizationUsers(reauthorizationUserParam); if (ObjectUtil.isEmpty(columnExistence.getDoesNotExistColumnList())) { return CommonResult.ok(); } @@ -126,4 +125,13 @@ 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(); + } } \ No newline at end of file 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 f917149..9598fde 100644 --- "a/\345\244\207\345\277\230\345\275\225.md" +++ "b/\345\244\207\345\277\230\345\275\225.md" @@ -1,10 +1,14 @@ # 进度备忘 - [x] 现在需要考虑SysRoleService和SysUserService之间循环依赖的函数放到SysRelationshipService中,在SysRoleService和SysUserService的controller调用SysRelationshipService。 -- [ ] 在子线程保存日志的过程中,有可能request对象被收回,导致报错。考虑将所有request对象的操作放到子线程外面运行,将所有对request的处理操作完成后再开启日志子线程。通过传参的方式将对request处理的结果传入日志子线程。 +- [x] 在子线程保存日志的过程中,有可能request对象被收回,导致报错。考虑将所有request对象的操作放到子线程外面运行,将所有对request的处理操作完成后再开启日志子线程。通过传参的方式将对request处理的结果传入日志子线程。 - [ ] 考虑按钮权限功能。 - [ ] 考虑进行单元测试,两种方案。1:在各个子模块中编写测试用例,但是需要解决模块依赖启动类的问题。2:专门编写一个测试子模块,将其他模块的测试用例写到这个测试子模块中。 - [ ] 考虑使用一个注解对密级字段进行权限控制。将注解放到实体类的指定字段上,就可以控制整条数据的权限。 - [ ] 需要接口调用频率的控制。 +# 正在进行 + +* 菜单表基础功能 + -- Gitee