From 468b8859e0f05caff6e36db4d6eca43d76a4d09e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Thu, 31 Oct 2024 18:11:12 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/config/SaTokenConfiguration.java | 2 +- .../core/handler/GlobalControllerAdvice.java | 10 +- .../milkbox/sys/core/StpInterfaceImpl.java | 51 ++++++++ .../menu/controller/SysMenuController.java | 5 +- .../menu/service/impl/SysMenuServiceImpl.java | 28 +---- .../controller/SysPermissionController.java | 88 +++++++++++++ .../entity/SysPermissionEntity.java | 61 +++++++++ .../mapper/SysPermissionMapper.java | 16 +++ .../mapper/mapping/SysPermissionMapper.xml | 6 + .../param/SysPermissionAddParam.java | 44 +++++++ .../param/SysPermissionEditParam.java | 53 ++++++++ .../param/SysPermissionIdParam.java | 30 +++++ .../param/SysPermissionPageParam.java | 45 +++++++ .../service/SysPermissionService.java | 74 +++++++++++ .../impl/SysPermissionServiceImpl.java | 116 ++++++++++++++++++ .../permission/vo/SysPermissionVo.java | 53 ++++++++ .../enums/SysRelationshipTypeEnum.java | 12 +- .../service/SysRelationshipService.java | 20 +++ .../impl/SysRelationshipServiceImpl.java | 61 ++++++++- .../user/service/impl/SysUserServiceImpl.java | 17 ++- "\345\244\207\345\277\230\345\275\225.md" | 7 ++ 21 files changed, 760 insertions(+), 39 deletions(-) create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/core/StpInterfaceImpl.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/controller/SysPermissionController.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/entity/SysPermissionEntity.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/mapper/SysPermissionMapper.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/mapper/mapping/SysPermissionMapper.xml create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionAddParam.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionEditParam.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionIdParam.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionPageParam.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/SysPermissionService.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/vo/SysPermissionVo.java diff --git a/milkbox-app/src/main/java/top/milkbox/core/config/SaTokenConfiguration.java b/milkbox-app/src/main/java/top/milkbox/core/config/SaTokenConfiguration.java index ae1b2d3..c88a506 100644 --- a/milkbox-app/src/main/java/top/milkbox/core/config/SaTokenConfiguration.java +++ b/milkbox-app/src/main/java/top/milkbox/core/config/SaTokenConfiguration.java @@ -53,7 +53,7 @@ public class SaTokenConfiguration implements WebMvcConfigurer { // ---------- 设置跨域响应头 ---------- /* 对于跨域请求,我们分两种情况 - 1. 不使用浏览器的自动管理cookie功。也就是说在前后端分离的项目中(小程序,h5,手机应用等)禁用了cookie功能。 + 1. 不使用浏览器的自动管理cookie功能。也就是说在前后端分离的项目中(小程序,h5,手机应用等)禁用了cookie功能。 sa-token的登录令牌(token)需要在前端手动控制存储 浏览器无需管理cookie,所以权限比较松,配置参考如下: // 允许所有域 diff --git a/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java b/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java index 1ad6efd..69e8c51 100644 --- a/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java +++ b/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java @@ -1,6 +1,7 @@ package top.milkbox.core.handler; import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.exception.NotPermissionException; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.http.converter.HttpMessageNotReadableException; @@ -72,6 +73,13 @@ public class GlobalControllerAdvice { notLoginException.getMessage(), notLoginException); } + // 无sa-token权限异常 + else if (exception instanceof NotPermissionException) { + return CommonResult.create() + .withCode(CommonStatusCodeEnum.ERROR403.getCode()) + .withMessage(exception.getMessage()); + } + // 后端校验不通过异常 else if (exception instanceof MethodArgumentNotValidException errorResponse) { StringBuilder errorMessage = new StringBuilder(); @@ -109,6 +117,6 @@ public class GlobalControllerAdvice { log.error("其他未处理异常:{}", exception.getMessage(), exception); // exception.printStackTrace(); // 系统控制台堆栈,可能不会存入日志 return new CommonResult<>(CommonStatusCodeEnum.ERROR500.getCode(), - CommonStatusCodeEnum.ERROR500.getMessage(), exception.getStackTrace()); + exception.getMessage(), exception.getStackTrace()); } } diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/core/StpInterfaceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/core/StpInterfaceImpl.java new file mode 100644 index 0000000..498f108 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/core/StpInterfaceImpl.java @@ -0,0 +1,51 @@ +package top.milkbox.sys.core; + +import cn.dev33.satoken.session.SaSession; +import cn.dev33.satoken.stp.StpInterface; +import cn.dev33.satoken.stp.StpUtil; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; +import top.milkbox.sys.modular.permission.entity.SysPermissionEntity; +import top.milkbox.sys.modular.permission.service.SysPermissionService; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 自定义权限加载接口实现类 + */ +@AllArgsConstructor +@Component // 保证此类被 SpringBoot 扫描,完成 Sa-Token 的自定义权限验证扩展 +public class StpInterfaceImpl implements StpInterface { + + private SysPermissionService sysPermissionService; + + /** + * 返回一个账号所拥有的权限码集合 + */ + @Override + public List getPermissionList(Object loginUserId, String loginType) { + SaSession accountSession = StpUtil.getSessionByLoginId(loginUserId); + // 获取不到则返回空集合 + if (accountSession == null) { + return new ArrayList<>(); + } + // 获取权限集合,并转为权限value字段集合。第二个参数表示默认值 + List permissionList = accountSession.get("permission", new ArrayList<>()); + return permissionList.stream().map(SysPermissionEntity::getValue).collect(Collectors.toList()); + } + + /** + * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验) + */ + @Override + public List getRoleList(Object loginId, String loginType) { + // 本 list 仅做模拟,实际项目中要根据具体业务逻辑来查询角色 + List list = new ArrayList<>(); + list.add("admin"); + list.add("super-admin"); + return list; + } + +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/controller/SysMenuController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/controller/SysMenuController.java index c4fd28a..f258220 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/controller/SysMenuController.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/controller/SysMenuController.java @@ -1,12 +1,11 @@ package top.milkbox.sys.modular.menu.controller; import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.lang.tree.Tree; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import org.springframework.validation.annotation.Validated; @@ -18,7 +17,6 @@ import top.milkbox.sys.core.config.SysConfiguration; 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.pojo.CommonResult; @@ -117,6 +115,7 @@ public class SysMenuController { @Operation(summary = "获取所有菜单森林", description = "获取所有菜单森林") @CommonLog(value = "获取所有菜单森林", description = "获取所有菜单森林", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + @SaCheckPermission("/sysMenu/forestAll") public CommonResult>> forestAll() { return CommonResult.ok(sysMenuService.forestAll()); } diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java index 9ea0cbe..d86cf4f 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java @@ -195,32 +195,8 @@ public class SysMenuServiceImpl extends CommonServiceImpl> forest() { - int loginUserId = StpUtil.getLoginIdAsInt(); - - // 查询用户所属的角色拥有权限的菜单id集合 - List roleIdList = sysRelationshipService.findTargetIdListByObjectId( - loginUserId, SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE); - List roleMenuList = new ArrayList<>(); - if (ObjectUtil.isNotEmpty(roleIdList)) { - roleMenuList = sysRelationshipService.list( - new LambdaUpdateWrapper() - .in(SysRelationshipEntity::getObjectId, roleIdList) - .eq(SysRelationshipEntity::getCategory, SysRelationshipTypeEnum.SYS_ROLE_RELATE_SYS_MENU) - ).stream().map(SysRelationshipEntity::getTargetId).toList(); - } - - // 查询用户独有权限的菜单id集合 - List userMenuIdList = sysRelationshipService.findTargetIdListByObjectId( - loginUserId, SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_MENU); - - // 合并两个集合 - List menuIdList = new ArrayList<>(); - menuIdList.addAll(roleMenuList); - menuIdList.addAll(userMenuIdList); - if (ObjectUtil.isEmpty(menuIdList)) { - // 如果没有数据,则返回空 - return new ArrayList<>(); - } + // 获取指定用户关联的菜单id集合,以及其所属角色关联的菜单id集合 + List menuIdList = sysRelationshipService.findAllMenuIdListByUserId(StpUtil.getLoginIdAsInt()); // 根据id集合查询菜单表 List entityList = diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/controller/SysPermissionController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/controller/SysPermissionController.java new file mode 100644 index 0000000..32a8e6f --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/controller/SysPermissionController.java @@ -0,0 +1,88 @@ +package top.milkbox.sys.modular.permission.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Size; +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.enums.LogTypeEnum; +import top.milkbox.common.validation.annotation.CollectionElementNotNull; +import top.milkbox.sys.core.config.SysConfiguration; +import top.milkbox.sys.modular.permission.param.SysPermissionAddParam; +import top.milkbox.sys.modular.permission.param.SysPermissionEditParam; +import top.milkbox.sys.modular.permission.param.SysPermissionIdParam; +import top.milkbox.sys.modular.permission.param.SysPermissionPageParam; +import top.milkbox.sys.modular.permission.service.SysPermissionService; +import top.milkbox.sys.modular.permission.vo.SysPermissionVo; +import top.milkbox.common.pojo.CommonResult; + +import java.util.List; + +/** + * 权限表(sys_permission)控制器 + * + * @author milkbox + * @date 2024-10-31 + */ +@SaCheckLogin +@RestController +@AllArgsConstructor +@RequestMapping("/sysPermission") +@Tag(name = "权限表控制器", description = "SysPermissionController") +public class SysPermissionController { + + private SysPermissionService sysPermissionService; + + @PostMapping("/add") + @Operation(summary = "添加", description = "添加一条数据") + @CommonLog(value = "添加", description = "添加一条数据", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) + public CommonResult add(@Validated @RequestBody SysPermissionAddParam addParam) { + sysPermissionService.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 SysPermissionIdParam> paramList + ) { + sysPermissionService.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 SysPermissionEditParam editParam) { + sysPermissionService.edit(editParam); + return CommonResult.ok(); + } + + @GetMapping("/detail") + @Operation(summary = "详情", description = "查询一条数据的详情") + @CommonLog(value = "详情", description = "查询一条数据的详情", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + public CommonResult detail(@Validated SysPermissionIdParam idParam) { + return CommonResult.ok(sysPermissionService.detail(idParam)); + } + + @GetMapping("/page") + @Operation(summary = "分页查询", description = "查询条件分页查询") + @CommonLog(value = "分页查询", description = "查询条件分页查询", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + public CommonResult> page(@Validated SysPermissionPageParam pageParam) { + return CommonResult.ok(sysPermissionService.page(pageParam)); + } + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/entity/SysPermissionEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/entity/SysPermissionEntity.java new file mode 100644 index 0000000..fc82c14 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/entity/SysPermissionEntity.java @@ -0,0 +1,61 @@ +package top.milkbox.sys.modular.permission.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; + +/** + * 系统_权限表 + * + * @author milkbox + * @date 2024-10-31 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "sys_permission") +@Schema(description = "SysPermissionEntity 系统_权限表。") +public class SysPermissionEntity extends CommonEntity implements Serializable { + + /** + * 主键 + */ + @TableId + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 权限名 + */ + @Schema(title = "权限名", + description = "权限名") + private String name; + + /** + * 权限值;例如接口名称、权限代码等 + */ + @Schema(title = "权限值", + description = "权限值。例如接口名称、权限代码等") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String value; + + /** + * 权限类型;可以按照api权限或者其他类型的权限进行分类。暂时没想好 + */ + @Schema(title = "权限类型", + description = "权限类型。可以按照api权限或者其他类型的权限进行分类。暂时没想好") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String category; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/mapper/SysPermissionMapper.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/mapper/SysPermissionMapper.java new file mode 100644 index 0000000..2d32650 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/mapper/SysPermissionMapper.java @@ -0,0 +1,16 @@ +package top.milkbox.sys.modular.permission.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import top.milkbox.sys.modular.permission.entity.SysPermissionEntity; + +/** + * 系统_权限表(sys_permission)表数据库访问层 + * + * @author milkbox + * @date 2024-10-31 + */ +@Mapper +public interface SysPermissionMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/mapper/mapping/SysPermissionMapper.xml b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/mapper/mapping/SysPermissionMapper.xml new file mode 100644 index 0000000..9bbed1e --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/mapper/mapping/SysPermissionMapper.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/permission/param/SysPermissionAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionAddParam.java new file mode 100644 index 0000000..cc0affe --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionAddParam.java @@ -0,0 +1,44 @@ +package top.milkbox.sys.modular.permission.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; + +/** + * 添加参数对象 + * + * @author milkbox + * @date 2024-10-31 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysPermissionAddParam implements Serializable { + + /** + * 权限名 + */ + @Schema(title = "权限名", + description = "权限名") + @NotBlank(message = "权限名不能为空") + private String name; + + /** + * 权限值;例如接口名称、权限代码等 + */ + @Schema(title = "权限值", + description = "权限值。例如接口名称、权限代码等") + private String value; + + /** + * 权限类型;可以按照api权限或者其他类型的权限进行分类。暂时没想好 + */ + @Schema(title = "权限类型", + description = "权限类型。可以按照api权限或者其他类型的权限进行分类。暂时没想好") + private String category; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionEditParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionEditParam.java new file mode 100644 index 0000000..c9fa7cb --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionEditParam.java @@ -0,0 +1,53 @@ +package top.milkbox.sys.modular.permission.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; + +/** + * 编辑参数对象 + * + * @author milkbox + * @date 2024-10-31 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysPermissionEditParam implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + @NotNull(message = "主键不能为空") + private Integer id; + + /** + * 权限名 + */ + @Schema(title = "权限名", + description = "权限名") + @NotBlank(message = "权限名不能为空") + private String name; + + /** + * 权限值;例如接口名称、权限代码等 + */ + @Schema(title = "权限值", + description = "权限值。例如接口名称、权限代码等") + private String value; + + /** + * 权限类型;可以按照api权限或者其他类型的权限进行分类。暂时没想好 + */ + @Schema(title = "权限类型", + description = "权限类型。可以按照api权限或者其他类型的权限进行分类。暂时没想好") + private String category; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionIdParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionIdParam.java new file mode 100644 index 0000000..b920fda --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionIdParam.java @@ -0,0 +1,30 @@ +package top.milkbox.sys.modular.permission.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-10-31 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysPermissionIdParam 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/permission/param/SysPermissionPageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionPageParam.java new file mode 100644 index 0000000..9cce2cb --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionPageParam.java @@ -0,0 +1,45 @@ +package top.milkbox.sys.modular.permission.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 java.io.Serializable; + +/** + * 分页参数对象 + * + * @author milkbox + * @date 2024-10-31 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysPermissionPageParam extends CommonPageParam implements Serializable { + + /** + * 权限名 + */ + @Schema(title = "权限名", + description = "权限名") + private String name; + + /** + * 权限值;例如接口名称、权限代码等 + */ + @Schema(title = "权限值", + description = "权限值。例如接口名称、权限代码等") + private String value; + + /** + * 权限类型;可以按照api权限或者其他类型的权限进行分类。暂时没想好 + */ + @Schema(title = "权限类型", + description = "权限类型。可以按照api权限或者其他类型的权限进行分类。暂时没想好") + private String category; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/SysPermissionService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/SysPermissionService.java new file mode 100644 index 0000000..586c24f --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/SysPermissionService.java @@ -0,0 +1,74 @@ +package top.milkbox.sys.modular.permission.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import top.milkbox.sys.modular.permission.entity.SysPermissionEntity; +import top.milkbox.sys.modular.permission.param.SysPermissionAddParam; +import top.milkbox.sys.modular.permission.param.SysPermissionEditParam; +import top.milkbox.sys.modular.permission.param.SysPermissionIdParam; +import top.milkbox.sys.modular.permission.param.SysPermissionPageParam; +import top.milkbox.sys.modular.permission.vo.SysPermissionVo; + +import java.util.List; + +/** + * 系统_权限表(sys_permission)服务层接口 + * + * @author milkbox + * @date 2024-10-31 + */ +public interface SysPermissionService extends IService { + + /** + * 添加 + * + * @param addParam 添加参数 + */ + void add(SysPermissionAddParam addParam); + + /** + * 删除 + * + * @param paramList 删除id对象集合 + */ + void delete(List paramList); + + /** + * 通过id编辑 + * + * @param editParam 编辑参数 + */ + void edit(SysPermissionEditParam editParam); + + /** + * 通过id查询详情 + * + * @param idParam id参数 + * @return 返回查询的详情,如果没有则返回空 + */ + SysPermissionVo detail(SysPermissionIdParam idParam); + + /** + * 查询实体,即简单查询,包含存在性校验,不存在报业务异常 + * + * @param entityId 实体id + * @return 返回实体 + */ + SysPermissionEntity findEntity(Integer entityId); + + /** + * 分页查询 + * + * @param pageParam 分页查询参数 + * @return 返回苞米豆的分页对象,没有数据,则record长度为0 + */ + Page page(SysPermissionPageParam pageParam); + + /** + * 根据当前登录的用户查询拥有的权限列表,包括用户所在的角色拥有的权限 + * + * @return 返回权限列表 + */ + List listByLoginUser(); + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java new file mode 100644 index 0000000..077bd97 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java @@ -0,0 +1,116 @@ +package top.milkbox.sys.modular.permission.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +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.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +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.permission.entity.SysPermissionEntity; +import top.milkbox.sys.modular.permission.mapper.SysPermissionMapper; +import top.milkbox.sys.modular.permission.param.SysPermissionAddParam; +import top.milkbox.sys.modular.permission.param.SysPermissionEditParam; +import top.milkbox.sys.modular.permission.param.SysPermissionIdParam; +import top.milkbox.sys.modular.permission.param.SysPermissionPageParam; +import top.milkbox.sys.modular.permission.service.SysPermissionService; +import top.milkbox.sys.modular.permission.vo.SysPermissionVo; +import top.milkbox.common.utils.CommonUtil; +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 java.util.ArrayList; +import java.util.List; + +/** + * 系统_权限表(sys_permission)服务层实现类 + * + * @author milkbox + * @date 2024-10-31 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysPermissionServiceImpl extends ServiceImpl implements SysPermissionService { + + private SysPermissionMapper sysPermissionMapper; + private SysRelationshipService sysRelationshipService; + + @Override + public void add(SysPermissionAddParam addParam) { + SysPermissionEntity entity = BeanUtil.toBean(addParam, SysPermissionEntity.class); + super.save(entity); + } + + @Override + public void delete(List paramList) { + super.removeByIds(paramList.stream().map(SysPermissionIdParam::getId).toList()); + } + + @Override + public void edit(SysPermissionEditParam editParam) { + findEntity(editParam.getId()); + SysPermissionEntity entity = BeanUtil.toBean(editParam, SysPermissionEntity.class); + super.updateById(entity); + } + + @Override + public SysPermissionVo detail(SysPermissionIdParam idParam) { + SysPermissionEntity entity = findEntity(idParam.getId()); + SysPermissionVo vo = BeanUtil.toBean(entity, SysPermissionVo.class); + // 此处进行数据翻译操作,,根据不同的业务逻辑将entity对象转为vo对象...... + + return vo; + } + + @Override + public SysPermissionEntity findEntity(Integer entityId) { + SysPermissionEntity entity = super.getById(entityId); + if (ObjectUtil.isEmpty(entity)) { + throw new CommonServiceException("实体未找到({})", entityId); + } + return entity; + } + + @Override + public Page page(SysPermissionPageParam 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(SysPermissionEntity::getSortCode); + } + queryWrapper.lambda().orderByAsc(SysPermissionEntity::getId); + + Page entityPage = super.page(pageParam.toBaomidouPage(), queryWrapper); + // 此处进行远程调用或关联查询...... + + Page voPage = CommonUtil.convertPage(entityPage, entity -> { + SysPermissionVo vo = BeanUtil.toBean(entity, SysPermissionVo.class); + // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... + + return vo; + }); + return voPage; + } + + @Override + public List listByLoginUser() { + // 获取指定用户关联的权限id集合,以及其所属角色关联的权限id集合 + List permissionIdList = sysRelationshipService.findAllPermissionIdListByUserId(StpUtil.getLoginIdAsInt()); + // 根据id集合查询权限表 + return super.list(new LambdaQueryWrapper().in(SysPermissionEntity::getId, permissionIdList)); + } + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/vo/SysPermissionVo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/vo/SysPermissionVo.java new file mode 100644 index 0000000..1d3ca95 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/vo/SysPermissionVo.java @@ -0,0 +1,53 @@ +package top.milkbox.sys.modular.permission.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 java.io.Serializable; + +/** + * 系统_权限表默认vo + * + * @author milkbox + * @date 2024-10-31 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(description = "SysPermissionEntity 系统_权限表。") +public class SysPermissionVo extends CommonVo implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 权限名 + */ + @Schema(title = "权限名", + description = "权限名") + private String name; + + /** + * 权限值;例如接口名称、权限代码等 + */ + @Schema(title = "权限值", + description = "权限值。例如接口名称、权限代码等") + private String value; + + /** + * 权限类型;可以按照api权限或者其他类型的权限进行分类。暂时没想好 + */ + @Schema(title = "权限类型", + description = "权限类型。可以按照api权限或者其他类型的权限进行分类。暂时没想好") + private String category; + +} \ 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 1e1d727..7221ffb 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 @@ -34,7 +34,17 @@ public enum SysRelationshipTypeEnum { /** * 角色与菜单关系(角色拥有那些菜单,角色为object_id,菜单为target_id) */ - SYS_ROLE_RELATE_SYS_MENU("角色与菜单关系", "SYS_ROLE_RELATE_SYS_MENU"); + SYS_ROLE_RELATE_SYS_MENU("角色与菜单关系", "SYS_ROLE_RELATE_SYS_MENU"), + + /** + * 用户与权限关系(用户拥有哪些权限,用户为object_id,权限为target_id) + */ + SYS_USER_RELATE_SYS_PERMISSION("用户与权限关系", "SYS_USER_RELATE_SYS_PERMISSION"), + + /** + * 角色与权限关系(角色拥有哪些权限,角色为object_id,权限为target_id) + */ + SYS_ROLE_RELATE_SYS_PERMISSION("角色与权限关系", "SYS_ROLE_RELATE_SYS_PERMISSION"); private final String label; 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 e23d983..dc07fb4 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 @@ -147,4 +147,24 @@ public interface SysRelationshipService extends IService * @return 返回的对象包含两个集合,一个为授权成功的id集合,另一个为不存在的id集合 */ EntityColumnExistence userIdAuthRoleIdList(SysUserAuthorizationRoleParam param); + + /** + * 查询指定用户关联的所有菜单id集合
+ * 菜单id集合包含两部分:1 用户直接关联的菜单id集合,2 用户所属的所有角色关联的菜单id集合
+ * 最终将这两部分合去重后返回
+ * + * @param userId 用户id + * @return 返回菜单id集合,若无任何菜单,则返回空集合 + */ + List findAllMenuIdListByUserId(Integer userId); + + /** + * 查询指定用户关联的所有权限id集合
+ * 权限id集合包含两部分:1 用户直接关联的权限id集合,2 用户所属的所有角色关联的权限id集合
+ * 最终将这两部分合去重后返回
+ * + * @param userId 用户id + * @return 返回权限id集合,若无任何权限,则返回空集合 + */ + List findAllPermissionIdListByUserId(Integer userId); } \ 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 fc4cc54..e520c49 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,7 +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.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,9 +32,7 @@ import top.milkbox.sys.modular.user.param.SysUserAuthorizationMenuParam; import top.milkbox.sys.modular.user.param.SysUserAuthorizationRoleParam; import top.milkbox.sys.modular.user.service.SysUserService; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * 系统_关系表_用户角色组织菜单权限综合关系表(sys_relationship)服务层实现类 @@ -316,5 +314,60 @@ public class SysRelationshipServiceImpl return objectAuthTarget(objectAuthTargetBo, columnExistence); } + @Override + public List findAllMenuIdListByUserId(Integer userId) { + // 查询用户所属的角色拥有权限的菜单id集合 + List roleIdList = findTargetIdListByObjectId(userId, SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE); + List roleMenuList = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(roleIdList)) { + roleMenuList = list(new LambdaUpdateWrapper() + .in(SysRelationshipEntity::getObjectId, roleIdList) + .eq(SysRelationshipEntity::getCategory, SysRelationshipTypeEnum.SYS_ROLE_RELATE_SYS_MENU) + ).stream().map(SysRelationshipEntity::getTargetId).toList(); + } + + // 查询用户独有权限的菜单id集合 + List userMenuIdList = findTargetIdListByObjectId(userId, SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_MENU); + + if (ObjectUtil.isAllEmpty(roleMenuList, userMenuIdList)) { + // 如果没有数据,则返回空 + return new ArrayList<>(); + } + + // 合并两个集合,使用set去重 + Set menuIdSet = new HashSet<>(); + menuIdSet.addAll(roleMenuList); + menuIdSet.addAll(userMenuIdList); + + return new ArrayList<>(menuIdSet); + } + + @Override + public List findAllPermissionIdListByUserId(Integer userId) { + // 查询用户所属的角色关联的权限id集合 + List roleIdList = findTargetIdListByObjectId(userId, SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_ROLE); + List rolePermissionList = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(roleIdList)) { + rolePermissionList = list(new LambdaUpdateWrapper() + .in(SysRelationshipEntity::getObjectId, roleIdList) + .eq(SysRelationshipEntity::getCategory, SysRelationshipTypeEnum.SYS_ROLE_RELATE_SYS_PERMISSION) + ).stream().map(SysRelationshipEntity::getTargetId).toList(); + } + + // 查询用户独有权限的权限id集合 + List userPermissionIdList = findTargetIdListByObjectId(userId, SysRelationshipTypeEnum.SYS_USER_RELATE_SYS_PERMISSION); + + if (ObjectUtil.isAllEmpty(rolePermissionList, userPermissionIdList)) { + // 如果没有数据,则返回空 + return new ArrayList<>(); + } + + // 合并两个集合,使用set去重 + Set menuIdSet = new HashSet<>(); + menuIdSet.addAll(rolePermissionList); + menuIdSet.addAll(userPermissionIdList); + + return new ArrayList<>(menuIdSet); + } } 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 2313d7c..e6c6f53 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 @@ -1,5 +1,6 @@ package top.milkbox.sys.modular.user.service.impl; +import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; @@ -8,12 +9,14 @@ 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 lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; 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.permission.service.SysPermissionService; import top.milkbox.sys.modular.user.entity.SysUserEntity; import top.milkbox.sys.modular.user.enums.SysUserGenderEnum; import top.milkbox.sys.modular.user.enums.SysUserStatusEnum; @@ -33,11 +36,15 @@ import java.util.List; */ @Slf4j @Service -@AllArgsConstructor public class SysUserServiceImpl extends CommonServiceImpl implements SysUserService { + @Autowired private SysUserMapper sysUserMapper; + @Lazy + @Autowired + private SysPermissionService sysPermissionService; + public static final int LOG_ROUNDS = 12; // 加密程度,数值越高越安全越慢 @Override @@ -166,8 +173,12 @@ public class SysUserServiceImpl extends CommonServiceImpl Date: Tue, 12 Nov 2024 18:28:39 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0mapstruct=E7=B1=BB?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E5=B7=A5=E5=85=B7=EF=BC=8C=E9=80=90=E6=AD=A5?= =?UTF-8?q?=E6=9B=BF=E4=BB=A3BeanUtil.toBean?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/mapStruct/SysUserMapStruct.java | 16 ++++++++ .../user/service/impl/SysUserServiceImpl.java | 7 +++- pom.xml | 37 ++++++++++++++++++- 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapStruct/SysUserMapStruct.java diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapStruct/SysUserMapStruct.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapStruct/SysUserMapStruct.java new file mode 100644 index 0000000..a5074b9 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapStruct/SysUserMapStruct.java @@ -0,0 +1,16 @@ +package top.milkbox.sys.modular.user.mapStruct; + +import org.mapstruct.Mapper; +import top.milkbox.sys.modular.user.entity.SysUserEntity; +import top.milkbox.sys.modular.user.vo.SysUserVo; + +/** + * 创建时间: 2024-11-12 下午 5:50 + * + * @author milkbox + */ +@Mapper +public interface SysUserMapStruct { + + SysUserVo entityToVo(SysUserEntity entity); +} 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 e6c6f53..85b8ae9 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 @@ -20,6 +20,7 @@ import top.milkbox.sys.modular.permission.service.SysPermissionService; import top.milkbox.sys.modular.user.entity.SysUserEntity; import top.milkbox.sys.modular.user.enums.SysUserGenderEnum; import top.milkbox.sys.modular.user.enums.SysUserStatusEnum; +import top.milkbox.sys.modular.user.mapStruct.SysUserMapStruct; import top.milkbox.sys.modular.user.mapper.SysUserMapper; import top.milkbox.sys.modular.user.param.*; import top.milkbox.sys.modular.user.service.SysUserService; @@ -45,6 +46,9 @@ public class SysUserServiceImpl extends CommonServiceImpl org.projectlombok lombok + compile @@ -170,8 +171,15 @@ - + + + org.mapstruct + mapstruct + ${org.mapstruct.version} + compile + + @@ -190,6 +198,7 @@ 1.37.0 1.37.0 + 1.5.5.Final @@ -249,6 +258,32 @@ ${maven.compiler.source} ${maven.compiler.target} UTF-8 + + + + org.projectlombok + lombok + ${lombok.version} + + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + + + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + + + + -Amapstruct.defaultComponentModel=spring + -- Gitee From 0fe0851096188a7256fc1989de483e0792ed4701 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, 19 Nov 2024 18:03:53 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E7=9A=84mapstruct?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 158 +++++++++++++++++- .../menu/mapStruct/SysMenuMapStruct.java | 34 ++++ .../menu/service/impl/SysMenuServiceImpl.java | 13 +- .../mapStruct/SysPermissionMapStruct.java | 34 ++++ .../impl/SysPermissionServiceImpl.java | 16 +- .../mapStruct/SysRelationshipMapStruct.java | 34 ++++ .../impl/SysRelationshipServiceImpl.java | 12 +- .../role/mapStruct/SysRoleMapStruct.java | 34 ++++ .../role/service/impl/SysRoleServiceImpl.java | 11 +- .../user/mapStruct/SysUserMapStruct.java | 28 +++- .../user/service/impl/SysUserServiceImpl.java | 14 +- 11 files changed, 353 insertions(+), 35 deletions(-) create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapStruct/SysMenuMapStruct.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/mapStruct/SysPermissionMapStruct.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/mapStruct/SysRelationshipMapStruct.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapStruct/SysRoleMapStruct.java diff --git a/README.md b/README.md index fcda266..e64cd3e 100644 --- a/README.md +++ b/README.md @@ -91,4 +91,160 @@ C:\Users\Administrator\.jdks\openjdk-21.0.1\bin\java -Dfile.encoding=UTF-8 -Dsun ## 在milkbox-service模块下新建模块后需要配置maven的导包依赖 -在项目根目录下的pom.xml的dependencyManagement中定义新模块的版本,然后在milkbox-app模块中引入新模块 \ No newline at end of file +在项目根目录下的pom.xml的dependencyManagement中定义新模块的版本,然后在milkbox-app模块中引入新模块 + +# MapStruct + +项目建议使用MapStruct来做对象转换。定义一个转换接口与转换方法,MapStruct会根据方法的参数与返回,在启动项目之前的编译阶段值自动生成实现类。 + +> 注意:如果对接口进行了修改,一定先执行maven的clean命令然后再编译项目。否则新修改的内容可能不会更新编译。 + +当前其对应接口的实现类生成的源码文件位于`模块.../target/generated-sources/annotations/包路径.../XxxxxxImpl.java` + +其实现类的字节码文件将会按照接口的包路径位置生成 + +写法举例如下: + +```java +package top.milkbox.sys.modular.user.mapStruct; + +import org.mapstruct.Mapper; +import top.milkbox.sys.modular.user.entity.SysUserEntity; +import top.milkbox.sys.modular.user.param.SysUserAddParam; +import top.milkbox.sys.modular.user.param.SysUserEditParam; +import top.milkbox.sys.modular.user.vo.SysUserVo; + +/** + * SysUser相关的实体类之间的转换
+ * 此接口由MapStruct在编译时生成实现代码,详细解释请看readme
+ * + * @author milkbox + * @Data 2024-11-19 + */ +@Mapper // 注意这个Mapper不是String的Mapper +public interface SysUserMapStruct { + + /** + * entity转vo + */ + SysUserVo entityToVo(SysUserEntity entity); + + /** + * addParam转entity + */ + SysUserEntity addParamToEntity(SysUserAddParam addParam); + + /** + * editParam转entity + */ + SysUserEntity editParamToEntity(SysUserEditParam editParam); + +} + +``` + +生成的实现类源码: +```java +package top.milkbox.sys.modular.user.mapStruct; + +import javax.annotation.processing.Generated; +import org.springframework.stereotype.Component; +import top.milkbox.sys.modular.user.entity.SysUserEntity; +import top.milkbox.sys.modular.user.param.SysUserAddParam; +import top.milkbox.sys.modular.user.param.SysUserEditParam; +import top.milkbox.sys.modular.user.vo.SysUserVo; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2024-11-19T09:38:00+0800", + comments = "version: 1.5.5.Final, compiler: javac, environment: Java 21.0.1 (Oracle Corporation)" +) +@Component +public class SysUserMapStructImpl implements SysUserMapStruct { + + @Override + public SysUserVo entityToVo(SysUserEntity entity) { + if ( entity == null ) { + return null; + } + + SysUserVo sysUserVo = new SysUserVo(); + + sysUserVo.setSortCode( entity.getSortCode() ); + sysUserVo.setCreateUser( entity.getCreateUser() ); + sysUserVo.setCreateTime( entity.getCreateTime() ); + sysUserVo.setUpdateUser( entity.getUpdateUser() ); + sysUserVo.setUpdateTime( entity.getUpdateTime() ); + sysUserVo.setId( entity.getId() ); + sysUserVo.setAccount( entity.getAccount() ); + sysUserVo.setNickname( entity.getNickname() ); + sysUserVo.setEmail( entity.getEmail() ); + sysUserVo.setPhone( entity.getPhone() ); + sysUserVo.setAvatar( entity.getAvatar() ); + sysUserVo.setGender( entity.getGender() ); + sysUserVo.setSecretLevel( entity.getSecretLevel() ); + sysUserVo.setStatus( entity.getStatus() ); + sysUserVo.setBeforeLoginIp( entity.getBeforeLoginIp() ); + sysUserVo.setBeforeLoginAddress( entity.getBeforeLoginAddress() ); + sysUserVo.setBeforeLoginTime( entity.getBeforeLoginTime() ); + sysUserVo.setBeforeLoginDevice( entity.getBeforeLoginDevice() ); + sysUserVo.setNewLoginIp( entity.getNewLoginIp() ); + sysUserVo.setNewLoginAddress( entity.getNewLoginAddress() ); + sysUserVo.setNewLoginTime( entity.getNewLoginTime() ); + sysUserVo.setNewLoginDevice( entity.getNewLoginDevice() ); + + return sysUserVo; + } + + @Override + public SysUserEntity addParamToEntity(SysUserAddParam addParam) { + if ( addParam == null ) { + return null; + } + + SysUserEntity sysUserEntity = new SysUserEntity(); + + sysUserEntity.setAccount( addParam.getAccount() ); + sysUserEntity.setNickname( addParam.getNickname() ); + sysUserEntity.setEmail( addParam.getEmail() ); + sysUserEntity.setPhone( addParam.getPhone() ); + sysUserEntity.setAvatar( addParam.getAvatar() ); + sysUserEntity.setGender( addParam.getGender() ); + sysUserEntity.setSecretLevel( addParam.getSecretLevel() ); + sysUserEntity.setStatus( addParam.getStatus() ); + + return sysUserEntity; + } + + @Override + public SysUserEntity editParamToEntity(SysUserEditParam editParam) { + if ( editParam == null ) { + return null; + } + + SysUserEntity sysUserEntity = new SysUserEntity(); + + sysUserEntity.setId( editParam.getId() ); + sysUserEntity.setAccount( editParam.getAccount() ); + sysUserEntity.setPassword( editParam.getPassword() ); + sysUserEntity.setNickname( editParam.getNickname() ); + sysUserEntity.setEmail( editParam.getEmail() ); + sysUserEntity.setPhone( editParam.getPhone() ); + sysUserEntity.setAvatar( editParam.getAvatar() ); + sysUserEntity.setGender( editParam.getGender() ); + sysUserEntity.setSecretLevel( editParam.getSecretLevel() ); + sysUserEntity.setStatus( editParam.getStatus() ); + sysUserEntity.setBeforeLoginIp( editParam.getBeforeLoginIp() ); + sysUserEntity.setBeforeLoginAddress( editParam.getBeforeLoginAddress() ); + sysUserEntity.setBeforeLoginTime( editParam.getBeforeLoginTime() ); + sysUserEntity.setBeforeLoginDevice( editParam.getBeforeLoginDevice() ); + sysUserEntity.setNewLoginIp( editParam.getNewLoginIp() ); + sysUserEntity.setNewLoginAddress( editParam.getNewLoginAddress() ); + sysUserEntity.setNewLoginTime( editParam.getNewLoginTime() ); + sysUserEntity.setNewLoginDevice( editParam.getNewLoginDevice() ); + + return sysUserEntity; + } +} + +``` \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapStruct/SysMenuMapStruct.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapStruct/SysMenuMapStruct.java new file mode 100644 index 0000000..4585a1f --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/mapStruct/SysMenuMapStruct.java @@ -0,0 +1,34 @@ +package top.milkbox.sys.modular.menu.mapStruct; + +import org.mapstruct.Mapper; +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.vo.SysMenuVo; + +/** + * SysMenu相关的实体类之间的转换
+ * 此接口由MapStruct在编译时生成实现代码,详细解释请看readme
+ * + * @author milkbox + * @date 2024-11-19 + */ +@Mapper +public interface SysMenuMapStruct { + + /** + * entity转vo + */ + SysMenuVo entityToVo(SysMenuEntity entity); + + /** + * addParam转entity + */ + SysMenuEntity addParamToEntity(SysMenuAddParam addParam); + + /** + * editParam转entity + */ + SysMenuEntity editParamToEntity(SysMenuEditParam editParam); + +} \ 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 index d86cf4f..643acf0 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/service/impl/SysMenuServiceImpl.java @@ -1,14 +1,11 @@ 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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -18,6 +15,7 @@ import top.milkbox.common.exceprion.CommonServiceException; import top.milkbox.common.service.impl.CommonServiceImpl; import top.milkbox.common.utils.CommonUtil; import top.milkbox.sys.modular.menu.entity.SysMenuEntity; +import top.milkbox.sys.modular.menu.mapStruct.SysMenuMapStruct; import top.milkbox.sys.modular.menu.mapper.SysMenuMapper; import top.milkbox.sys.modular.menu.param.SysMenuAddParam; import top.milkbox.sys.modular.menu.param.SysMenuEditParam; @@ -42,6 +40,9 @@ import java.util.List; @Service public class SysMenuServiceImpl extends CommonServiceImpl implements SysMenuService { + @Autowired + private SysMenuMapStruct sysMenuMapStruct; + @Autowired private SysMenuMapper sysMenuMapper; @@ -52,7 +53,7 @@ public class SysMenuServiceImpl extends CommonServiceImpl + * 此接口由MapStruct在编译时生成实现代码,详细解释请看readme
+ * + * @author milkbox + * @date 2024-11-19 + */ +@Mapper +public interface SysPermissionMapStruct { + + /** + * entity转vo + */ + SysPermissionVo entityToVo(SysPermissionEntity entity); + + /** + * addParam转entity + */ + SysPermissionEntity addParamToEntity(SysPermissionAddParam addParam); + + /** + * editParam转entity + */ + SysPermissionEntity editParamToEntity(SysPermissionEditParam editParam); + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java index 077bd97..c623439 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java @@ -1,12 +1,10 @@ package top.milkbox.sys.modular.permission.service.impl; import cn.dev33.satoken.stp.StpUtil; -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.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; @@ -14,8 +12,8 @@ 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.permission.entity.SysPermissionEntity; +import top.milkbox.sys.modular.permission.mapStruct.SysPermissionMapStruct; import top.milkbox.sys.modular.permission.mapper.SysPermissionMapper; import top.milkbox.sys.modular.permission.param.SysPermissionAddParam; import top.milkbox.sys.modular.permission.param.SysPermissionEditParam; @@ -24,11 +22,8 @@ import top.milkbox.sys.modular.permission.param.SysPermissionPageParam; import top.milkbox.sys.modular.permission.service.SysPermissionService; import top.milkbox.sys.modular.permission.vo.SysPermissionVo; import top.milkbox.common.utils.CommonUtil; -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 java.util.ArrayList; import java.util.List; /** @@ -44,10 +39,11 @@ public class SysPermissionServiceImpl extends ServiceImpl voPage = CommonUtil.convertPage(entityPage, entity -> { - SysPermissionVo vo = BeanUtil.toBean(entity, SysPermissionVo.class); + SysPermissionVo vo = sysPermissionMapStruct.entityToVo(entity); // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... return vo; diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/mapStruct/SysRelationshipMapStruct.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/mapStruct/SysRelationshipMapStruct.java new file mode 100644 index 0000000..7d41f07 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/mapStruct/SysRelationshipMapStruct.java @@ -0,0 +1,34 @@ +package top.milkbox.sys.modular.relationship.mapStruct; + +import org.mapstruct.Mapper; +import top.milkbox.sys.modular.relationship.entity.SysRelationshipEntity; +import top.milkbox.sys.modular.relationship.param.SysRelationshipAddParam; +import top.milkbox.sys.modular.relationship.param.SysRelationshipEditParam; +import top.milkbox.sys.modular.relationship.vo.SysRelationshipVo; + +/** + * SysRelationship相关的实体类之间的转换
+ * 此接口由MapStruct在编译时生成实现代码,详细解释请看readme
+ * + * @author milkbox + * @date 2024-11-19 + */ +@Mapper +public interface SysRelationshipMapStruct { + + /** + * entity转vo + */ + SysRelationshipVo entityToVo(SysRelationshipEntity entity); + + /** + * addParam转entity + */ + SysRelationshipEntity addParamToEntity(SysRelationshipAddParam addParam); + + /** + * editParam转entity + */ + SysRelationshipEntity editParamToEntity(SysRelationshipEditParam editParam); + +} \ 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 e520c49..2f4a4f7 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 @@ -1,6 +1,5 @@ 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.update.LambdaUpdateWrapper; @@ -17,6 +16,7 @@ import top.milkbox.sys.modular.relationship.bo.SysRelationshipObjectAuthTargetBo import top.milkbox.sys.modular.relationship.bo.SysRelationshipTargetAuthObjectBo; import top.milkbox.sys.modular.relationship.entity.SysRelationshipEntity; import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; +import top.milkbox.sys.modular.relationship.mapStruct.SysRelationshipMapStruct; import top.milkbox.sys.modular.relationship.mapper.SysRelationshipMapper; import top.milkbox.sys.modular.relationship.param.SysRelationshipAddParam; import top.milkbox.sys.modular.relationship.param.SysRelationshipEditParam; @@ -48,33 +48,37 @@ public class SysRelationshipServiceImpl implements SysRelationshipService { private SysRelationshipMapper sysRelationshipMapper; + private SysRelationshipMapStruct sysRelationshipMapStruct; private SysUserService sysUserService; private SysRoleService sysRoleService; private SysMenuService sysMenuService; @Override + @Transactional(rollbackFor = Exception.class) public void add(SysRelationshipAddParam addParam) { - SysRelationshipEntity entity = BeanUtil.toBean(addParam, SysRelationshipEntity.class); + SysRelationshipEntity entity = sysRelationshipMapStruct.addParamToEntity(addParam); super.save(entity); } @Override + @Transactional(rollbackFor = Exception.class) public void delete(List paramList) { super.removeByIds(paramList.stream().map(SysRelationshipIdParam::getId).toList()); } @Override + @Transactional(rollbackFor = Exception.class) public void edit(SysRelationshipEditParam editParam) { findEntity(editParam.getId()); - SysRelationshipEntity entity = BeanUtil.toBean(editParam, SysRelationshipEntity.class); + SysRelationshipEntity entity = sysRelationshipMapStruct.editParamToEntity(editParam); super.updateById(entity); } @Override public SysRelationshipVo detail(SysRelationshipIdParam idParam) { SysRelationshipEntity entity = findEntity(idParam.getId()); - SysRelationshipVo vo = BeanUtil.toBean(entity, SysRelationshipVo.class); + SysRelationshipVo vo = sysRelationshipMapStruct.entityToVo(entity); // 此处进行数据翻译操作,,根据不同的业务逻辑将entity对象转为vo对象...... return vo; diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapStruct/SysRoleMapStruct.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapStruct/SysRoleMapStruct.java new file mode 100644 index 0000000..373aad5 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapStruct/SysRoleMapStruct.java @@ -0,0 +1,34 @@ +package top.milkbox.sys.modular.role.mapStruct; + +import org.mapstruct.Mapper; +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.vo.SysRoleVo; + +/** + * SysRole相关的实体类之间的转换
+ * 此接口由MapStruct在编译时生成实现代码,详细解释请看readme
+ * + * @author milkbox + * @date 2024-11-19 + */ +@Mapper +public interface SysRoleMapStruct { + + /** + * entity转vo + */ + SysRoleVo entityToVo(SysRoleEntity entity); + + /** + * addParam转entity + */ + SysRoleEntity addParamToEntity(SysRoleAddParam addParam); + + /** + * editParam转entity + */ + SysRoleEntity editParamToEntity(SysRoleEditParam editParam); + +} \ 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 86801f8..59c22f6 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 @@ -18,6 +18,7 @@ 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.mapStruct.SysRoleMapStruct; import top.milkbox.sys.modular.role.mapper.SysRoleMapper; import top.milkbox.sys.modular.role.param.*; import top.milkbox.sys.modular.role.service.SysRoleService; @@ -41,11 +42,11 @@ import java.util.List; public class SysRoleServiceImpl extends CommonServiceImpl implements SysRoleService { private SysRoleMapper sysRoleMapper; + private SysRoleMapStruct sysRoleMapStruct; @Override - @Transactional(rollbackFor = Exception.class) public void add(SysRoleAddParam addParam) { - SysRoleEntity entity = BeanUtil.toBean(addParam, SysRoleEntity.class); + SysRoleEntity entity = sysRoleMapStruct.addParamToEntity(addParam); super.save(entity); } @@ -60,14 +61,14 @@ public class SysRoleServiceImpl extends CommonServiceImpl voPage = CommonUtil.convertPage(entityPage, entity -> { - SysRoleVo vo = BeanUtil.toBean(entity, SysRoleVo.class); + SysRoleVo vo = sysRoleMapStruct.entityToVo(entity); // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... return vo; diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapStruct/SysUserMapStruct.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapStruct/SysUserMapStruct.java index a5074b9..27de589 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapStruct/SysUserMapStruct.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapStruct/SysUserMapStruct.java @@ -1,16 +1,42 @@ package top.milkbox.sys.modular.user.mapStruct; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; import top.milkbox.sys.modular.user.entity.SysUserEntity; +import top.milkbox.sys.modular.user.param.SysUserAddParam; +import top.milkbox.sys.modular.user.param.SysUserEditParam; +import top.milkbox.sys.modular.user.param.SysUserRegisterParam; import top.milkbox.sys.modular.user.vo.SysUserVo; /** - * 创建时间: 2024-11-12 下午 5:50 + * SysUser相关的实体类之间的转换
+ * 此接口由MapStruct在编译时生成实现代码,详细解释请看readme
* * @author milkbox + * @Data 2024-11-19 */ @Mapper public interface SysUserMapStruct { + /** + * entity转vo + */ + @Mapping(target = "token", ignore = true) SysUserVo entityToVo(SysUserEntity entity); + + /** + * addParam转entity + */ + SysUserEntity addParamToEntity(SysUserAddParam addParam); + + /** + * editParam转entity + */ + SysUserEntity editParamToEntity(SysUserEditParam editParam); + + /** + * registerParam转entity + */ + SysUserEntity registerParamToEntity(SysUserRegisterParam registerParam); + } 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 85b8ae9..31c476a 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 @@ -2,7 +2,6 @@ package top.milkbox.sys.modular.user.service.impl; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.BCrypt; @@ -53,7 +52,7 @@ public class SysUserServiceImpl extends CommonServiceImpl voPage = CommonUtil.convertPage(entityPage, entity -> { - SysUserVo vo = BeanUtil.toBean(entity, SysUserVo.class); + SysUserVo vo = sysUserMapStruct.entityToVo(entity); // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... return vo; @@ -142,14 +140,14 @@ public class SysUserServiceImpl extends CommonServiceImpl Date: Wed, 20 Nov 2024 18:32:12 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=9D=83=E9=99=90?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E8=8F=9C=E5=8D=95=E5=92=8C=E6=9D=83?= =?UTF-8?q?=E9=99=90=E4=B8=9A=E5=8A=A1=E7=9A=84=E6=9D=83=E9=99=90=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++++++- .../core/handler/GlobalControllerAdvice.java | 18 ++++++++++++++++-- milkbox-app/src/main/resources/application.yml | 6 ++++++ .../top/milkbox/common/pojo/CommonParam.java | 16 ++++++++++++++++ .../java/top/milkbox/common/pojo/CommonVo.java | 10 ++++++++-- .../menu/controller/SysMenuController.java | 9 +++++++-- .../controller/SysPermissionController.java | 6 ++++++ .../permission/entity/SysPermissionEntity.java | 17 +++++++++++++++++ .../param/SysPermissionAddParam.java | 16 +++++++++++++++- .../param/SysPermissionEditParam.java | 17 ++++++++++++++++- .../param/SysPermissionPageParam.java | 14 ++++++++++++++ .../service/SysPermissionService.java | 11 ++++++++++- .../service/impl/SysPermissionServiceImpl.java | 16 +++++++++++++++- .../modular/permission/vo/SysPermissionVo.java | 13 +++++++++++++ 14 files changed, 166 insertions(+), 11 deletions(-) create mode 100644 milkbox-common/src/main/java/top/milkbox/common/pojo/CommonParam.java diff --git a/README.md b/README.md index e64cd3e..c1f56d6 100644 --- a/README.md +++ b/README.md @@ -247,4 +247,10 @@ public class SysUserMapStructImpl implements SysUserMapStruct { } } -``` \ No newline at end of file +``` + +# 有关时区的问题 + +## 时间的存取过程 + +在java中使用new Date()方式创建亚洲上海时区时间->mysql数据库中使用datetime数据类型存储无时区时间->java读取时间并转为上海时区时间->springmvc中使用jackson将java时间转为字符串(其会按照application配置文件中的配置进行转换)->返回给前端年月日格式的字符串。 \ No newline at end of file diff --git a/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java b/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java index 69e8c51..2ed6402 100644 --- a/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java +++ b/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java @@ -2,8 +2,10 @@ package top.milkbox.core.handler; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotPermissionException; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.ui.Model; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -13,6 +15,8 @@ import org.springframework.web.method.annotation.HandlerMethodValidationExceptio import top.milkbox.common.enums.CommonStatusCodeEnum; import top.milkbox.common.exceprion.CommonServiceException; import top.milkbox.common.pojo.CommonResult; +import top.milkbox.sys.modular.permission.service.SysPermissionService; +import top.milkbox.sys.modular.permission.vo.SysPermissionVo; import java.util.Arrays; @@ -26,6 +30,9 @@ import java.util.Arrays; @ControllerAdvice public class GlobalControllerAdvice { + @Autowired + private SysPermissionService sysPermissionService; + /** * 把值绑定到Model中,使全局@RequestMapping可以获取到该值 */ @@ -74,10 +81,17 @@ public class GlobalControllerAdvice { } // 无sa-token权限异常 - else if (exception instanceof NotPermissionException) { + else if (exception instanceof NotPermissionException notPermissionException) { + String permissionCode = notPermissionException.getPermission(); + // 根据权限码,从数据库中查询出这一条权限,用于拼接错误信息 + SysPermissionVo permissionVo = sysPermissionService.getByValue(permissionCode); + StringBuilder errorMessage = new StringBuilder("无此权限:"); + if (ObjectUtil.isNotEmpty(permissionVo)) { + errorMessage.append(permissionVo.getName()); + } return CommonResult.create() .withCode(CommonStatusCodeEnum.ERROR403.getCode()) - .withMessage(exception.getMessage()); + .withMessage(errorMessage.append("(").append(permissionCode).append(")").toString()); } // 后端校验不通过异常 diff --git a/milkbox-app/src/main/resources/application.yml b/milkbox-app/src/main/resources/application.yml index 340e194..a412cde 100644 --- a/milkbox-app/src/main/resources/application.yml +++ b/milkbox-app/src/main/resources/application.yml @@ -7,6 +7,12 @@ springdoc: path: "/doc.html" spring: + ############### Jackson配置 ############## + jackson: + time-zone: "Asia/Shanghai" # 时区 + date-format: "yyyy-MM-dd HH:mm:ss" # 日期格式 + locale: zh_CN + ############## 数据库配置 ############## datasource: # 主机地址、用户名和密码请配置环境变量 diff --git a/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonParam.java b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonParam.java new file mode 100644 index 0000000..7808fee --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonParam.java @@ -0,0 +1,16 @@ +package top.milkbox.common.pojo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 通用参数对象 + * + * @author milkbox + */ +@Data +public class CommonParam { + + @Schema(title = "排序字段") + private Integer sortCode; +} diff --git a/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonVo.java b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonVo.java index 0570b3e..6d09ad1 100644 --- a/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonVo.java +++ b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonVo.java @@ -20,9 +20,12 @@ public class CommonVo implements Serializable { /** * 创建人 */ - @Schema(title = "创建人") + @Schema(title = "创建人ID") private Integer createUser; + @Schema(title = "创建人名称") + private String createUserName; + /** * 创建时间 */ @@ -32,9 +35,12 @@ public class CommonVo implements Serializable { /** * 更新人 */ - @Schema(title = "更新人") + @Schema(title = "更新人ID") private Integer updateUser; + @Schema(title = "更新人名称") + private String updateUserName; + /** * 更新时间 */ diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/controller/SysMenuController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/controller/SysMenuController.java index f258220..5455c6e 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/controller/SysMenuController.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/controller/SysMenuController.java @@ -42,6 +42,7 @@ public class SysMenuController { @Operation(summary = "添加", description = "添加一条数据") @CommonLog(value = "添加", description = "添加一条数据", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) + @SaCheckPermission("/sysMenu/add") public CommonResult add(@Validated @RequestBody SysMenuAddParam addParam) { sysMenuService.add(addParam); return CommonResult.ok(); @@ -50,6 +51,7 @@ public class SysMenuController { @DeleteMapping("/delete") @Operation(summary = "普通批量删除") @CommonLog(value = "普通批量删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) + @SaCheckPermission("/sysMenu/delete") public CommonResult delete( @RequestBody @Size(min = 1, message = "请至少传递一个删除对象") @@ -63,6 +65,7 @@ public class SysMenuController { @DeleteMapping("/replaceDelete") @Operation(summary = "取代删除") @CommonLog(value = "取代删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) + @SaCheckPermission("/sysMenu/delete") public CommonResult replaceDelete(@Validated @RequestBody SysMenuIdParam idParam) { sysMenuService.replaceDelete(idParam); return CommonResult.ok(); @@ -71,6 +74,7 @@ public class SysMenuController { @DeleteMapping("/cascadingDelete") @Operation(summary = "级联删除") @CommonLog(value = "级联删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) + @SaCheckPermission("/sysMenu/delete") public CommonResult cascadingDelete(@Validated @RequestBody SysMenuIdParam idParam) { sysMenuService.cascadingDelete(idParam); return CommonResult.ok(); @@ -80,6 +84,7 @@ public class SysMenuController { @Operation(summary = "修改", description = "修改一条数据") @CommonLog(value = "修改", description = "修改一条数据", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) + @SaCheckPermission("/sysMenu/edit") public CommonResult edit(@Validated @RequestBody SysMenuEditParam editParam) { sysMenuService.edit(editParam); return CommonResult.ok(); @@ -89,6 +94,7 @@ public class SysMenuController { @Operation(summary = "详情", description = "查询一条数据的详情") @CommonLog(value = "详情", description = "查询一条数据的详情", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + @SaCheckPermission("/sysMenu/detail") public CommonResult detail(@Validated SysMenuIdParam idParam) { return CommonResult.ok(sysMenuService.detail(idParam)); } @@ -105,12 +111,11 @@ public class SysMenuController { @Operation(summary = "获取菜单森林", description = "获取当前登录用户拥有权限的菜单森林") @CommonLog(value = "获取菜单森林", description = "获取当前登录用户拥有权限的菜单森林", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + @SaCheckPermission("/sysMenu/forest") public CommonResult>> forest() { return CommonResult.ok(sysMenuService.forest()); } - // TODO 应设较高权限 - // TODO 这里的菜单应该具有条件查询功能,在查询的时候需要注意通过结果查询其上级,最终构建一棵树 @GetMapping("/forestAll") @Operation(summary = "获取所有菜单森林", description = "获取所有菜单森林") @CommonLog(value = "获取所有菜单森林", description = "获取所有菜单森林", diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/controller/SysPermissionController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/controller/SysPermissionController.java index 32a8e6f..7a6512e 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/controller/SysPermissionController.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/controller/SysPermissionController.java @@ -1,6 +1,7 @@ package top.milkbox.sys.modular.permission.controller; import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -42,6 +43,7 @@ public class SysPermissionController { @Operation(summary = "添加", description = "添加一条数据") @CommonLog(value = "添加", description = "添加一条数据", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) + @SaCheckPermission("/sysPermission/add") public CommonResult add(@Validated @RequestBody SysPermissionAddParam addParam) { sysPermissionService.add(addParam); return CommonResult.ok(); @@ -50,6 +52,7 @@ public class SysPermissionController { @DeleteMapping("/delete") @Operation(summary = "批量删除") @CommonLog(value = "批量删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) + @SaCheckPermission("/sysPermission/delete") public CommonResult delete( @RequestBody @Size(min = 1, message = "请至少传递一个删除对象") @@ -64,6 +67,7 @@ public class SysPermissionController { @Operation(summary = "修改", description = "修改一条数据") @CommonLog(value = "修改", description = "修改一条数据", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) + @SaCheckPermission("/sysPermission/edit") public CommonResult edit(@Validated @RequestBody SysPermissionEditParam editParam) { sysPermissionService.edit(editParam); return CommonResult.ok(); @@ -73,6 +77,7 @@ public class SysPermissionController { @Operation(summary = "详情", description = "查询一条数据的详情") @CommonLog(value = "详情", description = "查询一条数据的详情", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + @SaCheckPermission("/sysPermission/detail") public CommonResult detail(@Validated SysPermissionIdParam idParam) { return CommonResult.ok(sysPermissionService.detail(idParam)); } @@ -81,6 +86,7 @@ public class SysPermissionController { @Operation(summary = "分页查询", description = "查询条件分页查询") @CommonLog(value = "分页查询", description = "查询条件分页查询", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + @SaCheckPermission("/sysPermission/page") public CommonResult> page(@Validated SysPermissionPageParam pageParam) { return CommonResult.ok(sysPermissionService.page(pageParam)); } diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/entity/SysPermissionEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/entity/SysPermissionEntity.java index fc82c14..875f8ca 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/entity/SysPermissionEntity.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/entity/SysPermissionEntity.java @@ -10,6 +10,7 @@ import lombok.NoArgsConstructor; import top.milkbox.common.pojo.CommonEntity; import java.io.Serializable; + import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.FieldStrategy; @@ -58,4 +59,20 @@ public class SysPermissionEntity extends CommonEntity implements Serializable { @TableField(updateStrategy = FieldStrategy.ALWAYS) private String category; + /** + * 业务类型;按照业务类型进行分类,例如:角色管理、用户管理 + */ + @Schema(title = "业务类型", + description = "业务类型。按照业务类型进行分类,例如:角色管理、用户管理") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String business; + + /** + * 描述 + */ + @Schema(title = "描述", + description = "描述") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String description; + } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionAddParam.java index cc0affe..2ecd651 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionAddParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionAddParam.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import java.io.Serializable; import jakarta.validation.constraints.NotBlank; +import top.milkbox.common.pojo.CommonParam; /** * 添加参数对象 @@ -17,7 +18,7 @@ import jakarta.validation.constraints.NotBlank; @Data @NoArgsConstructor @AllArgsConstructor -public class SysPermissionAddParam implements Serializable { +public class SysPermissionAddParam extends CommonParam implements Serializable { /** * 权限名 @@ -41,4 +42,17 @@ public class SysPermissionAddParam implements Serializable { description = "权限类型。可以按照api权限或者其他类型的权限进行分类。暂时没想好") private String category; + /** + * 业务类型;按照业务类型进行分类,例如:角色管理、用户管理 + */ + @Schema(title = "业务类型", + description = "业务类型。按照业务类型进行分类,例如:角色管理、用户管理") + private String business; + + /** + * 描述 + */ + @Schema(title = "描述", + description = "描述") + private String description; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionEditParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionEditParam.java index c9fa7cb..4379e7f 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionEditParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionEditParam.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import java.io.Serializable; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotBlank; +import top.milkbox.common.pojo.CommonParam; /** * 编辑参数对象 @@ -18,7 +19,7 @@ import jakarta.validation.constraints.NotBlank; @Data @NoArgsConstructor @AllArgsConstructor -public class SysPermissionEditParam implements Serializable { +public class SysPermissionEditParam extends CommonParam implements Serializable { /** * 主键 @@ -50,4 +51,18 @@ public class SysPermissionEditParam implements Serializable { description = "权限类型。可以按照api权限或者其他类型的权限进行分类。暂时没想好") private String category; + /** + * 业务类型;按照业务类型进行分类,例如:角色管理、用户管理 + */ + @Schema(title = "业务类型", + description = "业务类型。按照业务类型进行分类,例如:角色管理、用户管理") + private String business; + + /** + * 描述 + */ + @Schema(title = "描述", + description = "描述") + private String description; + } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionPageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionPageParam.java index 9cce2cb..62e77a5 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionPageParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/param/SysPermissionPageParam.java @@ -42,4 +42,18 @@ public class SysPermissionPageParam extends CommonPageParam implements Serializa description = "权限类型。可以按照api权限或者其他类型的权限进行分类。暂时没想好") private String category; + /** + * 业务类型;按照业务类型进行分类,例如:角色管理、用户管理 + */ + @Schema(title = "业务类型", + description = "业务类型。按照业务类型进行分类,例如:角色管理、用户管理") + private String business; + + /** + * 描述 + */ + @Schema(title = "描述", + description = "描述") + private String description; + } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/SysPermissionService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/SysPermissionService.java index 586c24f..c0f0d48 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/SysPermissionService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/SysPermissionService.java @@ -12,7 +12,8 @@ import top.milkbox.sys.modular.permission.vo.SysPermissionVo; import java.util.List; /** - * 系统_权限表(sys_permission)服务层接口 + * 系统_权限表(sys_permission)服务层接口
+ * 权限表的修改仅作用在数据中,对于redis中保存的已经登录用户的权限信息不会改变。需要根据情况手动调整。 * * @author milkbox * @date 2024-10-31 @@ -71,4 +72,12 @@ public interface SysPermissionService extends IService { */ List listByLoginUser(); + /** + * 根据权限码(value)查询权限 + * + * @param value 权限码 + * @return 返回权限对象,如果不存在则返回null + */ + SysPermissionVo getByValue(String value); + } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java index c623439..449bd08 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/service/impl/SysPermissionServiceImpl.java @@ -43,6 +43,7 @@ public class SysPermissionServiceImpl extends ServiceImpl page(SysPermissionPageParam pageParam) { QueryWrapper queryWrapper = new QueryWrapper<>(); - if (ObjectUtil.isAllNotEmpty(pageParam.getSortField(), pageParam.getSortType())) { + if (ObjectUtil.isNotEmpty(pageParam.getSearchKey())) { + queryWrapper.lambda().like(SysPermissionEntity::getName, pageParam.getSearchKey()) + .or().like(SysPermissionEntity::getValue, pageParam.getSearchKey()); + } else if (ObjectUtil.isAllNotEmpty(pageParam.getSortField(), pageParam.getSortType())) { queryWrapper.orderBy(true, pageParam.getSortType() == CommonSortTypeEnum.ASC, StrUtil.toUnderlineCase(pageParam.getSortField())); @@ -109,4 +113,14 @@ public class SysPermissionServiceImpl extends ServiceImpl().in(SysPermissionEntity::getId, permissionIdList)); } + @Override + public SysPermissionVo getByValue(String value) { + SysPermissionEntity entity = super.getOne( + new LambdaQueryWrapper().eq(SysPermissionEntity::getValue, value)); + if (ObjectUtil.isEmpty(entity)) { + return null; + } + return sysPermissionMapStruct.entityToVo(entity); + } + } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/vo/SysPermissionVo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/vo/SysPermissionVo.java index 1d3ca95..600a201 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/vo/SysPermissionVo.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/permission/vo/SysPermissionVo.java @@ -50,4 +50,17 @@ public class SysPermissionVo extends CommonVo implements Serializable { description = "权限类型。可以按照api权限或者其他类型的权限进行分类。暂时没想好") private String category; + /** + * 业务类型;按照业务类型进行分类,例如:角色管理、用户管理 + */ + @Schema(title = "业务类型", + description = "业务类型。按照业务类型进行分类,例如:角色管理、用户管理") + private String business; + + /** + * 描述 + */ + @Schema(title = "描述", + description = "描述") + private String description; } \ No newline at end of file -- Gitee