🎉 2.3.0.RELEASE

This commit is contained in:
smallchill 2019-05-04 22:15:31 +08:00
parent 33473b7356
commit e08a94f934
26 changed files with 126 additions and 123 deletions

View File

@ -5,7 +5,7 @@
<parent>
<groupId>org.springblade</groupId>
<artifactId>blade-tool</artifactId>
<version>2.2.3</version>
<version>2.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@ -115,7 +115,7 @@
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.15</version>
</dependency>
<!-- PostgreSql -->
<!--<dependency>

View File

@ -15,13 +15,11 @@
*/
package org.springblade.core.boot.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.mp.BladeMetaObjectHandler;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -42,11 +40,6 @@ public class MybatisPlusConfiguration {
return new PaginationInterceptor();
}
@Bean
public MetaObjectHandler metaObjectHandler() {
return new BladeMetaObjectHandler();
}
@Bean
public LogicSqlInjector logicSqlInjector() {
return new LogicSqlInjector();
@ -58,7 +51,7 @@ public class MybatisPlusConfiguration {
* @return PerformanceInterceptor
*/
@Bean
@Profile({AppConstant.DEV_CDOE, AppConstant.TEST_CODE})
@Profile({AppConstant.DEV_CODE, AppConstant.TEST_CODE})
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}

View File

@ -5,6 +5,7 @@ import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.tool.jackson.JsonUtil;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.ClassUtil;
@ -35,7 +36,7 @@ import java.util.concurrent.TimeUnit;
@Slf4j
@Aspect
@Configuration
@Profile({"dev", "test"})
@Profile({AppConstant.DEV_CODE, AppConstant.TEST_CODE})
public class RequestLogAspect {
/**
@ -54,19 +55,42 @@ public class RequestLogAspect {
MethodSignature ms = (MethodSignature) point.getSignature();
Method method = ms.getMethod();
Object[] args = point.getArgs();
// 请求参数处理
final Map<String, Object> paraMap = new HashMap<>(16);
for (int i = 0; i < args.length; i++) {
// 读取方法参数
MethodParameter methodParam = ClassUtil.getMethodParameter(method, i);
// PathVariable 参数跳过
PathVariable pathVariable = methodParam.getParameterAnnotation(PathVariable.class);
if (pathVariable != null) {
continue;
}
RequestBody requestBody = methodParam.getParameterAnnotation(RequestBody.class);
Object object = args[i];
Object value = args[i];
// 如果是body的json则是对象
if (requestBody != null && object != null) {
paraMap.putAll(BeanUtil.toMap(object));
if (requestBody != null && value != null) {
paraMap.putAll(BeanUtil.toMap(value));
continue;
}
// 处理 List
if (value instanceof List) {
value = ((List) value).get(0);
}
// 处理 参数
if (value instanceof HttpServletRequest) {
paraMap.putAll(((HttpServletRequest) value).getParameterMap());
} else if (value instanceof WebRequest) {
paraMap.putAll(((WebRequest) value).getParameterMap());
} else if (value instanceof MultipartFile) {
MultipartFile multipartFile = (MultipartFile) value;
String name = multipartFile.getName();
String fileName = multipartFile.getOriginalFilename();
paraMap.put(name, fileName);
} else if (value instanceof HttpServletResponse) {
} else if (value instanceof InputStream) {
} else if (value instanceof InputStreamSource) {
} else {
// 参数名
RequestParam requestParam = methodParam.getParameterAnnotation(RequestParam.class);
String paraName;
if (requestParam != null && StringUtil.isNotBlank(requestParam.value())) {
@ -74,74 +98,61 @@ public class RequestLogAspect {
} else {
paraName = methodParam.getParameterName();
}
paraMap.put(paraName, object);
paraMap.put(paraName, value);
}
}
HttpServletRequest request = WebUtil.getRequest();
String requestURI = request.getRequestURI();
String requestURI = Objects.requireNonNull(request).getRequestURI();
String requestMethod = request.getMethod();
// 处理 参数
List<String> needRemoveKeys = new ArrayList<>(paraMap.size());
paraMap.forEach((key, value) -> {
if (value instanceof HttpServletRequest) {
needRemoveKeys.add(key);
paraMap.putAll(((HttpServletRequest) value).getParameterMap());
} else if (value instanceof HttpServletResponse) {
needRemoveKeys.add(key);
} else if (value instanceof InputStream) {
needRemoveKeys.add(key);
} else if (value instanceof MultipartFile) {
String fileName = ((MultipartFile) value).getOriginalFilename();
paraMap.put(key, fileName);
} else if (value instanceof InputStreamSource) {
needRemoveKeys.add(key);
} else if (value instanceof WebRequest) {
needRemoveKeys.add(key);
paraMap.putAll(((WebRequest) value).getParameterMap());
}
});
needRemoveKeys.forEach(paraMap::remove);
// 构建成一条长 日志避免并发下日志错乱
StringBuilder logBuilder = new StringBuilder(500);
StringBuilder beforeReqLog = new StringBuilder(300);
// 日志参数
List<Object> logArgs = new ArrayList<>();
logBuilder.append("\n\n================ Request Start ================\n");
// 打印请求
List<Object> beforeReqArgs = new ArrayList<>();
beforeReqLog.append("\n\n================ Request Start ================\n");
// 打印路由
beforeReqLog.append("===> {}: {}");
beforeReqArgs.add(requestMethod);
beforeReqArgs.add(requestURI);
// 请求参数
if (paraMap.isEmpty()) {
logBuilder.append("===> {}: {}\n");
logArgs.add(requestMethod);
logArgs.add(requestURI);
beforeReqLog.append("\n");
} else {
logBuilder.append("===> {}: {} Parameters: {}\n");
logArgs.add(requestMethod);
logArgs.add(requestURI);
logArgs.add(JsonUtil.toJson(paraMap));
beforeReqLog.append(" Parameters: {}\n");
beforeReqArgs.add(JsonUtil.toJson(paraMap));
}
// 打印请求头
Enumeration<String> headers = request.getHeaderNames();
while (headers.hasMoreElements()) {
String headerName = headers.nextElement();
String headerValue = request.getHeader(headerName);
logBuilder.append("===headers=== {} : {}\n");
logArgs.add(headerName);
logArgs.add(headerValue);
beforeReqLog.append("===Headers=== {} : {}\n");
beforeReqArgs.add(headerName);
beforeReqArgs.add(headerValue);
}
beforeReqLog.append("================ Request End ================\n");
// 打印执行时间
long startNs = System.nanoTime();
log.info(beforeReqLog.toString(), beforeReqArgs.toArray());
// aop 执行后的日志
StringBuilder afterReqLog = new StringBuilder(200);
// 日志参数
List<Object> afterReqArgs = new ArrayList<>();
afterReqLog.append("\n\n================ Response Start ================\n");
try {
Object result = point.proceed();
logBuilder.append("===Result=== {}\n");
logArgs.add(JsonUtil.toJson(result));
// 打印返回结构体
afterReqLog.append("===Result=== {}\n");
afterReqArgs.add(JsonUtil.toJson(result));
return result;
} finally {
long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
logBuilder.append("<=== {}: {} ({} ms)");
logArgs.add(requestMethod);
logArgs.add(requestURI);
logArgs.add(tookMs);
logBuilder.append("\n================ Request End ================\n");
log.info(logBuilder.toString(), logArgs.toArray());
afterReqLog.append("<=== {}: {} ({} ms)\n");
afterReqArgs.add(requestMethod);
afterReqArgs.add(requestURI);
afterReqArgs.add(tookMs);
afterReqLog.append("================ Response End ================\n");
log.info(afterReqLog.toString(), afterReqArgs.toArray());
}
}

View File

@ -62,6 +62,12 @@ public class BladeTenantHandler implements TenantHandler {
*/
@Override
public boolean doTableFilter(String tableName) {
return (properties.getTables().size() > 0 && !properties.getTables().contains(tableName)) || !properties.getBladeTables().contains(tableName) || StringUtil.isBlank(SecureUtil.getTenantCode());
return !(
(
(properties.getTables().size() > 0 && properties.getTables().contains(tableName))
|| properties.getBladeTables().contains(tableName)
)
&& StringUtil.isNotBlank(SecureUtil.getTenantCode())
);
}
}

View File

@ -28,7 +28,7 @@ spring:
resources:
add-mappings: false
datasource:
driver-class-name: com.mysql.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
connection-test-query: SELECT 1 FROM DUAL
connection-timeout: 30000
@ -75,7 +75,7 @@ mybatis-plus:
swagger:
title: SpringBlade 接口文档系统
description: SpringBlade 接口文档系统
version: 2.0.0
version: 2.3.0
license: Powered By SpringBlade
licenseUrl: https://bladex.vip
terms-of-service-url: https://bladex.vip

View File

@ -77,5 +77,8 @@
<Logger name="org.springblade" level="DEBUG" />
<Logger name="org.springblade.core.version" level="INFO"/>
<!-- 减少nacos日志 -->
<logger name="com.alibaba.nacos" level="ERROR"/>
</configuration>

View File

@ -86,4 +86,7 @@
<logger name="net.sf.ehcache" level="INFO"/>
<logger name="druid.sql" level="INFO"/>
<!-- 减少nacos日志 -->
<logger name="com.alibaba.nacos" level="ERROR"/>
</configuration>

View File

@ -86,4 +86,7 @@
<logger name="net.sf.ehcache" level="INFO"/>
<logger name="druid.sql" level="INFO"/>
<!-- 减少nacos日志 -->
<logger name="com.alibaba.nacos" level="ERROR"/>
</configuration>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>blade-tool</artifactId>
<groupId>org.springblade</groupId>
<version>2.2.3</version>
<version>2.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>blade-tool</artifactId>
<groupId>org.springblade</groupId>
<version>2.2.3</version>
<version>2.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -1,4 +1,4 @@
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/blade?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>blade-tool</artifactId>
<groupId>org.springblade</groupId>
<version>2.2.3</version>
<version>2.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -61,7 +61,7 @@ public class BladeApplication {
// 判断环境:devtestprod
List<String> profiles = Arrays.asList(activeProfiles);
// 预设的环境
List<String> presetProfiles = new ArrayList<>(Arrays.asList(AppConstant.DEV_CDOE, AppConstant.TEST_CODE, AppConstant.PROD_CODE));
List<String> presetProfiles = new ArrayList<>(Arrays.asList(AppConstant.DEV_CODE, AppConstant.TEST_CODE, AppConstant.PROD_CODE));
// 交集
presetProfiles.retainAll(profiles);
// 当前使用
@ -71,7 +71,7 @@ public class BladeApplication {
String profile;
if (activeProfileList.isEmpty()) {
// 默认dev开发
profile = AppConstant.DEV_CDOE;
profile = AppConstant.DEV_CODE;
activeProfileList.add(profile);
builder.profiles(profile);
} else if (activeProfileList.size() == 1) {

View File

@ -25,7 +25,7 @@ public interface AppConstant {
/**
* 应用版本
*/
String APPLICATION_VERSION = "2.0.0";
String APPLICATION_VERSION = "2.3.0";
/**
* 基础包
@ -76,7 +76,7 @@ public interface AppConstant {
/**
* 开发环境
*/
String DEV_CDOE = "dev";
String DEV_CODE = "dev";
/**
* 生产环境
*/

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>blade-tool</artifactId>
<groupId>org.springblade</groupId>
<version>2.2.3</version>
<version>2.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -33,7 +33,7 @@ public class ServiceException extends RuntimeException {
public ServiceException(String message) {
super(message);
this.resultCode = ResultCode.INTERNAL_SERVER_ERROR;
this.resultCode = ResultCode.FAILURE;
}
public ServiceException(IResultCode resultCode) {

View File

@ -16,7 +16,6 @@
package org.springblade.core.log.feign;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.log.feign.fallback.ILogClientHystric;
import org.springblade.core.log.model.LogApi;
import org.springblade.core.log.model.LogUsual;
import org.springblade.core.log.model.LogError;
@ -32,7 +31,7 @@ import org.springframework.web.bind.annotation.RequestBody;
*/
@FeignClient(
value = AppConstant.APPLICATION_LOG_NAME,
fallback = ILogClientHystric.class
fallback = LogClientFallback.class
)
public interface ILogClient {
@ -41,8 +40,8 @@ public interface ILogClient {
/**
* 保存错误日志
*
* @param log
* @return
* @param log 日志实体
* @return boolean
*/
@PostMapping(API_PREFIX + "/saveUsualLog")
R<Boolean> saveUsualLog(@RequestBody LogUsual log);
@ -50,8 +49,8 @@ public interface ILogClient {
/**
* 保存操作日志
*
* @param log
* @return
* @param log 日志实体
* @return boolean
*/
@PostMapping(API_PREFIX + "/saveApiLog")
R<Boolean> saveApiLog(@RequestBody LogApi log);
@ -59,8 +58,8 @@ public interface ILogClient {
/**
* 保存错误日志
*
* @param log
* @return
* @param log 日志实体
* @return boolean
*/
@PostMapping(API_PREFIX + "/saveErrorLog")
R<Boolean> saveErrorLog(@RequestBody LogError log);

View File

@ -1,8 +1,6 @@
package org.springblade.core.log.feign.fallback;
package org.springblade.core.log.feign;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.feign.ILogClient;
import org.springblade.core.log.model.LogApi;
import org.springblade.core.log.model.LogError;
import org.springblade.core.log.model.LogUsual;
@ -10,29 +8,26 @@ import org.springblade.core.tool.api.R;
import org.springframework.stereotype.Component;
/**
* @Auther: jiang
* @Date: 2019/04/26 23:04
* 日志fallback
*
* @author jiang
*/
@Component
@Slf4j
public class ILogClientHystric implements ILogClient {
@Component
public class LogClientFallback implements ILogClient {
@Override
public R<Boolean> saveUsualLog(LogUsual log) {
//这里如果使用log.toString()来打印日志的话只能打印出该对象自身的属性值无法输出父类的属性值
this.log.error("usual log send fail:{}", JSON.toJSONString(log));
return R.fail("usual log send fail");
}
@Override
public R<Boolean> saveApiLog(LogApi log) {
this.log.error("api log send fail:{}", JSON.toJSONString(log));
return R.fail("api log send fail");
}
@Override
public R<Boolean> saveErrorLog(LogError log) {
this.log.error("error log send fail:{}", JSON.toJSONString(log));
return R.fail("error log send fail");
}
}

View File

@ -20,23 +20,16 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springblade.core.launch.props.BladeProperties;
import org.springblade.core.launch.server.ServerInfo;
import org.springblade.core.secure.utils.SecureUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.StringPool;
import org.springblade.core.tool.utils.UrlUtil;
import org.springblade.core.tool.utils.WebUtil;
import org.springframework.format.annotation.DateTimeFormat;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* logApilogErrorlogUsual的父类拥有相同的属性值
* @Auther: jiang
* @Date: 2019/04/26 23:00
*
* @author jiang
*/
@Data
public class LogAbstract implements Serializable {

View File

@ -25,12 +25,7 @@ import org.springblade.core.tool.utils.UrlUtil;
import org.springblade.core.tool.utils.WebUtil;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.UnknownHostException;
import java.time.LocalDateTime;
import java.util.Enumeration;
/**
* INet 相关工具
@ -41,8 +36,9 @@ public class LogAbstractUtil {
/**
* 向log中添加补齐request的信息
* @param request
* @param logAbstract
*
* @param request 请求
* @param logAbstract 日志基础类
*/
public static void addRequestInfoToLog(HttpServletRequest request, LogAbstract logAbstract) {
logAbstract.setRemoteIp(WebUtil.getIP(request));
@ -55,9 +51,10 @@ public class LogAbstractUtil {
/**
* 向log中添加补齐其他的信息egbladeserver等
* @param logAbstract
* @param bladeProperties
* @param serverInfo
*
* @param logAbstract 日志基础类
* @param bladeProperties 配置信息
* @param serverInfo 服务信息
*/
public static void addOtherInfoToLog(LogAbstract logAbstract, BladeProperties bladeProperties, ServerInfo serverInfo) {
logAbstract.setServiceId(bladeProperties.getName());
@ -67,7 +64,7 @@ public class LogAbstractUtil {
logAbstract.setCreateTime(LocalDateTime.now());
//这里判断一下params为null的情况否则blade-log服务在解析该字段的时候可能会报出NPE
if(logAbstract.getParams() == null){
if (logAbstract.getParams() == null) {
logAbstract.setParams(StringPool.EMPTY);
}
}

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>blade-tool</artifactId>
<groupId>org.springblade</groupId>
<version>2.2.3</version>
<version>2.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>blade-tool</artifactId>
<groupId>org.springblade</groupId>
<version>2.2.3</version>
<version>2.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>blade-tool</artifactId>
<groupId>org.springblade</groupId>
<version>2.2.3</version>
<version>2.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -53,7 +53,7 @@ public class SwaggerProperties {
/**
* 版本
**/
private String version = "2.0.0";
private String version = "2.3.0";
/**
* 许可证
**/

View File

@ -6,7 +6,7 @@
<parent>
<groupId>org.springblade</groupId>
<artifactId>blade-tool</artifactId>
<version>2.2.3</version>
<version>2.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

14
pom.xml
View File

@ -5,7 +5,7 @@
<groupId>org.springblade</groupId>
<artifactId>blade-tool</artifactId>
<version>2.2.3</version>
<version>2.3.0</version>
<packaging>pom</packaging>
<name>blade-tool</name>
<description>
@ -36,23 +36,23 @@
</scm>
<properties>
<blade.tool.version>2.2.3</blade.tool.version>
<blade.tool.version>2.3.0</blade.tool.version>
<java.version>1.8</java.version>
<maven.plugin.version>3.8.0</maven.plugin.version>
<swagger.version>2.9.2</swagger.version>
<swagger.models.version>1.5.21</swagger.models.version>
<swagger.bootstrapui.version>1.9.2</swagger.bootstrapui.version>
<swagger.bootstrapui.version>1.9.3</swagger.bootstrapui.version>
<mybatis.plus.version>3.1.0</mybatis.plus.version>
<curator.framework.version>4.0.1</curator.framework.version>
<protostuff.version>1.6.0</protostuff.version>
<disruptor.version>3.4.2</disruptor.version>
<spring.boot.admin.version>2.0.2</spring.boot.admin.version>
<spring.boot.admin.version>2.1.4</spring.boot.admin.version>
<mica.auto.version>1.0.1</mica.auto.version>
<alibaba.cloud.version>0.2.1.RELEASE</alibaba.cloud.version>
<alibaba.cloud.version>0.9.0.RELEASE</alibaba.cloud.version>
<spring.boot.version>2.0.8.RELEASE</spring.boot.version>
<spring.cloud.version>Finchley.SR2</spring.cloud.version>
<spring.boot.version>2.1.4.RELEASE</spring.boot.version>
<spring.cloud.version>Greenwich.SR1</spring.cloud.version>
<spring.platform.version>Cairo-SR7</spring.platform.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>