upd: 编码规范

This commit is contained in:
2025-03-27 20:13:32 +08:00
parent d8c9e84465
commit 66903f1556
26 changed files with 161 additions and 170 deletions
@@ -0,0 +1,26 @@
package cn.odboy.constant;
/**
* 常用静态常量
*/
public class SystemConst {
/**
* win 系统
*/
public static final String WIN = "win";
/**
* mac 系统
*/
public static final String MAC = "mac";
/**
* 请求头名称
*/
public static final String HEADER_NAME = "Authorization";
/**
* Token前缀
*/
public static final String TOKEN_PREFIX = "Bearer";
}
@@ -1,16 +0,0 @@
package cn.odboy.constant;
/**
* 常用静态常量
*/
public class SystemConstant {
/**
* win 系统
*/
public static final String WIN = "win";
/**
* mac 系统
*/
public static final String MAC = "mac";
}
@@ -1,6 +1,6 @@
package cn.odboy.properties;
import cn.odboy.constant.SystemConstant;
import cn.odboy.constant.SystemConst;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@@ -28,9 +28,9 @@ public class FileProperties {
public ElPath getPath() {
String os = System.getProperty("os.name");
if (os.toLowerCase().startsWith(SystemConstant.WIN)) {
if (os.toLowerCase().startsWith(SystemConst.WIN)) {
return windows;
} else if (os.toLowerCase().startsWith(SystemConstant.MAC)) {
} else if (os.toLowerCase().startsWith(SystemConst.MAC)) {
return mac;
}
return linux;
@@ -1,6 +1,8 @@
package cn.odboy.server;
import cn.odboy.constant.SystemConst;
import cn.odboy.util.AnonTagUtil;
import cn.odboy.util.SecurityUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
@@ -38,9 +40,6 @@ public class SwaggerConfig {
@Value("${server.servlet.context-path:}")
private String apiPath;
@Value("${jwt.header}")
private String tokenHeader;
@Value("${swagger.enabled}")
private Boolean enabled;
@@ -72,7 +71,7 @@ public class SwaggerConfig {
private List<SecurityScheme> securitySchemes() {
//设置请求头信息
List<SecurityScheme> securitySchemes = new ArrayList<>();
ApiKey apiKey = new ApiKey(tokenHeader, tokenHeader, "header");
ApiKey apiKey = new ApiKey(SystemConst.HEADER_NAME, SystemConst.HEADER_NAME, "header");
securitySchemes.add(apiKey);
return securitySchemes;
}
@@ -101,7 +100,7 @@ public class SwaggerConfig {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
securityReferences.add(new SecurityReference(tokenHeader, authorizationScopes));
securityReferences.add(new SecurityReference(SystemConst.HEADER_NAME, authorizationScopes));
return securityReferences;
}
@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.odboy.constant.DataScopeEnum;
import cn.odboy.constant.SystemConst;
import cn.odboy.context.SpringBeanHolder;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
@@ -26,15 +27,6 @@ import java.util.Objects;
@Slf4j
@Component
public class SecurityUtil {
/**
* 请求头名称
*/
public static final String HEADER = "Authorization";
/**
* Token前缀
*/
public static final String TOKEN_PREFIX = "Bearer";
/**
* 获取当前登录的用户
*
@@ -117,10 +109,10 @@ public class SecurityUtil {
public static String getToken() {
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder
.getRequestAttributes())).getRequest();
String bearerToken = request.getHeader(HEADER);
if (bearerToken != null && bearerToken.startsWith(TOKEN_PREFIX)) {
String bearerToken = request.getHeader(SystemConst.HEADER_NAME);
if (bearerToken != null && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) {
// 去掉令牌前缀
return bearerToken.replace(TOKEN_PREFIX, "");
return bearerToken.replace(SystemConst.TOKEN_PREFIX, "");
} else {
log.debug("非法Token:{}", bearerToken);
}
@@ -12,7 +12,7 @@ import org.springframework.security.core.GrantedAuthority;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AuthorityDto implements GrantedAuthority {
public class RoleCodeDto implements GrantedAuthority {
@ApiModelProperty(value = "角色名")
private String authority;
@@ -8,7 +8,7 @@ import javax.validation.constraints.NotBlank;
@Getter
@Setter
public class AuthUserDto {
public class UserAuthDto {
@NotBlank
@ApiModelProperty(value = "用户名")
@@ -13,7 +13,7 @@ import java.util.stream.Collectors;
@Getter
@AllArgsConstructor
public class JwtUserDto implements UserDetails {
public class UserJwtDto implements UserDetails {
@ApiModelProperty(value = "用户")
private final User user;
@@ -22,10 +22,10 @@ public class JwtUserDto implements UserDetails {
private final List<Long> dataScopes;
@ApiModelProperty(value = "角色")
private final List<AuthorityDto> authorities;
private final List<RoleCodeDto> authorities;
public Set<String> getRoles() {
return authorities.stream().map(AuthorityDto::getAuthority).collect(Collectors.toSet());
return authorities.stream().map(RoleCodeDto::getAuthority).collect(Collectors.toSet());
}
@Override
@@ -40,20 +40,20 @@ public class JwtUserDto implements UserDetails {
return user.getUsername();
}
@JSONField(serialize = false)
@Override
@JSONField(serialize = false)
public boolean isAccountNonExpired() {
return true;
}
@JSONField(serialize = false)
@Override
@JSONField(serialize = false)
public boolean isAccountNonLocked() {
return true;
}
@JSONField(serialize = false)
@Override
@JSONField(serialize = false)
public boolean isCredentialsNonExpired() {
return true;
}
@@ -9,7 +9,7 @@ import java.util.Date;
* 在线用户
*/
@Data
public class OnlineUserDto {
public class UserOnlineDto {
@ApiModelProperty(value = "Token编号")
private String uid;
@@ -1,5 +1,6 @@
package cn.odboy.application.core.config;
import cn.odboy.util.SecurityUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@@ -11,17 +12,6 @@ import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "jwt")
public class SecurityProperties {
/**
* Request Headers : Authorization
*/
private String header;
/**
* 令牌前缀,最后留个空格 Bearer
*/
private String tokenStartWith;
/**
* 必须使用最少88位的Base64对该令牌进行编码
*/
@@ -41,8 +31,4 @@ public class SecurityProperties {
* 续期时间
*/
private Long renew;
public String getTokenStartWith() {
return tokenStartWith + " ";
}
}
@@ -4,7 +4,7 @@ import cn.odboy.application.core.context.JwtAccessDeniedHandler;
import cn.odboy.application.core.context.JwtAuthenticationEntryPoint;
import cn.odboy.application.core.context.TokenConfigurer;
import cn.odboy.application.core.context.TokenProvider;
import cn.odboy.application.core.service.impl.OnlineUserServiceImpl;
import cn.odboy.application.core.service.impl.UserOnlineServiceImpl;
import cn.odboy.constant.RequestMethodEnum;
import cn.odboy.util.AnonTagUtil;
import lombok.RequiredArgsConstructor;
@@ -36,7 +36,7 @@ public class SpringSecurityConfig {
private final JwtAccessDeniedHandler jwtAccessDeniedHandler;
private final ApplicationContext applicationContext;
private final SecurityProperties securityProperties;
private final OnlineUserServiceImpl onlineUserService;
private final UserOnlineServiceImpl onlineUserService;
@Bean
GrantedAuthorityDefaults grantedAuthorityDefaults() {
@@ -1,7 +1,7 @@
package cn.odboy.application.core.context;
import cn.odboy.application.core.config.SecurityProperties;
import cn.odboy.application.core.service.impl.OnlineUserServiceImpl;
import cn.odboy.application.core.service.impl.UserOnlineServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -13,7 +13,7 @@ public class TokenConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFi
private final TokenProvider tokenProvider;
private final SecurityProperties properties;
private final OnlineUserServiceImpl onlineUserService;
private final UserOnlineServiceImpl onlineUserService;
@Override
public void configure(HttpSecurity http) {
@@ -2,8 +2,10 @@ package cn.odboy.application.core.context;
import cn.hutool.core.util.StrUtil;
import cn.odboy.application.core.config.SecurityProperties;
import cn.odboy.application.core.service.impl.OnlineUserServiceImpl;
import cn.odboy.model.system.dto.OnlineUserDto;
import cn.odboy.application.core.service.impl.UserOnlineServiceImpl;
import cn.odboy.constant.SystemConst;
import cn.odboy.model.system.dto.UserOnlineDto;
import cn.odboy.util.SecurityUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
@@ -22,14 +24,14 @@ public class TokenFilter extends GenericFilterBean {
private final TokenProvider tokenProvider;
private final SecurityProperties properties;
private final OnlineUserServiceImpl onlineUserService;
private final UserOnlineServiceImpl onlineUserService;
/**
* @param tokenProvider Token
* @param properties JWT
* @param onlineUserService 用户在线
*/
public TokenFilter(TokenProvider tokenProvider, SecurityProperties properties, OnlineUserServiceImpl onlineUserService) {
public TokenFilter(TokenProvider tokenProvider, SecurityProperties properties, UserOnlineServiceImpl onlineUserService) {
this.properties = properties;
this.onlineUserService = onlineUserService;
this.tokenProvider = tokenProvider;
@@ -43,9 +45,9 @@ public class TokenFilter extends GenericFilterBean {
if (StrUtil.isNotBlank(token)) {
// 获取用户Token的Key
String loginKey = tokenProvider.loginKey(token);
OnlineUserDto onlineUserDto = onlineUserService.getOnlineUserByKey(loginKey);
UserOnlineDto userOnlineDto = onlineUserService.getOnlineUserByKey(loginKey);
// 判断用户在线信息是否为空
if (onlineUserDto != null) {
if (userOnlineDto != null) {
// Token 续期判断
tokenProvider.checkRenewal(token);
// 获取认证信息,设置上下文
@@ -63,10 +65,10 @@ public class TokenFilter extends GenericFilterBean {
* @return /
*/
private String resolveToken(HttpServletRequest request) {
String bearerToken = request.getHeader(properties.getHeader());
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(properties.getTokenStartWith())) {
String bearerToken = request.getHeader(SystemConst.HEADER_NAME);
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) {
// 去掉令牌前缀
return bearerToken.replace(properties.getTokenStartWith(), "");
return bearerToken.replace(SystemConst.TOKEN_PREFIX + " ", "");
} else {
log.debug("非法Token:{}", bearerToken);
}
@@ -4,9 +4,11 @@ import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.odboy.application.core.config.SecurityProperties;
import cn.odboy.constant.SystemConst;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.model.system.dto.JwtUserDto;
import cn.odboy.model.system.dto.UserJwtDto;
import cn.odboy.util.RedisUtil;
import cn.odboy.util.SecurityUtil;
import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
@@ -57,7 +59,7 @@ public class TokenProvider implements InitializingBean {
* @param user /
* @return /
*/
public String createToken(JwtUserDto user) {
public String createToken(UserJwtDto user) {
// 设置参数
Map<String, Object> claims = new HashMap<>(6);
// 设置用户ID
@@ -106,8 +108,8 @@ public class TokenProvider implements InitializingBean {
}
public String getToken(HttpServletRequest request) {
final String requestHeader = request.getHeader(properties.getHeader());
if (requestHeader != null && requestHeader.startsWith(properties.getTokenStartWith())) {
final String requestHeader = request.getHeader(SystemConst.HEADER_NAME);
if (requestHeader != null && requestHeader.startsWith(SystemConst.TOKEN_PREFIX)) {
return requestHeader.substring(7);
}
return null;
@@ -6,8 +6,8 @@ import cn.odboy.application.system.service.RoleService;
import cn.odboy.application.system.service.UserService;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.AuthorityDto;
import cn.odboy.model.system.dto.JwtUserDto;
import cn.odboy.model.system.dto.RoleCodeDto;
import cn.odboy.model.system.dto.UserJwtDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.userdetails.UserDetailsService;
@@ -25,9 +25,9 @@ public class UserDetailsHelper implements UserDetailsService {
private final UserCacheService userCacheService;
@Override
public JwtUserDto loadUserByUsername(String username) {
JwtUserDto jwtUserDto = userCacheService.getUserCacheByUsername(username);
if (jwtUserDto == null) {
public UserJwtDto loadUserByUsername(String username) {
UserJwtDto userJwtDto = userCacheService.getUserCacheByUsername(username);
if (userJwtDto == null) {
User user = userService.getUserByUsername(username);
if (user == null) {
throw new BadRequestException("用户不存在");
@@ -36,13 +36,13 @@ public class UserDetailsHelper implements UserDetailsService {
throw new BadRequestException("账号未激活!");
}
// 获取用户的权限
List<AuthorityDto> authorities = roleService.buildPermissions(user);
List<RoleCodeDto> authorities = roleService.buildPermissions(user);
// 初始化JwtUserDto
jwtUserDto = new JwtUserDto(user, dataService.selectDeptIdByUserIdWithDeptId(user), authorities);
userJwtDto = new UserJwtDto(user, dataService.selectDeptIdByUserIdWithDeptId(user), authorities);
// 添加缓存数据
userCacheService.addUserCache(username, jwtUserDto);
userCacheService.addUserCache(username, userJwtDto);
}
}
return jwtUserDto;
return userJwtDto;
}
}
@@ -10,14 +10,15 @@ import cn.odboy.application.core.config.SecurityProperties;
import cn.odboy.application.core.constant.LoginCodeEnum;
import cn.odboy.application.core.context.TokenProvider;
import cn.odboy.application.core.context.UserDetailsHelper;
import cn.odboy.application.core.service.impl.OnlineUserServiceImpl;
import cn.odboy.application.core.service.impl.UserOnlineServiceImpl;
import cn.odboy.constant.SystemConst;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.dto.AuthUserDto;
import cn.odboy.model.system.dto.JwtUserDto;
import cn.odboy.model.system.dto.UserAuthDto;
import cn.odboy.model.system.dto.UserJwtDto;
import cn.odboy.properties.RsaProperties;
import cn.odboy.util.RedisUtil;
import cn.odboy.util.RSAEncryptUtil;
import cn.odboy.util.RedisUtil;
import cn.odboy.util.SecurityUtil;
import cn.odboy.util.StringUtil;
import com.wf.captcha.base.Captcha;
@@ -54,7 +55,7 @@ import java.util.concurrent.TimeUnit;
public class AuthController {
private final SecurityProperties properties;
private final RedisUtil redisUtil;
private final OnlineUserServiceImpl onlineUserService;
private final UserOnlineServiceImpl onlineUserService;
private final TokenProvider tokenProvider;
private final CaptchaConfig captchaConfig;
private final LoginProperties loginProperties;
@@ -63,7 +64,7 @@ public class AuthController {
@ApiOperation("登录授权")
@AnonymousPostMapping(value = "/login")
public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception {
public ResponseEntity<Object> login(@Validated @RequestBody UserAuthDto authUser, HttpServletRequest request) throws Exception {
// 密码解密
String password = RSAEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword());
// 查询验证码
@@ -77,7 +78,7 @@ public class AuthController {
throw new BadRequestException("验证码错误");
}
// 获取用户信息
JwtUserDto jwtUser = userDetailsService.loadUserByUsername(authUser.getUsername());
UserJwtDto jwtUser = userDetailsService.loadUserByUsername(authUser.getUsername());
// 验证用户密码
if (!passwordEncoder.matches(password, jwtUser.getPassword())) {
throw new BadRequestException("登录密码错误");
@@ -87,8 +88,8 @@ public class AuthController {
// 生成令牌
String token = tokenProvider.createToken(jwtUser);
// 返回 token 与 用户信息
Map<String, Object> authInfo = new HashMap<String, Object>(2) {{
put("token", properties.getTokenStartWith() + token);
Map<String, Object> authInfo = new HashMap<>(2) {{
put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token));
put("user", jwtUser);
}};
if (loginProperties.isSingleLogin()) {
@@ -104,7 +105,7 @@ public class AuthController {
@ApiOperation("获取用户信息")
@GetMapping(value = "/info")
public ResponseEntity<UserDetails> getUserInfo() {
JwtUserDto jwtUser = (JwtUserDto) SecurityUtil.getCurrentUser();
UserJwtDto jwtUser = (UserJwtDto) SecurityUtil.getCurrentUser();
return ResponseEntity.ok(jwtUser);
}
@@ -1,8 +1,8 @@
package cn.odboy.application.core.rest;
import cn.odboy.application.core.service.OnlineUserService;
import cn.odboy.application.core.service.UserOnlineService;
import cn.odboy.base.PageResult;
import cn.odboy.model.system.dto.OnlineUserDto;
import cn.odboy.model.system.dto.UserOnlineDto;
import cn.odboy.util.DESEncryptUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -23,20 +23,20 @@ import java.util.Set;
@RequestMapping("/auth/online")
@Api(tags = "系统:在线用户管理")
public class OnlineController {
private final OnlineUserService onlineUserService;
private final UserOnlineService userOnlineService;
@ApiOperation("查询在线用户")
@GetMapping
@PreAuthorize("@el.check()")
public ResponseEntity<PageResult<OnlineUserDto>> queryOnlineUser(String username, Pageable pageable) {
return new ResponseEntity<>(onlineUserService.queryOnlineUserPage(username, pageable), HttpStatus.OK);
public ResponseEntity<PageResult<UserOnlineDto>> queryOnlineUser(String username, Pageable pageable) {
return new ResponseEntity<>(userOnlineService.queryOnlineUserPage(username, pageable), HttpStatus.OK);
}
@ApiOperation("导出数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check()")
public void exportOnlineUser(HttpServletResponse response, String username) throws IOException {
onlineUserService.downloadExcel(onlineUserService.selectOnlineUserByUsername(username), response);
userOnlineService.downloadExcel(userOnlineService.selectOnlineUserByUsername(username), response);
}
@ApiOperation("踢出用户")
@@ -46,7 +46,7 @@ public class OnlineController {
for (String token : keys) {
// 解密Key
token = DESEncryptUtil.desDecrypt(token);
onlineUserService.logoutByToken(token);
userOnlineService.logoutByToken(token);
}
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -1,6 +1,6 @@
package cn.odboy.application.core.service;
import cn.odboy.model.system.dto.JwtUserDto;
import cn.odboy.model.system.dto.UserJwtDto;
import org.springframework.scheduling.annotation.Async;
public interface UserCacheService {
@@ -8,9 +8,9 @@ public interface UserCacheService {
* 返回用户缓存
*
* @param username 用户名
* @return JwtUserDto
* @return UserJwtDto
*/
JwtUserDto getUserCacheByUsername(String username);
UserJwtDto getUserCacheByUsername(String username);
/**
* 添加缓存到Redis
@@ -18,7 +18,7 @@ public interface UserCacheService {
* @param userName 用户名
*/
@Async
void addUserCache(String userName, JwtUserDto user);
void addUserCache(String userName, UserJwtDto user);
/**
* 清理用户缓存信息
@@ -1,8 +1,8 @@
package cn.odboy.application.core.service;
import cn.odboy.base.PageResult;
import cn.odboy.model.system.dto.JwtUserDto;
import cn.odboy.model.system.dto.OnlineUserDto;
import cn.odboy.model.system.dto.UserJwtDto;
import cn.odboy.model.system.dto.UserOnlineDto;
import org.springframework.data.domain.Pageable;
import javax.servlet.http.HttpServletRequest;
@@ -10,15 +10,15 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public interface OnlineUserService {
public interface UserOnlineService {
/**
* 保存在线用户信息
*
* @param jwtUserDto /
* @param userJwtDto /
* @param token /
* @param request /
*/
void save(JwtUserDto jwtUserDto, String token, HttpServletRequest request);
void save(UserJwtDto userJwtDto, String token, HttpServletRequest request);
/**
* 查询全部数据
@@ -27,7 +27,7 @@ public interface OnlineUserService {
* @param pageable /
* @return /
*/
PageResult<OnlineUserDto> queryOnlineUserPage(String username, Pageable pageable);
PageResult<UserOnlineDto> queryOnlineUserPage(String username, Pageable pageable);
/**
* 查询全部数据,不分页
@@ -35,7 +35,7 @@ public interface OnlineUserService {
* @param username /
* @return /
*/
List<OnlineUserDto> selectOnlineUserByUsername(String username);
List<UserOnlineDto> selectOnlineUserByUsername(String username);
/**
* 退出登录
@@ -51,7 +51,7 @@ public interface OnlineUserService {
* @param response /
* @throws IOException /
*/
void downloadExcel(List<OnlineUserDto> all, HttpServletResponse response) throws IOException;
void downloadExcel(List<UserOnlineDto> all, HttpServletResponse response) throws IOException;
/**
* 查询用户
@@ -59,7 +59,7 @@ public interface OnlineUserService {
* @param key /
* @return /
*/
OnlineUserDto getOnlineUserByKey(String key);
UserOnlineDto getOnlineUserByKey(String key);
/**
* 根据用户名强退用户
@@ -3,7 +3,7 @@ package cn.odboy.application.core.service.impl;
import cn.hutool.core.util.RandomUtil;
import cn.odboy.application.core.config.LoginProperties;
import cn.odboy.application.core.service.UserCacheService;
import cn.odboy.model.system.dto.JwtUserDto;
import cn.odboy.model.system.dto.UserJwtDto;
import cn.odboy.util.RedisUtil;
import cn.odboy.util.StringUtil;
import org.springframework.stereotype.Service;
@@ -19,19 +19,19 @@ public class UserCacheServiceImpl implements UserCacheService {
private RedisUtil redisUtil;
@Override
public JwtUserDto getUserCacheByUsername(String username) {
public UserJwtDto getUserCacheByUsername(String username) {
// 转小写
username = StringUtil.lowerCase(username);
if (StringUtil.isNotEmpty(username)) {
// 获取数据
return redisUtil.get(LoginProperties.cacheKey + username, JwtUserDto.class);
return redisUtil.get(LoginProperties.cacheKey + username, UserJwtDto.class);
}
return null;
}
@Override
public void addUserCache(String userName, JwtUserDto user) {
public void addUserCache(String userName, UserJwtDto user) {
// 转小写
userName = StringUtil.lowerCase(userName);
if (StringUtil.isNotEmpty(userName)) {
@@ -2,11 +2,11 @@ package cn.odboy.application.core.service.impl;
import cn.odboy.application.core.config.SecurityProperties;
import cn.odboy.application.core.context.TokenProvider;
import cn.odboy.application.core.service.OnlineUserService;
import cn.odboy.application.core.service.UserOnlineService;
import cn.odboy.base.PageResult;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.model.system.dto.JwtUserDto;
import cn.odboy.model.system.dto.OnlineUserDto;
import cn.odboy.model.system.dto.UserJwtDto;
import cn.odboy.model.system.dto.UserOnlineDto;
import cn.odboy.util.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -23,52 +23,52 @@ import java.util.concurrent.TimeUnit;
@Service
@Slf4j
@AllArgsConstructor
public class OnlineUserServiceImpl implements OnlineUserService {
public class UserOnlineServiceImpl implements UserOnlineService {
private final SecurityProperties properties;
private final TokenProvider tokenProvider;
private final RedisUtil redisUtil;
@Override
public void save(JwtUserDto jwtUserDto, String token, HttpServletRequest request) {
String dept = jwtUserDto.getUser().getDept().getName();
public void save(UserJwtDto userJwtDto, String token, HttpServletRequest request) {
String dept = userJwtDto.getUser().getDept().getName();
String ip = BrowserUtil.getIp(request);
String id = tokenProvider.getId(token);
String version = BrowserUtil.getVersion(request);
String address = IPUtil.getCityInfo(ip);
OnlineUserDto onlineUserDto = null;
UserOnlineDto userOnlineDto = null;
try {
onlineUserDto = new OnlineUserDto();
onlineUserDto.setUid(id);
onlineUserDto.setUserName(jwtUserDto.getUsername());
onlineUserDto.setNickName(jwtUserDto.getUser().getNickName());
onlineUserDto.setDept(dept);
onlineUserDto.setBrowser(version);
onlineUserDto.setIp(ip);
onlineUserDto.setAddress(address);
onlineUserDto.setKey(DESEncryptUtil.desEncrypt(token));
onlineUserDto.setLoginTime(new Date());
userOnlineDto = new UserOnlineDto();
userOnlineDto.setUid(id);
userOnlineDto.setUserName(userJwtDto.getUsername());
userOnlineDto.setNickName(userJwtDto.getUser().getNickName());
userOnlineDto.setDept(dept);
userOnlineDto.setBrowser(version);
userOnlineDto.setIp(ip);
userOnlineDto.setAddress(address);
userOnlineDto.setKey(DESEncryptUtil.desEncrypt(token));
userOnlineDto.setLoginTime(new Date());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
String loginKey = tokenProvider.loginKey(token);
redisUtil.set(loginKey, onlineUserDto, properties.getTokenValidityInSeconds(), TimeUnit.MILLISECONDS);
redisUtil.set(loginKey, userOnlineDto, properties.getTokenValidityInSeconds(), TimeUnit.MILLISECONDS);
}
@Override
public PageResult<OnlineUserDto> queryOnlineUserPage(String username, Pageable pageable) {
List<OnlineUserDto> onlineUserList = selectOnlineUserByUsername(username);
List<OnlineUserDto> paging = PageUtil.softPaging(pageable.getPageNumber(), pageable.getPageSize(), onlineUserList);
public PageResult<UserOnlineDto> queryOnlineUserPage(String username, Pageable pageable) {
List<UserOnlineDto> onlineUserList = selectOnlineUserByUsername(username);
List<UserOnlineDto> paging = PageUtil.softPaging(pageable.getPageNumber(), pageable.getPageSize(), onlineUserList);
return PageUtil.toPage(paging, onlineUserList.size());
}
@Override
public List<OnlineUserDto> selectOnlineUserByUsername(String username) {
public List<UserOnlineDto> selectOnlineUserByUsername(String username) {
String loginKey = SystemRedisKey.ONLINE_USER + (StringUtil.isBlank(username) ? "" : "*" + username);
List<String> keys = redisUtil.scan(loginKey + "*");
Collections.reverse(keys);
List<OnlineUserDto> onlineUserList = new ArrayList<>();
List<UserOnlineDto> onlineUserList = new ArrayList<>();
for (String key : keys) {
onlineUserList.add(redisUtil.get(key, OnlineUserDto.class));
onlineUserList.add(redisUtil.get(key, UserOnlineDto.class));
}
onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime()));
return onlineUserList;
@@ -81,9 +81,9 @@ public class OnlineUserServiceImpl implements OnlineUserService {
}
@Override
public void downloadExcel(List<OnlineUserDto> all, HttpServletResponse response) throws IOException {
public void downloadExcel(List<UserOnlineDto> all, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (OnlineUserDto user : all) {
for (UserOnlineDto user : all) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("用户名", user.getUserName());
map.put("部门", user.getDept());
@@ -97,8 +97,8 @@ public class OnlineUserServiceImpl implements OnlineUserService {
}
@Override
public OnlineUserDto getOnlineUserByKey(String key) {
return redisUtil.get(key, OnlineUserDto.class);
public UserOnlineDto getOnlineUserByKey(String key) {
return redisUtil.get(key, UserOnlineDto.class);
}
@Override
@@ -3,7 +3,7 @@ package cn.odboy.application.system.service;
import cn.odboy.base.PageResult;
import cn.odboy.model.system.domain.Role;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.AuthorityDto;
import cn.odboy.model.system.dto.RoleCodeDto;
import cn.odboy.model.system.dto.RoleQueryCriteria;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -98,7 +98,7 @@ public interface RoleService extends IService<Role> {
* @param user 用户信息
* @return 权限信息
*/
List<AuthorityDto> buildPermissions(User user);
List<RoleCodeDto> buildPermissions(User user);
/**
* 导出数据
@@ -3,9 +3,9 @@ package cn.odboy.application.system.service.impl;
import cn.hutool.core.date.BetweenFormatter.Level;
import cn.hutool.core.date.DateUtil;
import cn.odboy.application.system.service.MonitorService;
import cn.odboy.constant.SystemConstant;
import cn.odboy.constant.SystemConst;
import cn.odboy.util.FileUtil;
import cn.odboy.util.StringUtil;
import cn.odboy.util.IPUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import oshi.SystemInfo;
@@ -65,7 +65,7 @@ public class MonitorServiceImpl implements MonitorService {
long available = 0, total = 0;
for (OSFileStore fs : fsArray) {
// windows 需要将所有磁盘分区累加,linux 和 mac 直接累加会出现磁盘重复的问题,待修复
if (osName.toLowerCase().startsWith(SystemConstant.WIN)) {
if (osName.toLowerCase().startsWith(SystemConst.WIN)) {
available += fs.getUsableSpace();
total += fs.getTotalSpace();
} else {
@@ -178,7 +178,7 @@ public class MonitorServiceImpl implements MonitorService {
// 系统信息
systemInfo.put("os", os.toString());
systemInfo.put("day", formatBetween);
systemInfo.put("ip", StringUtil.getLocalIp());
systemInfo.put("ip", IPUtil.getLocalIp());
return systemInfo;
}
}
@@ -15,7 +15,7 @@ import cn.odboy.exception.EntityExistException;
import cn.odboy.model.system.domain.Menu;
import cn.odboy.model.system.domain.Role;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.AuthorityDto;
import cn.odboy.model.system.dto.RoleCodeDto;
import cn.odboy.model.system.dto.RoleQueryCriteria;
import cn.odboy.util.FileUtil;
import cn.odboy.util.PageUtil;
@@ -160,22 +160,22 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
}
@Override
public List<AuthorityDto> buildPermissions(User user) {
public List<RoleCodeDto> buildPermissions(User user) {
String key = SystemRedisKey.ROLE_AUTH + user.getId();
List<AuthorityDto> authorityList = redisUtil.getList(key, AuthorityDto.class);
List<RoleCodeDto> authorityList = redisUtil.getList(key, RoleCodeDto.class);
if (CollUtil.isEmpty(authorityList)) {
Set<String> permissions = new HashSet<>();
// 如果是管理员直接返回
if (user.getIsAdmin()) {
permissions.add("admin");
return permissions.stream().map(AuthorityDto::new)
return permissions.stream().map(RoleCodeDto::new)
.collect(Collectors.toList());
}
List<Role> roles = roleMapper.selectRoleByUserId(user.getId());
permissions = roles.stream().flatMap(role -> role.getMenus().stream())
.map(Menu::getPermission)
.filter(StringUtil::isNotBlank).collect(Collectors.toSet());
authorityList = permissions.stream().map(AuthorityDto::new)
authorityList = permissions.stream().map(RoleCodeDto::new)
.collect(Collectors.toList());
redisUtil.set(key, authorityList, 1, TimeUnit.HOURS);
}
@@ -1,6 +1,6 @@
package cn.odboy.application.system.service.impl;
import cn.odboy.application.core.service.OnlineUserService;
import cn.odboy.application.core.service.UserOnlineService;
import cn.odboy.application.core.service.UserCacheService;
import cn.odboy.application.system.mapper.UserJobMapper;
import cn.odboy.application.system.mapper.UserMapper;
@@ -40,7 +40,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
private final FileProperties fileProperties;
private final RedisUtil redisUtil;
private final UserCacheService userCacheService;
private final OnlineUserService onlineUserService;
private final UserOnlineService userOnlineService;
@Override
public PageResult<User> queryUserPage(UserQueryCriteria criteria, Page<Object> page) {
@@ -116,7 +116,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
}
// 如果用户被禁用,则清除用户登录信息
if (!resources.getEnabled()) {
onlineUserService.kickOutByUsername(resources.getUsername());
userOnlineService.kickOutByUsername(resources.getUsername());
}
user.setDeptId(resources.getDept().getId());
user.setUsername(resources.getUsername());
@@ -191,7 +191,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
// 清除缓存
flushCache(user.getUsername());
// 强制退出
onlineUserService.kickOutByUsername(user.getUsername());
userOnlineService.kickOutByUsername(user.getUsername());
});
// 重置密码
userMapper.resetPasswordByUserIds(ids, password);
+6 -7
View File
@@ -11,7 +11,7 @@
Target Server Version : 80025
File Encoding : 65001
Date: 24/03/2025 21:16:20
Date: 27/03/2025 19:08:22
*/
SET NAMES utf8mb4;
@@ -391,7 +391,7 @@ CREATE TABLE `sys_menu` (
UNIQUE INDEX `uniq_name`(`name`) USING BTREE,
UNIQUE INDEX `uniq_title`(`title`) USING BTREE,
INDEX `idx_pid`(`pid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 117 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统菜单' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 123 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统菜单' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_menu
@@ -491,7 +491,7 @@ INSERT INTO `sys_quartz_job` VALUES (6, 'testTask', '0/5 * * * * ?', b'1', '测
-- ----------------------------
DROP TABLE IF EXISTS `sys_quartz_log`;
CREATE TABLE `sys_quartz_log` (
`log_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`bean_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Bean名称',
`cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'cron 表达式',
`is_success` bit(1) NULL DEFAULT NULL COMMENT '是否执行成功',
@@ -501,7 +501,7 @@ CREATE TABLE `sys_quartz_log` (
`time` bigint(0) NULL DEFAULT NULL COMMENT '执行耗时',
`exception_detail` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '异常详情',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`log_id`) USING BTREE
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 171 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务日志' ROW_FORMAT = Dynamic;
-- ----------------------------
@@ -533,7 +533,6 @@ CREATE TABLE `sys_role` (
INSERT INTO `sys_role` VALUES (1, '超级管理员', 1, '666', '全部', NULL, 'admin', '2018-11-23 11:04:37', '2020-08-06 16:10:24');
INSERT INTO `sys_role` VALUES (2, '普通用户', 2, '-', '本级', NULL, 'admin', '2018-11-23 13:09:06', '2020-09-05 10:45:12');
INSERT INTO `sys_role` VALUES (3, 'd666', 3, NULL, '全部', 'admin', 'admin', NULL, NULL);
INSERT INTO `sys_role` VALUES (4, '666', 3, NULL, '全部', 'admin', 'admin', NULL, NULL);
-- ----------------------------
-- Table structure for sys_roles_depts
@@ -717,7 +716,7 @@ CREATE TABLE `tool_email_config` (
`config_id` bigint(0) NOT NULL COMMENT 'ID',
`from_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '收件人',
`host` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮件服务器SMTP地址',
`pass` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
`port` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '端口',
`user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发件者用户名',
PRIMARY KEY (`config_id`) USING BTREE
@@ -744,7 +743,7 @@ CREATE TABLE `tool_local_storage` (
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '本地存储' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '本地存储' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tool_local_storage