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