diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index 93d0ca16df..820c132065 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -18,14 +18,15 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import java.util.Collections; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -34,6 +35,7 @@ import java.util.Map; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - 用户") @RestController @@ -112,6 +114,20 @@ public class UserController { pageResult.getTotal())); } + @GetMapping("/list") + @Operation(summary = "获得用户详情列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "[1024]") + @PreAuthorize("@ss.hasPermission('system:user:query')") + public CommonResult> getUserList(@RequestParam("ids") List ids) { + List list = userService.getUserList(ids); + if (CollUtil.isEmpty(list)) { + return success(Collections.emptyList()); + } + // 拼接数据 + Map deptMap = deptService.getDeptMap(convertSet(list, AdminUserDO::getDeptId)); + return success(UserConvert.INSTANCE.convertList(list, deptMap)); + } + @GetMapping({"/list-all-simple", "/simple-list"}) @Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项") public CommonResult> getSimpleUserList() { diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java index d4a6ce6d67..c3c346a667 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java @@ -6,7 +6,9 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.time.LocalDateTime; import java.util.List; @@ -37,4 +39,14 @@ public interface OAuth2AccessTokenMapper extends BaseMapperX { @@ -19,4 +23,13 @@ public interface OAuth2RefreshTokenMapper extends BaseMapperX getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO); + /** + * 清理过期 exceedDay 天的刷新令牌 + * + * @param exceedDay 过期多少天就进行清理 + * @param deleteLimit 清理的间隔条数 + */ + Integer cleanRefreshToken(Integer exceedDay, Integer deleteLimit); + + /** + * 清理过期 exceedDay 天的访问令牌 + * + * @param exceedDay 过期多少天就进行清理 + * @param deleteLimit 清理的间隔条数 + */ + Integer cleanAccessToken(Integer exceedDay, Integer deleteLimit); } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImpl.java index dc70874cf0..b216832716 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImpl.java @@ -151,6 +151,7 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { oauth2AccessTokenRedisDAO.delete(accessToken); // 删除刷新令牌 oauth2RefreshTokenMapper.deleteByRefreshToken(accessTokenDO.getRefreshToken()); + oauth2AccessTokenRedisDAO.delete(accessTokenDO.getRefreshToken()); return accessTokenDO; } @@ -166,6 +167,7 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { oauth2AccessTokenRedisDAO.delete(accessToken.getAccessToken()); // 删除刷新令牌 oauth2RefreshTokenMapper.deleteByRefreshToken(accessToken.getRefreshToken()); + oauth2AccessTokenRedisDAO.delete(accessToken.getRefreshToken()); }); } @@ -241,4 +243,35 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { return IdUtil.fastSimpleUUID(); } + @Override + public Integer cleanRefreshToken(Integer exceedDay, Integer deleteLimit) { + int count = 0; + LocalDateTime expireDate = LocalDateTime.now().minusDays(exceedDay); + // 循环删除,直到没有满足条件的数据 + for (int i = 0; i < Short.MAX_VALUE; i++) { + int deleteCount = oauth2RefreshTokenMapper.deleteByExpiresTimeLt(expireDate, deleteLimit); + count += deleteCount; + // 达到删除预期条数,说明到底了 + if (deleteCount < deleteLimit) { + break; + } + } + return count; + } + + @Override + public Integer cleanAccessToken(Integer exceedDay, Integer deleteLimit) { + int count = 0; + LocalDateTime expireDate = LocalDateTime.now().minusDays(exceedDay); + // 循环删除,直到没有满足条件的数据 + for (int i = 0; i < Short.MAX_VALUE; i++) { + int deleteCount = oauth2AccessTokenMapper.deleteByExpiresTimeLt(expireDate, deleteLimit); + count += deleteCount; + // 达到删除预期条数,说明到底了 + if (deleteCount < deleteLimit) { + break; + } + } + return count; + } }