Merge pull request 'dev' (#5) from dev into master

Reviewed-on: #5
♻️ 请求部分放在配置项中,UUID生成报错问题
This commit is contained in:
bunny 2024-06-13 09:37:49 +08:00
commit 6f6755c99e
9 changed files with 94 additions and 45 deletions

View File

@ -1,10 +1,13 @@
package cn.bunny.common.service.context;
import cn.bunny.vo.system.login.LoginVo;
public class BaseContext {
private static final ThreadLocal<Long> userId = new ThreadLocal<>();
private static final ThreadLocal<String> username = new ThreadLocal<String>();
private static final ThreadLocal<Long> adminId = new ThreadLocal<>();
private static final ThreadLocal<String> adminName = new ThreadLocal<>();
private static final ThreadLocal<LoginVo> loginVo = new ThreadLocal<>();
// 用户id相关
public static Long getUserId() {
@ -23,9 +26,18 @@ public class BaseContext {
username.set(_username);
}
public static LoginVo getLoginVo() {
return loginVo.get();
}
public static void setLoginVo(LoginVo _loginVo) {
loginVo.set(_loginVo);
}
public static void removeUser() {
username.remove();
userId.remove();
loginVo.remove();
}
// adminId 相关

View File

@ -61,6 +61,9 @@ public class SystemLog implements Serializable {
@ApiModelProperty("当前用户token")
private String token;
@ApiModelProperty("当前用户IP地址")
private String ipAddress;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;

View File

@ -6,7 +6,7 @@ import lombok.Data;
public class FileMessageConstant {
public static final String DOWNLOAD_BUCKET_EXCEPTION = "下载文件失败";
public static final String FILE_UPLOAD_EXCEPTION = "文件上传失败";
public static final String BUCKET_EXISTS_EXCEPTION = "查询文化部对象失败";
public static final String BUCKET_EXISTS_EXCEPTION = "查询文对象失败";
public static final String DELETE_BUCKET_EXCEPTION = "删除文件对象失败";
public static final String FILE_IS_EMPTY = "文件信息为空";
public static final String FILE_IS_NOT_EXITS = "文件信息为空";

View File

@ -1,7 +1,8 @@
package cn.bunny.module.minio.utils;
import cn.bunny.pojo.result.constant.FileMessageConstant;
import cn.bunny.common.service.exception.BunnyException;
import cn.bunny.module.minio.properties.MinioProperties;
import cn.bunny.pojo.result.constant.FileMessageConstant;
import io.minio.*;
import io.minio.messages.*;
import lombok.extern.slf4j.Slf4j;
@ -19,9 +20,43 @@ import java.util.Map;
@Component
@Slf4j
public class MinioUtil {
@Autowired
private MinioProperties properties;
@Autowired
private MinioClient minioClient;
/**
* 获取Minio全路径名
*
* @param objectName 对象名称
* @return 全路径
*/
public String getFullPath(String objectName) {
String url = properties.getEndpointUrl();
String bucketName = properties.getBucketName();
return url + "/" + bucketName + objectName;
}
/**
* 获取文件并返回字节数组
*
* @param bucketName 桶名称
* @param objectName 对象名称
* @return 文件流对象
*/
public byte[] getBucketObjectByte(String bucketName, String objectName) {
try {
GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
log.info("获取文件 ------ 成功");
return getObjectResponse.readAllBytes();
} catch (Exception exception) {
log.error("获取文件 ------ 失败消息:{}", exception.getLocalizedMessage());
exception.getStackTrace();
}
throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION);
}
/**
* 判断桶是否存在
*

View File

@ -1,14 +0,0 @@
package cn.bunny.service.gateway.task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class TemplateTask {
@Scheduled(cron = "0/1 5 * * * ?")
public void templateTask() {
log.info("定时任务执行...");
}
}

View File

@ -54,24 +54,27 @@ public class AutoLogAspect {
Map<String, Object> mapByToken = JwtHelper.getMapByToken(token);
LoginVo loginVo = JSONObject.parseObject(JSONObject.toJSONString(mapByToken), LoginVo.class);
// 插入Ip地址
systemLog.setIpAddress(request.getRemoteHost());
try {
// 当为null时跳过执行
if (annotation != null) return joinPoint.proceed();
// TODO 将请求头token全部转成 map
systemLog.setClassPath(classPath);
systemLog.setMethodName(methodName);
if (args.equals("[null]")) {
systemLog.setArgs(null);
} else {
systemLog.setArgs(args);
}
systemLog.setToken(token);
// 登录返回Vo不为空即插入
if (loginVo != null) {
systemLog.setNickname(loginVo.getNickName());
systemLog.setEmail(loginVo.getEmail());
systemLog.setUpdateUser(loginVo.getId());
}
systemLog.setNickname(loginVo.getNickName());
systemLog.setEmail(loginVo.getEmail());
systemLog.setUpdateUser(loginVo.getId());
systemLog.setClassPath(classPath);
systemLog.setMethodName(methodName);
systemLog.setToken(token);
// 目标对象连接点方法的执行
result = joinPoint.proceed();

View File

@ -1,11 +1,13 @@
package cn.bunny.service.web.interceptor;
import cn.bunny.pojo.result.constant.RedisUserConstant;
import cn.bunny.pojo.result.ResultCodeEnum;
import cn.bunny.pojo.result.Result;
import cn.bunny.common.service.context.BaseContext;
import cn.bunny.common.service.utils.JwtHelper;
import cn.bunny.common.service.utils.ResponseUtil;
import cn.bunny.pojo.result.Result;
import cn.bunny.pojo.result.ResultCodeEnum;
import cn.bunny.pojo.result.constant.RedisUserConstant;
import cn.bunny.vo.system.login.LoginVo;
import com.alibaba.fastjson2.JSONObject;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
@ -16,6 +18,8 @@ import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import java.util.Map;
@Component
@Slf4j
public class UserTokenInterceptor implements HandlerInterceptor {
@ -23,17 +27,22 @@ public class UserTokenInterceptor implements HandlerInterceptor {
private RedisTemplate<String, Object> redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("UserTokenInterceptor===>设置拦截器");
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String token = request.getHeader("token");
Long userId = JwtHelper.getUserId(token);
String username = JwtHelper.getUsername(token);
Object redisUserinfo = redisTemplate.opsForValue().get(RedisUserConstant.getUserLoginInfoPrefix(username));
Map<String, Object> mapByToken = JwtHelper.getMapByToken(token);
LoginVo loginVo = JSONObject.parseObject(JSONObject.toJSONString(mapByToken), LoginVo.class);
Object redisUserinfo = redisTemplate.opsForValue().get(RedisUserConstant.getUserLoginInfoPrefix(loginVo.getEmail()));
// 不是动态方法直接返回
if (!(handler instanceof HandlerMethod)) return true;
// token过期-提示身份验证过期
if (JwtHelper.isExpired(token)) {
ResponseUtil.out(response, Result.error(ResultCodeEnum.AUTHENTICATION_EXPIRED));
return false;
}
// 解析不到userId
if (userId == null) {
if (loginVo.getId() == null) {
ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_AUTH));
return false;
}
@ -42,8 +51,9 @@ public class UserTokenInterceptor implements HandlerInterceptor {
return false;
}
BaseContext.setUserId(userId);
BaseContext.setUsername(username);
BaseContext.setUserId(loginVo.getId());
BaseContext.setUsername(loginVo.getEmail());
BaseContext.setLoginVo(loginVo);
return true;
}

View File

@ -1,24 +1,24 @@
bunny:
datasource:
host: 106.15.251.123
host: 192.168.1.4
port: 3305
sqlData: bunny_docs
username: root
password: "02120212"
redis:
host: 47.120.65.66
host: 192.168.1.4
port: 6379
database: 1
password: "02120212"
database: 3
password: "123456"
minio:
endpointUrl: "http://129.211.31.58:9000"
bucket-name: bunny-bbs
endpointUrl: "http://192.168.1.4:9000"
bucket-name: test
accessKey: bunny
secretKey: "02120212"
nacos:
server-addr: z-bunny.cn:8848
server-addr: 192.168.1.4:8848
discovery:
namespace: bunnyBBS
namespace: bunnyServer

View File

@ -99,7 +99,7 @@ class JwtHelperTest {
createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MTQ6CMBBA4buMW_oz7VChK0_gHcZSQpUiwWpMCHe3B3D9vbwdVt44g9-PBpYUHlfOETy8X3G7xC_ndY4yPDM0wB8uvFWbSlm9Umh6aRClRdl2nrTW6qTCxKW2aQCPxjYQM6f5_-9eUgXqWzThRmKk8SzIaBSMzgnXsuuI-sFqguMH0SvcYacAAAA.qW_gqkc8RQJM-UbFVj7xldSEv1RORO4qlw6VMrTEmM0";
createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MSw7CIBRA0b08p_yhFBi5AvfwApiiRQmiMWm6d7sAx-fmbtCwY4Ww7QQeJd4vWDMEeL9yP-cv1rZmFp8VCOAHB_bDljFa4Fwqz5SUTEs2uWCEEPzE44LjaEuCIJUmkCuW9f_vNsoBaJ1yYnZ0Rqep8VlRnESi3khrklFeXC3sP3hOgQ2nAAAA.bkPBbfpLd21eaJE2gjzniUx5n9VvCqWSY_zBiu8oO9k";
Map<String, Object> tokenByMap = JwtHelper.getTokenByMap(createTokenWithMapToken);
Map<String, Object> tokenByMap = JwtHelper.getMapByToken(createTokenWithMapToken);
// 转为Java实体对戏那个
User user = JSONObject.parseObject(JSONObject.toJSONString(tokenByMap), User.class);
@ -114,7 +114,7 @@ class JwtHelperTest {
createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MTQ7CIBBA4buMW36nQAsrT-AdpoApWrSpaEya3t0ewPX38jZYaKUKYdsZPEq8X6hmCPB-5fWcv1SXOYv4rMCAPtRoPWxqbQlSavQCtRadFnYIRiklTzJO1I62JAgaOwa5Upn__26tHIBjTOSvxB2agRurDCeTHMceE1nne6dH2H-VOEqApwAAAA.j5BcFLT-2HENeYS8LvD27tyRnI1rE-iFzjBy1iY02T4";
createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MTQ7CIBBA4buM2_JXWkpZeQLvMNIhRYsSRGPS9O5yANffy9shY8EEbj86eER_v2AicPB-UTnTF1PeiPtngg7wgxVLs7XW7IRQ_cx7pbhWfLRukFKKk_Ar1tbGBZzqdQeUMG7_f7caG1zlZCZDyGavFzZ4MzC0ZmIWQ1DWeBtGguMHw7854qcAAAA.V4VLIJ7vUqnfd1LeQkXa3t8V_376DWVAA_g0PE_6_S8";
Map<String, Object> tokenByMap = JwtHelper.getTokenByMap(createTokenWithMapToken, key);
Map<String, Object> tokenByMap = JwtHelper.getMapByToken(createTokenWithMapToken, key);
// 转为Java实体对戏那个
User user = JSONObject.parseObject(JSONObject.toJSONString(tokenByMap), User.class);
System.out.println(user);