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