refactor: 用户角色名称调整为角色名称列表返回,并全局优化 Crane4j 组件的使用方式

This commit is contained in:
2024-05-17 20:41:15 +08:00
parent 1427c13b7a
commit 857a1c9083
12 changed files with 44 additions and 46 deletions

View File

@@ -37,14 +37,9 @@ public class ContainerConstants extends ContainerPool {
public static final String USER_ROLE_ID_LIST = "UserRoleIdList"; public static final String USER_ROLE_ID_LIST = "UserRoleIdList";
/** /**
* 角色部门列表 * 用户角色名称列表
*/ */
public static final String ROLE_DEPT_ID_LIST = "RoleDeptIdList"; public static final String USER_ROLE_NAME_LIST = "UserRoleNameList";
/**
* 在线用户最后活跃时间
*/
public static final String ONLINE_USER_LAST_ACTIVE_TIME = "OnlineUserLastActiveTime";
private ContainerConstants() { private ContainerConstants() {
} }

View File

@@ -16,10 +16,10 @@
package top.continew.admin.auth.model.resp; package top.continew.admin.auth.model.resp;
import cn.crane4j.annotation.Assemble; import cn.crane4j.annotation.*;
import cn.crane4j.annotation.Mapping;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import top.continew.admin.auth.service.OnlineUserService;
import top.continew.admin.common.constant.ContainerConstants; import top.continew.admin.common.constant.ContainerConstants;
import java.io.Serial; import java.io.Serial;
@@ -43,14 +43,14 @@ public class OnlineUserResp implements Serializable {
* ID * ID
*/ */
@Schema(description = "ID", example = "1") @Schema(description = "ID", example = "1")
@Assemble(container = ContainerConstants.USER_NICKNAME, props = @Mapping(ref = "nickname")) @Assemble(prop = ":nickname", container = ContainerConstants.USER_NICKNAME)
private Long id; private Long id;
/** /**
* 令牌 * 令牌
*/ */
@Schema(description = "令牌", example = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjEsInJuU3RyIjoiTUd6djdyOVFoeHEwdVFqdFAzV3M5YjVJRzh4YjZPSEUifQ.7q7U3ouoN7WPhH2kUEM7vPe5KF3G_qavSG-vRgIxKvE") @Schema(description = "令牌", example = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjEsInJuU3RyIjoiTUd6djdyOVFoeHEwdVFqdFAzV3M5YjVJRzh4YjZPSEUifQ.7q7U3ouoN7WPhH2kUEM7vPe5KF3G_qavSG-vRgIxKvE")
@Assemble(container = ContainerConstants.ONLINE_USER_LAST_ACTIVE_TIME, props = @Mapping(ref = "lastActiveTime")) @AssembleMethod(prop = ":lastActiveTime", targetType = OnlineUserService.class, method = @ContainerMethod(bindMethod = "getLastActiveTime", type = MappingType.ORDER_OF_KEYS))
private String token; private String token;
/** /**

View File

@@ -17,8 +17,6 @@
package top.continew.admin.auth.service.impl; package top.continew.admin.auth.service.impl;
import cn.crane4j.annotation.AutoOperate; import cn.crane4j.annotation.AutoOperate;
import cn.crane4j.annotation.ContainerMethod;
import cn.crane4j.annotation.MappingType;
import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
@@ -30,7 +28,6 @@ import org.springframework.stereotype.Service;
import top.continew.admin.auth.model.query.OnlineUserQuery; import top.continew.admin.auth.model.query.OnlineUserQuery;
import top.continew.admin.auth.model.resp.OnlineUserResp; import top.continew.admin.auth.model.resp.OnlineUserResp;
import top.continew.admin.auth.service.OnlineUserService; import top.continew.admin.auth.service.OnlineUserService;
import top.continew.admin.common.constant.ContainerConstants;
import top.continew.admin.common.model.dto.LoginUser; import top.continew.admin.common.model.dto.LoginUser;
import top.continew.admin.common.util.helper.LoginHelper; import top.continew.admin.common.util.helper.LoginHelper;
import top.continew.starter.core.constant.StringConstants; import top.continew.starter.core.constant.StringConstants;
@@ -84,7 +81,6 @@ public class OnlineUserServiceImpl implements OnlineUserService {
} }
@Override @Override
@ContainerMethod(namespace = ContainerConstants.ONLINE_USER_LAST_ACTIVE_TIME, type = MappingType.ORDER_OF_KEYS)
public LocalDateTime getLastActiveTime(String token) { public LocalDateTime getLastActiveTime(String token) {
long lastActiveTime = StpUtil.getStpLogic().getTokenLastActiveTime(token); long lastActiveTime = StpUtil.getStpLogic().getTokenLastActiveTime(token);
return lastActiveTime == SaTokenDao.NOT_VALUE_EXPIRE ? null : DateUtil.date(lastActiveTime).toLocalDateTime(); return lastActiveTime == SaTokenDao.NOT_VALUE_EXPIRE ? null : DateUtil.date(lastActiveTime).toLocalDateTime();

View File

@@ -59,7 +59,7 @@ public class DeptResp extends BaseDetailResp {
*/ */
@Schema(description = "上级部门 ID", example = "2") @Schema(description = "上级部门 ID", example = "2")
@ConditionOnExpression(value = "#target.parentId != 0") @ConditionOnExpression(value = "#target.parentId != 0")
@AssembleMethod(targetType = DeptService.class, method = @ContainerMethod(bindMethod = "get", resultType = DeptResp.class), props = @Mapping(src = "name", ref = "parentName")) @AssembleMethod(props = @Mapping(src = "name", ref = "parentName"), targetType = DeptService.class, method = @ContainerMethod(bindMethod = "get", resultType = DeptResp.class))
@ExcelProperty(value = "上级部门 ID", order = 3) @ExcelProperty(value = "上级部门 ID", order = 3)
private Long parentId; private Long parentId;

View File

@@ -17,7 +17,6 @@
package top.continew.admin.system.model.resp; package top.continew.admin.system.model.resp;
import cn.crane4j.annotation.Assemble; import cn.crane4j.annotation.Assemble;
import cn.crane4j.annotation.Mapping;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@@ -81,7 +80,7 @@ public class MessageResp implements Serializable {
* 创建人 * 创建人
*/ */
@JsonIgnore @JsonIgnore
@Assemble(container = ContainerConstants.USER_NICKNAME, props = @Mapping(ref = "createUserString")) @Assemble(prop = ":createUserString", container = ContainerConstants.USER_NICKNAME)
private Long createUser; private Long createUser;
/** /**

View File

@@ -16,14 +16,15 @@
package top.continew.admin.system.model.resp; package top.continew.admin.system.model.resp;
import cn.crane4j.annotation.Assemble; import cn.crane4j.annotation.AssembleMethod;
import cn.crane4j.annotation.Mapping; import cn.crane4j.annotation.ContainerMethod;
import cn.crane4j.annotation.MappingType;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import top.continew.admin.common.constant.ContainerConstants;
import top.continew.admin.common.enums.DataScopeEnum; import top.continew.admin.common.enums.DataScopeEnum;
import top.continew.admin.system.service.RoleDeptService;
import top.continew.starter.extension.crud.converter.ExcelBaseEnumConverter; import top.continew.starter.extension.crud.converter.ExcelBaseEnumConverter;
import top.continew.starter.extension.crud.model.resp.BaseDetailResp; import top.continew.starter.extension.crud.model.resp.BaseDetailResp;
@@ -39,7 +40,7 @@ import java.util.List;
@Data @Data
@ExcelIgnoreUnannotated @ExcelIgnoreUnannotated
@Schema(description = "角色详情信息") @Schema(description = "角色详情信息")
@Assemble(container = ContainerConstants.ROLE_DEPT_ID_LIST, key = "id", props = @Mapping(ref = "deptIds")) @AssembleMethod(key = "id", prop = ":deptIds", targetType = RoleDeptService.class, method = @ContainerMethod(bindMethod = "listDeptIdByRoleId", type = MappingType.ORDER_OF_KEYS))
public class RoleDetailResp extends BaseDetailResp { public class RoleDetailResp extends BaseDetailResp {
@Serial @Serial

View File

@@ -20,6 +20,7 @@ import cn.crane4j.annotation.Assemble;
import cn.crane4j.annotation.AssembleMethod; import cn.crane4j.annotation.AssembleMethod;
import cn.crane4j.annotation.ContainerMethod; import cn.crane4j.annotation.ContainerMethod;
import cn.crane4j.annotation.Mapping; import cn.crane4j.annotation.Mapping;
import cn.crane4j.core.executor.handler.ManyToManyAssembleOperationHandler;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@@ -46,7 +47,7 @@ import java.util.Objects;
@Data @Data
@ExcelIgnoreUnannotated @ExcelIgnoreUnannotated
@Schema(description = "用户详情信息") @Schema(description = "用户详情信息")
@Assemble(container = ContainerConstants.USER_ROLE_ID_LIST, key = "id", props = @Mapping(ref = "roleIds")) @Assemble(key = "id", prop = ":roleIds", container = ContainerConstants.USER_ROLE_ID_LIST)
public class UserDetailResp extends BaseDetailResp { public class UserDetailResp extends BaseDetailResp {
@Serial @Serial
@@ -125,7 +126,7 @@ public class UserDetailResp extends BaseDetailResp {
* 部门 ID * 部门 ID
*/ */
@Schema(description = "部门 ID", example = "5") @Schema(description = "部门 ID", example = "5")
@AssembleMethod(targetType = DeptService.class, method = @ContainerMethod(bindMethod = "get", resultType = DeptResp.class), props = @Mapping(src = "name", ref = "deptName")) @AssembleMethod(props = @Mapping(src = "name", ref = "deptName"), targetType = DeptService.class, method = @ContainerMethod(bindMethod = "get", resultType = DeptResp.class))
private Long deptId; private Long deptId;
/** /**
@@ -139,14 +140,15 @@ public class UserDetailResp extends BaseDetailResp {
* 角色 ID 列表 * 角色 ID 列表
*/ */
@Schema(description = "角色 ID 列表", example = "2") @Schema(description = "角色 ID 列表", example = "2")
@Assemble(prop = ":roleNames", container = ContainerConstants.USER_ROLE_NAME_LIST, handlerType = ManyToManyAssembleOperationHandler.class)
private List<Long> roleIds; private List<Long> roleIds;
/** /**
* 角色 * 角色名称列表
*/ */
@Schema(description = "角色", example = "测试人员") @Schema(description = "角色名称列表", example = "测试人员")
@ExcelProperty(value = "角色") @ExcelProperty(value = "角色")
private String roleNames; private List<String> roleNames;
@Override @Override
public Boolean getDisabled() { public Boolean getDisabled() {

View File

@@ -16,11 +16,14 @@
package top.continew.admin.system.model.resp; package top.continew.admin.system.model.resp;
import cn.crane4j.annotation.Assemble;
import cn.crane4j.annotation.AssembleMethod; import cn.crane4j.annotation.AssembleMethod;
import cn.crane4j.annotation.ContainerMethod; import cn.crane4j.annotation.ContainerMethod;
import cn.crane4j.annotation.Mapping; import cn.crane4j.annotation.Mapping;
import cn.crane4j.core.executor.handler.ManyToManyAssembleOperationHandler;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import top.continew.admin.common.constant.ContainerConstants;
import top.continew.admin.common.enums.DisEnableStatusEnum; import top.continew.admin.common.enums.DisEnableStatusEnum;
import top.continew.admin.common.enums.GenderEnum; import top.continew.admin.common.enums.GenderEnum;
import top.continew.admin.common.util.helper.LoginHelper; import top.continew.admin.common.util.helper.LoginHelper;
@@ -30,6 +33,7 @@ import top.continew.starter.security.mask.annotation.JsonMask;
import top.continew.starter.security.mask.enums.MaskType; import top.continew.starter.security.mask.enums.MaskType;
import java.io.Serial; import java.io.Serial;
import java.util.List;
import java.util.Objects; import java.util.Objects;
/** /**
@@ -40,6 +44,7 @@ import java.util.Objects;
*/ */
@Data @Data
@Schema(description = "用户信息") @Schema(description = "用户信息")
@Assemble(key = "id", prop = ":roleIds", container = ContainerConstants.USER_ROLE_ID_LIST)
public class UserResp extends BaseDetailResp { public class UserResp extends BaseDetailResp {
@Serial @Serial
@@ -105,7 +110,7 @@ public class UserResp extends BaseDetailResp {
* 部门 ID * 部门 ID
*/ */
@Schema(description = "部门 ID", example = "5") @Schema(description = "部门 ID", example = "5")
@AssembleMethod(targetType = DeptService.class, method = @ContainerMethod(bindMethod = "get", resultType = DeptResp.class), props = @Mapping(src = "name", ref = "deptName")) @AssembleMethod(props = @Mapping(src = "name", ref = "deptName"), targetType = DeptService.class, method = @ContainerMethod(bindMethod = "get", resultType = DeptResp.class))
private Long deptId; private Long deptId;
/** /**
@@ -114,6 +119,19 @@ public class UserResp extends BaseDetailResp {
@Schema(description = "所属部门", example = "测试部") @Schema(description = "所属部门", example = "测试部")
private String deptName; private String deptName;
/**
* 角色 ID 列表
*/
@Schema(description = "角色 ID 列表", example = "2")
@Assemble(prop = ":roleNames", container = ContainerConstants.USER_ROLE_NAME_LIST, handlerType = ManyToManyAssembleOperationHandler.class)
private List<Long> roleIds;
/**
* 角色名称列表
*/
@Schema(description = "角色名称列表", example = "测试人员")
private List<String> roleNames;
@Override @Override
public Boolean getDisabled() { public Boolean getDisabled() {
return this.getIsSystem() || Objects.equals(this.getId(), LoginHelper.getUserId()); return this.getIsSystem() || Objects.equals(this.getId(), LoginHelper.getUserId());

View File

@@ -17,7 +17,6 @@
package top.continew.admin.system.model.resp.log; package top.continew.admin.system.model.resp.log;
import cn.crane4j.annotation.Assemble; import cn.crane4j.annotation.Assemble;
import cn.crane4j.annotation.Mapping;
import cn.crane4j.annotation.condition.ConditionOnPropertyNotNull; import cn.crane4j.annotation.condition.ConditionOnPropertyNotNull;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@@ -155,7 +154,7 @@ public class LogDetailResp implements Serializable {
*/ */
@JsonIgnore @JsonIgnore
@ConditionOnPropertyNotNull @ConditionOnPropertyNotNull
@Assemble(container = ContainerConstants.USER_NICKNAME, props = @Mapping(ref = "createUserString")) @Assemble(prop = ":createUserString", container = ContainerConstants.USER_NICKNAME)
private Long createUser; private Long createUser;
/** /**

View File

@@ -16,13 +16,10 @@
package top.continew.admin.system.service.impl; package top.continew.admin.system.service.impl;
import cn.crane4j.annotation.ContainerMethod;
import cn.crane4j.annotation.MappingType;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import top.continew.admin.common.constant.ContainerConstants;
import top.continew.admin.system.mapper.RoleDeptMapper; import top.continew.admin.system.mapper.RoleDeptMapper;
import top.continew.admin.system.model.entity.RoleDeptDO; import top.continew.admin.system.model.entity.RoleDeptDO;
import top.continew.admin.system.service.RoleDeptService; import top.continew.admin.system.service.RoleDeptService;
@@ -75,7 +72,6 @@ public class RoleDeptServiceImpl implements RoleDeptService {
} }
@Override @Override
@ContainerMethod(namespace = ContainerConstants.ROLE_DEPT_ID_LIST, type = MappingType.ORDER_OF_KEYS)
public List<Long> listDeptIdByRoleId(Long roleId) { public List<Long> listDeptIdByRoleId(Long roleId) {
return baseMapper.selectDeptIdByRoleId(roleId); return baseMapper.selectDeptIdByRoleId(roleId);
} }

View File

@@ -16,6 +16,8 @@
package top.continew.admin.system.service.impl; package top.continew.admin.system.service.impl;
import cn.crane4j.annotation.ContainerMethod;
import cn.crane4j.annotation.MappingType;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
@@ -25,6 +27,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import top.continew.admin.auth.service.OnlineUserService; import top.continew.admin.auth.service.OnlineUserService;
import top.continew.admin.common.constant.CacheConstants; import top.continew.admin.common.constant.CacheConstants;
import top.continew.admin.common.constant.ContainerConstants;
import top.continew.admin.common.constant.SysConstants; import top.continew.admin.common.constant.SysConstants;
import top.continew.admin.common.enums.DataScopeEnum; import top.continew.admin.common.enums.DataScopeEnum;
import top.continew.admin.common.model.dto.RoleDTO; import top.continew.admin.common.model.dto.RoleDTO;
@@ -142,6 +145,7 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleRes
} }
@Override @Override
@ContainerMethod(namespace = ContainerConstants.USER_ROLE_NAME_LIST, type = MappingType.ORDER_OF_KEYS)
public List<String> listNameByIds(List<Long> ids) { public List<String> listNameByIds(List<Long> ids) {
List<RoleDO> roleList = baseMapper.lambdaQuery().select(RoleDO::getName).in(RoleDO::getId, ids).list(); List<RoleDO> roleList = baseMapper.lambdaQuery().select(RoleDO::getName).in(RoleDO::getId, ids).list();
return roleList.stream().map(RoleDO::getName).toList(); return roleList.stream().map(RoleDO::getName).toList();

View File

@@ -79,7 +79,6 @@ import static top.continew.admin.system.enums.PasswordPolicyEnum.*;
public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserResp, UserDetailResp, UserQuery, UserReq> implements UserService, CommonUserService { public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserResp, UserDetailResp, UserQuery, UserReq> implements UserService, CommonUserService {
private final OnlineUserService onlineUserService; private final OnlineUserService onlineUserService;
private final RoleService roleService;
private final UserRoleService userRoleService; private final UserRoleService userRoleService;
private final FileService fileService; private final FileService fileService;
private final FileStorageService fileStorageService; private final FileStorageService fileStorageService;
@@ -283,17 +282,6 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserRes
return baseMapper.selectNicknameById(id); return baseMapper.selectNicknameById(id);
} }
@Override
protected void fill(Object obj) {
super.fill(obj);
if (obj instanceof UserDetailResp detail) {
List<Long> roleIdList = detail.getRoleIds();
if (CollUtil.isNotEmpty(roleIdList)) {
detail.setRoleNames(String.join(StringConstants.CHINESE_COMMA, roleService.listNameByIds(roleIdList)));
}
}
}
@Override @Override
protected QueryWrapper<UserDO> buildQueryWrapper(UserQuery query) { protected QueryWrapper<UserDO> buildQueryWrapper(UserQuery query) {
String description = query.getDescription(); String description = query.getDescription();