diff --git a/common/mall-spring-boot-starter-swagger/pom.xml b/common/mall-spring-boot-starter-swagger/pom.xml
index ef0181466..7631d474d 100644
--- a/common/mall-spring-boot-starter-swagger/pom.xml
+++ b/common/mall-spring-boot-starter-swagger/pom.xml
@@ -12,6 +12,8 @@
mall-spring-boot-starter-swagger
+
+
org.springframework.boot
diff --git a/common/mall-spring-boot-starter-web/pom.xml b/common/mall-spring-boot-starter-web/pom.xml
index 67d81a9d1..80fd32f80 100644
--- a/common/mall-spring-boot-starter-web/pom.xml
+++ b/common/mall-spring-boot-starter-web/pom.xml
@@ -12,6 +12,13 @@
mall-spring-boot-starter-web
+
+
+ cn.iocoder.mall
+ system-rpc-api
+ 1.0-SNAPSHOT
+
+
org.springframework.boot
@@ -24,6 +31,12 @@
org.springframework.boot
spring-boot-starter-web
+
+
+
+ org.apache.dubbo
+ dubbo
+
diff --git a/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/config/CommonWebAutoConfiguration.java b/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/config/CommonWebAutoConfiguration.java
new file mode 100644
index 000000000..8a02892fa
--- /dev/null
+++ b/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/config/CommonWebAutoConfiguration.java
@@ -0,0 +1,23 @@
+package cn.iocoder.mall.web.config;
+
+import cn.iocoder.mall.web.interceptor.AccessLogInterceptor;
+import org.apache.dubbo.config.annotation.Reference;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) // TODO 芋艿,未来可能考虑 REACTIVE
+public class CommonWebAutoConfiguration implements WebMvcConfigurer {
+
+ @Reference(validation = "true", version = "${dubbo.consumer.AdminAccessLogService.version:1.0.0}")
+// @Reference(validation = "true", version = "1.0.0")
+// private SystemLogRPC systemLogRPC;
+
+ @Bean
+ public AccessLogInterceptor accessLogInterceptor() {
+ return new AccessLogInterceptor();
+ }
+
+}
diff --git a/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/handler/GlobalExceptionHandler.java b/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/handler/GlobalExceptionHandler.java
index 17f1f5c5d..9148e1e84 100644
--- a/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/handler/GlobalExceptionHandler.java
+++ b/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/handler/GlobalExceptionHandler.java
@@ -1,131 +1,103 @@
package cn.iocoder.mall.web.handler;
-import cn.iocoder.common.framework.constant.SysErrorCodeEnum;
-import cn.iocoder.common.framework.exception.ServiceException;
-import cn.iocoder.common.framework.util.ExceptionUtil;
-import cn.iocoder.common.framework.util.HttpUtil;
-import cn.iocoder.common.framework.util.MallUtil;
-import cn.iocoder.common.framework.vo.CommonResult;
-import cn.iocoder.mall.system.api.SystemLogService;
-import cn.iocoder.mall.system.api.dto.systemlog.AccessLogAddDTO;
-import cn.iocoder.mall.system.api.dto.systemlog.ExceptionLogAddDTO;
-import com.alibaba.fastjson.JSON;
-import io.micrometer.core.instrument.Counter;
-import io.micrometer.core.instrument.Metrics;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.dubbo.config.annotation.Reference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.util.Assert;
-import org.springframework.web.bind.MissingServletRequestParameterException;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.ConstraintViolationException;
-import java.util.Date;
-
-@ControllerAdvice
-public class GlobalExceptionHandler {
-
-// /**
-// * 异常总数 Metrics
-// */
-// private static final Counter EXCEPTION_COUNTER = Metrics.counter("mall.exception.total");
-
- private Logger logger = LoggerFactory.getLogger(getClass());
-
- @Value("${spring.application.name}")
- private String applicationName;
-
- @Reference(validation = "true", version = "${dubbo.consumer.AdminAccessLogService.version:1.0.0}")
- private SystemLogService systemLogService;
-
- // 逻辑异常
- @ResponseBody
- @ExceptionHandler(value = ServiceException.class)
- public CommonResult serviceExceptionHandler(HttpServletRequest req, ServiceException ex) {
- logger.debug("[serviceExceptionHandler]", ex);
- return CommonResult.error(ex.getCode(), ex.getMessage());
- }
-
- // Spring MVC 参数不正确
- @ResponseBody
- @ExceptionHandler(value = MissingServletRequestParameterException.class)
- public CommonResult missingServletRequestParameterExceptionHandler(HttpServletRequest req, MissingServletRequestParameterException ex) {
- logger.warn("[missingServletRequestParameterExceptionHandler]", ex);
- return CommonResult.error(SysErrorCodeEnum.MISSING_REQUEST_PARAM_ERROR.getCode(), SysErrorCodeEnum.MISSING_REQUEST_PARAM_ERROR.getMessage() + ":" + ex.getMessage());
- }
-
- @ResponseBody
- @ExceptionHandler(value = ConstraintViolationException.class)
- public CommonResult constraintViolationExceptionHandler(HttpServletRequest req, ConstraintViolationException ex) {
- logger.info("[constraintViolationExceptionHandler]", ex);
- // TODO 芋艿,后续要想一个更好的方式。
- // 拼接详细报错
- StringBuilder detailMessage = new StringBuilder("\n\n详细错误如下:");
- ex.getConstraintViolations().forEach(constraintViolation -> detailMessage.append("\n").append(constraintViolation.getMessage()));
- return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getMessage()
- + detailMessage.toString());
- }
-
- // TODO 芋艿,应该还有其它的异常,需要进行翻译
- @ResponseBody
- @ExceptionHandler(value = Exception.class)
- public CommonResult exceptionHandler(HttpServletRequest req, Exception e) {
- logger.error("[exceptionHandler]", e);
- // 插入异常日志
- ExceptionLogAddDTO exceptionLog = new ExceptionLogAddDTO();
- try {
- // 增加异常计数 metrics
- EXCEPTION_COUNTER.increment();
- // 初始化 exceptionLog
- initExceptionLog(exceptionLog, req, e);
- // 执行插入 exceptionLog
- addExceptionLog(exceptionLog);
- } catch (Throwable th) {
- logger.error("[exceptionHandler][插入访问日志({}) 发生异常({})", JSON.toJSONString(exceptionLog), ExceptionUtils.getRootCauseMessage(th));
- }
- // 返回 ERROR CommonResult
- return CommonResult.error(SysErrorCodeEnum.SYS_ERROR.getCode(), SysErrorCodeEnum.SYS_ERROR.getMessage());
- }
-
- private void initExceptionLog(ExceptionLogAddDTO exceptionLog, HttpServletRequest request, Exception e) {
- // 设置用户编号
- exceptionLog.setUserId(MallUtil.getUserId(request));
- if (exceptionLog.getUserId() == null) {
- exceptionLog.setUserId(AccessLogAddDTO.USER_ID_NULL);
- }
- exceptionLog.setUserType(MallUtil.getUserType(request));
- // 设置异常字段
- exceptionLog.setExceptionName(e.getClass().getName());
- exceptionLog.setExceptionMessage(ExceptionUtil.getMessage(e));
- exceptionLog.setExceptionRootCauseMessage(ExceptionUtil.getRootCauseMessage(e));
- exceptionLog.setExceptionStackTrace(ExceptionUtil.getStackTrace(e));
- StackTraceElement[] stackTraceElements = e.getStackTrace();
- Assert.notEmpty(stackTraceElements, "异常 stackTraceElements 不能为空");
- StackTraceElement stackTraceElement = stackTraceElements[0];
- exceptionLog.setExceptionClassName(stackTraceElement.getClassName());
- exceptionLog.setExceptionFileName(stackTraceElement.getFileName());
- exceptionLog.setExceptionMethodName(stackTraceElement.getMethodName());
- exceptionLog.setExceptionLineNumber(stackTraceElement.getLineNumber());
- // 设置其它字段
- exceptionLog.setTraceId(MallUtil.getTraceId())
- .setApplicationName(applicationName)
- .setUri(request.getRequestURI()) // TODO 提升:如果想要优化,可以使用 Swagger 的 @ApiOperation 注解。
- .setQueryString(HttpUtil.buildQueryString(request))
- .setMethod(request.getMethod())
- .setUserAgent(HttpUtil.getUserAgent(request))
- .setIp(HttpUtil.getIp(request))
- .setExceptionTime(new Date());
- }
-
- @Async
- public void addExceptionLog(ExceptionLogAddDTO exceptionLog) {
- systemLogService.addExceptionLog(exceptionLog);
- }
-
-}
+//@ControllerAdvice
+//public class GlobalExceptionHandler {
+//
+//// /**
+//// * 异常总数 Metrics
+//// */
+//// private static final Counter EXCEPTION_COUNTER = Metrics.counter("mall.exception.total");
+//
+// private Logger logger = LoggerFactory.getLogger(getClass());
+//
+// @Value("${spring.application.name}")
+// private String applicationName;
+//
+// @Reference(validation = "true", version = "${dubbo.consumer.AdminAccessLogService.version:1.0.0}")
+// private SystemLogService systemLogService;
+//
+// // 逻辑异常
+// @ResponseBody
+// @ExceptionHandler(value = ServiceException.class)
+// public CommonResult serviceExceptionHandler(HttpServletRequest req, ServiceException ex) {
+// logger.debug("[serviceExceptionHandler]", ex);
+// return CommonResult.error(ex.getCode(), ex.getMessage());
+// }
+//
+// // Spring MVC 参数不正确
+// @ResponseBody
+// @ExceptionHandler(value = MissingServletRequestParameterException.class)
+// public CommonResult missingServletRequestParameterExceptionHandler(HttpServletRequest req, MissingServletRequestParameterException ex) {
+// logger.warn("[missingServletRequestParameterExceptionHandler]", ex);
+// return CommonResult.error(SysErrorCodeEnum.MISSING_REQUEST_PARAM_ERROR.getCode(), SysErrorCodeEnum.MISSING_REQUEST_PARAM_ERROR.getMessage() + ":" + ex.getMessage());
+// }
+//
+// @ResponseBody
+// @ExceptionHandler(value = ConstraintViolationException.class)
+// public CommonResult constraintViolationExceptionHandler(HttpServletRequest req, ConstraintViolationException ex) {
+// logger.info("[constraintViolationExceptionHandler]", ex);
+// // TODO 芋艿,后续要想一个更好的方式。
+// // 拼接详细报错
+// StringBuilder detailMessage = new StringBuilder("\n\n详细错误如下:");
+// ex.getConstraintViolations().forEach(constraintViolation -> detailMessage.append("\n").append(constraintViolation.getMessage()));
+// return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getMessage()
+// + detailMessage.toString());
+// }
+//
+// // TODO 芋艿,应该还有其它的异常,需要进行翻译
+// @ResponseBody
+// @ExceptionHandler(value = Exception.class)
+// public CommonResult exceptionHandler(HttpServletRequest req, Exception e) {
+// logger.error("[exceptionHandler]", e);
+// // 插入异常日志
+// ExceptionLogAddDTO exceptionLog = new ExceptionLogAddDTO();
+// try {
+// // 增加异常计数 metrics
+// EXCEPTION_COUNTER.increment();
+// // 初始化 exceptionLog
+// initExceptionLog(exceptionLog, req, e);
+// // 执行插入 exceptionLog
+// addExceptionLog(exceptionLog);
+// } catch (Throwable th) {
+// logger.error("[exceptionHandler][插入访问日志({}) 发生异常({})", JSON.toJSONString(exceptionLog), ExceptionUtils.getRootCauseMessage(th));
+// }
+// // 返回 ERROR CommonResult
+// return CommonResult.error(SysErrorCodeEnum.SYS_ERROR.getCode(), SysErrorCodeEnum.SYS_ERROR.getMessage());
+// }
+//
+// private void initExceptionLog(ExceptionLogAddDTO exceptionLog, HttpServletRequest request, Exception e) {
+// // 设置用户编号
+// exceptionLog.setUserId(MallUtil.getUserId(request));
+// if (exceptionLog.getUserId() == null) {
+// exceptionLog.setUserId(AccessLogAddDTO.USER_ID_NULL);
+// }
+// exceptionLog.setUserType(MallUtil.getUserType(request));
+// // 设置异常字段
+// exceptionLog.setExceptionName(e.getClass().getName());
+// exceptionLog.setExceptionMessage(ExceptionUtil.getMessage(e));
+// exceptionLog.setExceptionRootCauseMessage(ExceptionUtil.getRootCauseMessage(e));
+// exceptionLog.setExceptionStackTrace(ExceptionUtil.getStackTrace(e));
+// StackTraceElement[] stackTraceElements = e.getStackTrace();
+// Assert.notEmpty(stackTraceElements, "异常 stackTraceElements 不能为空");
+// StackTraceElement stackTraceElement = stackTraceElements[0];
+// exceptionLog.setExceptionClassName(stackTraceElement.getClassName());
+// exceptionLog.setExceptionFileName(stackTraceElement.getFileName());
+// exceptionLog.setExceptionMethodName(stackTraceElement.getMethodName());
+// exceptionLog.setExceptionLineNumber(stackTraceElement.getLineNumber());
+// // 设置其它字段
+// exceptionLog.setTraceId(MallUtil.getTraceId())
+// .setApplicationName(applicationName)
+// .setUri(request.getRequestURI()) // TODO 提升:如果想要优化,可以使用 Swagger 的 @ApiOperation 注解。
+// .setQueryString(HttpUtil.buildQueryString(request))
+// .setMethod(request.getMethod())
+// .setUserAgent(HttpUtil.getUserAgent(request))
+// .setIp(HttpUtil.getIp(request))
+// .setExceptionTime(new Date());
+// }
+//
+// @Async
+// public void addExceptionLog(ExceptionLogAddDTO exceptionLog) {
+// systemLogService.addExceptionLog(exceptionLog);
+// }
+//
+//}
diff --git a/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/handler/GlobalResponseBodyHandler.java b/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/handler/GlobalResponseBodyHandler.java
index 5e5c299d6..f86aed51b 100644
--- a/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/handler/GlobalResponseBodyHandler.java
+++ b/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/handler/GlobalResponseBodyHandler.java
@@ -1,31 +1,21 @@
package cn.iocoder.mall.web.handler;
-import cn.iocoder.common.framework.util.MallUtil;
-import cn.iocoder.common.framework.vo.CommonResult;
-import org.springframework.core.MethodParameter;
-import org.springframework.http.MediaType;
-import org.springframework.http.server.ServerHttpRequest;
-import org.springframework.http.server.ServerHttpResponse;
-import org.springframework.http.server.ServletServerHttpRequest;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
-
-@ControllerAdvice
-public class GlobalResponseBodyHandler implements ResponseBodyAdvice {
-
- @Override
- public boolean supports(MethodParameter returnType, Class converterType) {
- if (returnType.getMethod() == null) {
- return false;
- }
- return returnType.getMethod().getReturnType() == CommonResult.class;
- }
-
- @Override
- public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType,
- ServerHttpRequest request, ServerHttpResponse response) {
- MallUtil.setCommonResult(((ServletServerHttpRequest) request).getServletRequest(), (CommonResult) body);
- return body;
- }
-
-}
+//@ControllerAdvice
+//public class GlobalResponseBodyHandler implements ResponseBodyAdvice {
+//
+// @Override
+// public boolean supports(MethodParameter returnType, Class converterType) {
+// if (returnType.getMethod() == null) {
+// return false;
+// }
+// return returnType.getMethod().getReturnType() == CommonResult.class;
+// }
+//
+// @Override
+// public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType,
+// ServerHttpRequest request, ServerHttpResponse response) {
+// MallUtil.setCommonResult(((ServletServerHttpRequest) request).getServletRequest(), (CommonResult) body);
+// return body;
+// }
+//
+//}
diff --git a/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/interceptor/AccessLogInterceptor.java b/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/interceptor/AccessLogInterceptor.java
index 82157c8d2..c095333ff 100644
--- a/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/interceptor/AccessLogInterceptor.java
+++ b/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/interceptor/AccessLogInterceptor.java
@@ -1,102 +1,102 @@
package cn.iocoder.mall.web.interceptor;
-import cn.iocoder.common.framework.util.HttpUtil;
-import cn.iocoder.common.framework.util.MallUtil;
-import cn.iocoder.common.framework.vo.CommonResult;
-import cn.iocoder.mall.system.api.SystemLogService;
-import cn.iocoder.mall.system.api.dto.systemlog.AccessLogAddDTO;
-import com.alibaba.fastjson.JSON;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.dubbo.config.annotation.Reference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
-import org.springframework.util.Assert;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.Date;
-
/**
* 访问日志拦截器
*/
-@Component
-public class AccessLogInterceptor extends HandlerInterceptorAdapter {
+public class AccessLogInterceptor extends HandlerInterceptorAdapter implements InitializingBean, ApplicationContextAware {
- private Logger logger = LoggerFactory.getLogger(getClass());
+ private ApplicationContext context;
- /**
- * 开始时间
- */
- private static final ThreadLocal START_TIME = new ThreadLocal<>();
-
- @Reference(validation = "true", version = "${dubbo.consumer.AdminAccessLogService.version:1.0.0}")
- private SystemLogService systemAccessLogService;
-
- @Value("${spring.application.name}")
- private String applicationName;
+//
+// private Logger logger = LoggerFactory.getLogger(getClass());
+//
+// /**
+// * 开始时间
+// */
+// private static final ThreadLocal START_TIME = new ThreadLocal<>();
+//
+// @Reference(validation = "true", version = "${dubbo.consumer.AdminAccessLogService.version:1.0.0}")
+// private SystemLogService systemAccessLogService;
+//
+// @Value("${spring.application.name}")
+// private String applicationName;
+//
+// @Override
+// public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+// // 记录当前时间
+// START_TIME.set(new Date());
+// return true;
+// }
+//
+// @Override
+// public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
+// AccessLogAddDTO accessLog = new AccessLogAddDTO();
+// try {
+// // 初始化 accessLog
+// initAccessLog(accessLog, request);
+// // 执行插入 accessLog
+// addAccessLog(accessLog);
+// // TODO 提升:暂时不考虑 ELK 的方案。而是基于 MySQL 存储。如果访问日志比较多,需要定期归档。
+// } catch (Throwable th) {
+// logger.error("[afterCompletion][插入访问日志({}) 发生异常({})", JSON.toJSONString(accessLog), ExceptionUtils.getRootCauseMessage(th));
+// } finally {
+// clear();
+// }
+// }
+//
+// private void initAccessLog(AccessLogAddDTO accessLog, HttpServletRequest request) {
+// // 设置用户编号
+// accessLog.setUserId(MallUtil.getUserId(request));
+// if (accessLog.getUserId() == null) {
+// accessLog.setUserId(AccessLogAddDTO.USER_ID_NULL);
+// }
+// accessLog.setUserType(MallUtil.getUserType(request));
+// // 设置访问结果
+// CommonResult result = MallUtil.getCommonResult(request);
+// Assert.isTrue(result != null, "result 必须非空");
+// accessLog.setErrorCode(result.getCode())
+// .setErrorMessage(result.getMessage());
+// // 设置其它字段
+// accessLog.setTraceId(MallUtil.getTraceId())
+// .setApplicationName(applicationName)
+// .setUri(request.getRequestURI()) // TODO 提升:如果想要优化,可以使用 Swagger 的 @ApiOperation 注解。
+// .setQueryString(HttpUtil.buildQueryString(request))
+// .setMethod(request.getMethod())
+// .setUserAgent(HttpUtil.getUserAgent(request))
+// .setIp(HttpUtil.getIp(request))
+// .setStartTime(START_TIME.get())
+// .setResponseTime((int) (System.currentTimeMillis() - accessLog.getStartTime().getTime())); // 默认响应时间设为 0
+// }
+//
+// @Async // 异步入库
+// public void addAccessLog(AccessLogAddDTO accessLog) {
+// try {
+// systemAccessLogService.addAccessLog(accessLog);
+// } catch (Throwable th) {
+// logger.error("[addAccessLog][插入访问日志({}) 发生异常({})", JSON.toJSONString(accessLog), ExceptionUtils.getRootCauseMessage(th));
+// }
+// }
+//
+// private static void clear() {
+// START_TIME.remove();
+// }
+//
@Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
- // 记录当前时间
- START_TIME.set(new Date());
- return true;
+ public void setApplicationContext(ApplicationContext context) throws BeansException {
+ this.context = context;
}
@Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
- AccessLogAddDTO accessLog = new AccessLogAddDTO();
- try {
- // 初始化 accessLog
- initAccessLog(accessLog, request);
- // 执行插入 accessLog
- addAccessLog(accessLog);
- // TODO 提升:暂时不考虑 ELK 的方案。而是基于 MySQL 存储。如果访问日志比较多,需要定期归档。
- } catch (Throwable th) {
- logger.error("[afterCompletion][插入访问日志({}) 发生异常({})", JSON.toJSONString(accessLog), ExceptionUtils.getRootCauseMessage(th));
- } finally {
- clear();
- }
+ public void afterPropertiesSet() throws Exception {
+ System.out.println();
}
- private void initAccessLog(AccessLogAddDTO accessLog, HttpServletRequest request) {
- // 设置用户编号
- accessLog.setUserId(MallUtil.getUserId(request));
- if (accessLog.getUserId() == null) {
- accessLog.setUserId(AccessLogAddDTO.USER_ID_NULL);
- }
- accessLog.setUserType(MallUtil.getUserType(request));
- // 设置访问结果
- CommonResult result = MallUtil.getCommonResult(request);
- Assert.isTrue(result != null, "result 必须非空");
- accessLog.setErrorCode(result.getCode())
- .setErrorMessage(result.getMessage());
- // 设置其它字段
- accessLog.setTraceId(MallUtil.getTraceId())
- .setApplicationName(applicationName)
- .setUri(request.getRequestURI()) // TODO 提升:如果想要优化,可以使用 Swagger 的 @ApiOperation 注解。
- .setQueryString(HttpUtil.buildQueryString(request))
- .setMethod(request.getMethod())
- .setUserAgent(HttpUtil.getUserAgent(request))
- .setIp(HttpUtil.getIp(request))
- .setStartTime(START_TIME.get())
- .setResponseTime((int) (System.currentTimeMillis() - accessLog.getStartTime().getTime())); // 默认响应时间设为 0
- }
-
- @Async // 异步入库
- public void addAccessLog(AccessLogAddDTO accessLog) {
- try {
- systemAccessLogService.addAccessLog(accessLog);
- } catch (Throwable th) {
- logger.error("[addAccessLog][插入访问日志({}) 发生异常({})", JSON.toJSONString(accessLog), ExceptionUtils.getRootCauseMessage(th));
- }
- }
-
- private static void clear() {
- START_TIME.remove();
- }
}
diff --git a/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/package-info.java b/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/package-info.java
deleted file mode 100644
index 91d892c18..000000000
--- a/common/mall-spring-boot-starter-web/src/main/java/cn/iocoder/mall/web/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package cn.iocoder.mall.web;
diff --git a/common/mall-spring-boot-starter-web/src/main/resources/META-INF/spring.factories b/common/mall-spring-boot-starter-web/src/main/resources/META-INF/spring.factories
new file mode 100644
index 000000000..b8d5b9558
--- /dev/null
+++ b/common/mall-spring-boot-starter-web/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ cn.iocoder.mall.web.config.CommonWebAutoConfiguration
diff --git a/system/system-application/src/main/resources/application.yaml b/system/system-application/src/main/resources/application.yaml
index c8cf31ac4..412190a61 100644
--- a/system/system-application/src/main/resources/application.yaml
+++ b/system/system-application/src/main/resources/application.yaml
@@ -4,4 +4,4 @@ spring:
name: admin-application
# Profile 的配置项
profiles:
- active: test
+ active: local
diff --git a/system/system-rest/pom.xml b/system/system-rest/pom.xml
index 224d9caad..c38f41f11 100644
--- a/system/system-rest/pom.xml
+++ b/system/system-rest/pom.xml
@@ -22,14 +22,17 @@
- org.springframework.boot
- spring-boot-starter-web
+ cn.iocoder.mall
+ mall-spring-boot-starter-web
+ 1.0-SNAPSHOT
cn.iocoder.mall
mall-spring-boot-starter-swagger
1.0-SNAPSHOT
+
+
com.qiniu
qiniu-java-sdk
diff --git a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/admin/AdminsFileController.java b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/admin/AdminsFileController.java
index d752c492d..e9f1ec955 100644
--- a/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/admin/AdminsFileController.java
+++ b/system/system-rest/src/main/java/cn/iocoder/mall/system/rest/controller/admin/AdminsFileController.java
@@ -9,7 +9,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
/**
* 文件模块(Admins API)
@@ -17,7 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
* author: sin
* time: 2020/4/20 9:41 上午
*/
-@RestController
+//@RestController
@RequestMapping("admins/file")
@Api(tags = "文件模块")
public class AdminsFileController {
diff --git a/user/pom.xml b/user/pom.xml
index cb5bb156e..473e4ed14 100644
--- a/user/pom.xml
+++ b/user/pom.xml
@@ -12,17 +12,21 @@
user
pom
+
+
+
+
user-application
- user-service-api
- user-sdk
- user-service-impl
+ user-rest
+ user-rpc
+ user-rpc-api
cn.iocoder.mall
- common-dependencies
+ mall-dependencies
1.0-SNAPSHOT
pom
import
diff --git a/user/user-application/pom.xml b/user/user-application/pom.xml
index 8d03b56d6..2ad3fbe84 100644
--- a/user/user-application/pom.xml
+++ b/user/user-application/pom.xml
@@ -11,97 +11,20 @@
user-application
-
-
cn.iocoder.mall
- common-framework
+ user-rest
1.0-SNAPSHOT
cn.iocoder.mall
- mall-spring-boot
- 1.0-SNAPSHOT
-
-
- cn.iocoder.mall
- user-service-api
- 1.0-SNAPSHOT
-
-
- cn.iocoder.mall
- user-service-impl
- 1.0-SNAPSHOT
-
-
- cn.iocoder.mall
- system-sdk
- 1.0-SNAPSHOT
-
-
- cn.iocoder.mall
- user-sdk
+ user-rpc
1.0-SNAPSHOT
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
-
- io.springfox
- springfox-swagger2
-
-
- com.github.xiaoymin
- swagger-bootstrap-ui
-
-
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-sentinel
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
-
- io.micrometer
- micrometer-registry-prometheus
-
-
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
-
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/UserApplication.java b/user/user-application/src/main/java/cn/iocoder/mall/user/application/UserApplication.java
index 665799e44..3f2c76258 100644
--- a/user/user-application/src/main/java/cn/iocoder/mall/user/application/UserApplication.java
+++ b/user/user-application/src/main/java/cn/iocoder/mall/user/application/UserApplication.java
@@ -2,13 +2,22 @@ package cn.iocoder.mall.user.application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.boot.context.config.ConfigFileApplicationListener;
-@SpringBootApplication(scanBasePackages = {"cn.iocoder.mall.user"})
-@EnableAsync(proxyTargetClass = true)
+@SpringBootApplication(scanBasePackages = {"cn.iocoder.mall.system"})
public class UserApplication {
+ /**
+ * 设置需要读取的配置文件的名字。
+ * 基于 {@link org.springframework.boot.context.config.ConfigFileApplicationListener#CONFIG_NAME_PROPERTY} 实现。
+ */
+ private static final String CONFIG_NAME_VALUE = "biz,rest,rpc,application";
+
public static void main(String[] args) {
+ // 设置环境变量
+ System.setProperty(ConfigFileApplicationListener.CONFIG_NAME_PROPERTY, CONFIG_NAME_VALUE);
+
+ // 启动 Spring Boot 应用
SpringApplication.run(UserApplication.class, args);
}
diff --git a/user/user-application/src/main/resources/application.yaml b/user/user-application/src/main/resources/application.yaml
index f725f54e1..d4ef580c6 100644
--- a/user/user-application/src/main/resources/application.yaml
+++ b/user/user-application/src/main/resources/application.yaml
@@ -1,32 +1,8 @@
spring:
+ # Application 的配置项
application:
name: user-application
+ # Profile 的配置项
+ profiles:
+ active: local
- # Spring Cloud 配置项
- cloud:
- # Spring Cloud Sentinel 配置项
- sentinel:
- transport:
- dashboard: s1.iocoder.cn:12088 # Sentinel Dashboard 服务地址
- eager: true # 项目启动时,直接连接到 Sentinel
-
-# server
-server:
- port: 18082
- servlet:
- context-path: /user-api/
-
-swagger:
- enable: true # 暂时不去掉
- title: 用户子系统
- description: 用户子系统
- version: 1.0.0
- base-package: cn.iocoder.mall.user.application.controller
-
-management:
- endpoints:
- web:
- exposure:
- include: health,info,env,metrics,prometheus
- metrics:
- enabled: true
diff --git a/user/user-rest/pom.xml b/user/user-rest/pom.xml
new file mode 100644
index 000000000..133475a28
--- /dev/null
+++ b/user/user-rest/pom.xml
@@ -0,0 +1,32 @@
+
+
+
+ user
+ cn.iocoder.mall
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ user-rest
+
+
+
+
+
+
+
+
+
+
+
+ cn.iocoder.mall
+ mall-spring-boot-starter-web
+ 1.0-SNAPSHOT
+
+
+
+
+
+
diff --git a/user/user-rest/src/main/resources/rest.yaml b/user/user-rest/src/main/resources/rest.yaml
new file mode 100644
index 000000000..d193b39e4
--- /dev/null
+++ b/user/user-rest/src/main/resources/rest.yaml
@@ -0,0 +1,12 @@
+# 服务器的配置项
+server:
+ port: 18082
+ servlet:
+ context-path: /user-api/
+
+# Swagger 配置项
+swagger:
+ title: 用户子系统
+ description: 用户子系统
+ version: 1.0.0
+ base-package: cn.iocoder.mall.user.rest.controller
diff --git a/user/user-rpc-api/pom.xml b/user/user-rpc-api/pom.xml
new file mode 100644
index 000000000..5943fb0af
--- /dev/null
+++ b/user/user-rpc-api/pom.xml
@@ -0,0 +1,30 @@
+
+
+
+ user
+ cn.iocoder.mall
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ user-rpc-api
+
+
+
+
+ cn.iocoder.mall
+ common-framework
+ 1.0-SNAPSHOT
+
+
+
+
+ javax.validation
+ validation-api
+
+
+
+
+
diff --git a/user/user-rpc/pom.xml b/user/user-rpc/pom.xml
new file mode 100644
index 000000000..e6761a4be
--- /dev/null
+++ b/user/user-rpc/pom.xml
@@ -0,0 +1,45 @@
+
+
+
+ user
+ cn.iocoder.mall
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ user-rpc
+
+
+
+
+ cn.iocoder.mall
+ system-rpc-api
+ 1.0-SNAPSHOT
+
+
+ cn.iocoder.mall
+ user-rpc-api
+ 1.0-SNAPSHOT
+
+
+
+
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-dubbo
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
diff --git a/user/user-rpc/src/main/resources/rpc-local.yaml b/user/user-rpc/src/main/resources/rpc-local.yaml
new file mode 100644
index 000000000..e056170af
--- /dev/null
+++ b/user/user-rpc/src/main/resources/rpc-local.yaml
@@ -0,0 +1,14 @@
+spring:
+ # Spring Cloud 配置项
+ cloud:
+ nacos:
+ # Spring Cloud Nacos Discovery 配置项
+ discovery:
+ server-addr: s1.iocoder.cn:8848 # Nacos 服务器地址
+ namespace: local # Nacos 命名空间
+
+# Dubbo 配置项
+dubbo:
+ # Dubbo 注册中心
+ registry:
+ address: spring-cloud://s1.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址
diff --git a/user/user-rpc/src/main/resources/rpc-test.yaml b/user/user-rpc/src/main/resources/rpc-test.yaml
new file mode 100644
index 000000000..d3d0e9e69
--- /dev/null
+++ b/user/user-rpc/src/main/resources/rpc-test.yaml
@@ -0,0 +1,14 @@
+spring:
+ # Spring Cloud 配置项
+ cloud:
+ nacos:
+ # Spring Cloud Nacos Discovery 配置项
+ discovery:
+ server-addr: s1.iocoder.cn:8848 # Nacos 服务器地址
+ namespace: test # Nacos 命名空间
+
+# Dubbo 配置项
+dubbo:
+ # Dubbo 注册中心
+ registry:
+ address: spring-cloud://s1.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址
diff --git a/user/user-rpc/src/main/resources/rpc.yaml b/user/user-rpc/src/main/resources/rpc.yaml
new file mode 100644
index 000000000..45f28657f
--- /dev/null
+++ b/user/user-rpc/src/main/resources/rpc.yaml
@@ -0,0 +1,17 @@
+# Dubbo 配置项
+dubbo:
+ # Spring Cloud Alibaba Dubbo 专属配置
+ cloud:
+ subscribed-services: system-application # 设置订阅的应用列表,默认为 * 订阅所有应用
+ # Dubbo 提供者的协议
+ protocol:
+ name: dubbo
+ port: -1
+ # Dubbo 提供服务的扫描基础包
+ scan:
+ base-packages: cn.iocoder.mall.user.rpc.rpc
+ # Dubbo 服务提供者的配置
+ provider:
+ filter: -exception
+ SystemLogRPC:
+ version: 1.0.0
diff --git a/user/user-start/pom.xml b/user/user-start/pom.xml
new file mode 100644
index 000000000..8d03b56d6
--- /dev/null
+++ b/user/user-start/pom.xml
@@ -0,0 +1,107 @@
+
+
+
+ user
+ cn.iocoder.mall
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ user-application
+
+
+
+
+
+
+
+ cn.iocoder.mall
+ common-framework
+ 1.0-SNAPSHOT
+
+
+ cn.iocoder.mall
+ mall-spring-boot
+ 1.0-SNAPSHOT
+
+
+ cn.iocoder.mall
+ user-service-api
+ 1.0-SNAPSHOT
+
+
+ cn.iocoder.mall
+ user-service-impl
+ 1.0-SNAPSHOT
+
+
+ cn.iocoder.mall
+ system-sdk
+ 1.0-SNAPSHOT
+
+
+ cn.iocoder.mall
+ user-sdk
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ io.springfox
+ springfox-swagger2
+
+
+ com.github.xiaoymin
+ swagger-bootstrap-ui
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+ io.micrometer
+ micrometer-registry-prometheus
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/user/user-start/src/main/java/cn/iocoder/mall/user/application/UserApplication.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/UserApplication.java
new file mode 100644
index 000000000..665799e44
--- /dev/null
+++ b/user/user-start/src/main/java/cn/iocoder/mall/user/application/UserApplication.java
@@ -0,0 +1,15 @@
+package cn.iocoder.mall.user.application;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootApplication(scanBasePackages = {"cn.iocoder.mall.user"})
+@EnableAsync(proxyTargetClass = true)
+public class UserApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(UserApplication.class, args);
+ }
+
+}
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/controller/admins/AdminsUserController.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/controller/admins/AdminsUserController.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/controller/admins/AdminsUserController.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/controller/admins/AdminsUserController.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/controller/users/PassportController.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/controller/users/PassportController.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/controller/users/PassportController.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/controller/users/PassportController.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/controller/users/UserAddressController.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/controller/users/UserAddressController.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/controller/users/UserAddressController.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/controller/users/UserAddressController.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/controller/users/UserController.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/controller/users/UserController.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/controller/users/UserController.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/controller/users/UserController.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/convert/UserAddressConvert.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/convert/UserAddressConvert.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/convert/UserAddressConvert.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/convert/UserAddressConvert.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/convert/UserConvert.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/convert/UserConvert.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/convert/UserConvert.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/convert/UserConvert.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/po/UserAddressAddPO.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/po/UserAddressAddPO.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/po/UserAddressAddPO.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/po/UserAddressAddPO.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/po/UserAddressUpdatePO.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/po/UserAddressUpdatePO.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/po/UserAddressUpdatePO.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/po/UserAddressUpdatePO.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/vo/admins/AdminsUserPageVO.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/vo/admins/AdminsUserPageVO.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/vo/admins/AdminsUserPageVO.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/vo/admins/AdminsUserPageVO.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/vo/admins/AdminsUserVO.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/vo/admins/AdminsUserVO.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/vo/admins/AdminsUserVO.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/vo/admins/AdminsUserVO.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersAccessTokenVO.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersAccessTokenVO.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersAccessTokenVO.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersAccessTokenVO.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersMobileRegisterVO.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersMobileRegisterVO.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersMobileRegisterVO.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersMobileRegisterVO.java
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersUserVO.java b/user/user-start/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersUserVO.java
similarity index 100%
rename from user/user-application/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersUserVO.java
rename to user/user-start/src/main/java/cn/iocoder/mall/user/application/vo/users/UsersUserVO.java
diff --git a/user/user-application/src/main/resources/application-test.yaml b/user/user-start/src/main/resources/application-test.yaml
similarity index 100%
rename from user/user-application/src/main/resources/application-test.yaml
rename to user/user-start/src/main/resources/application-test.yaml
diff --git a/user/user-start/src/main/resources/application.yaml b/user/user-start/src/main/resources/application.yaml
new file mode 100644
index 000000000..f725f54e1
--- /dev/null
+++ b/user/user-start/src/main/resources/application.yaml
@@ -0,0 +1,32 @@
+spring:
+ application:
+ name: user-application
+
+ # Spring Cloud 配置项
+ cloud:
+ # Spring Cloud Sentinel 配置项
+ sentinel:
+ transport:
+ dashboard: s1.iocoder.cn:12088 # Sentinel Dashboard 服务地址
+ eager: true # 项目启动时,直接连接到 Sentinel
+
+# server
+server:
+ port: 18082
+ servlet:
+ context-path: /user-api/
+
+swagger:
+ enable: true # 暂时不去掉
+ title: 用户子系统
+ description: 用户子系统
+ version: 1.0.0
+ base-package: cn.iocoder.mall.user.application.controller
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: health,info,env,metrics,prometheus
+ metrics:
+ enabled: true