diff --git a/milkbox-app/src/main/java/top/milkbox/Application.java b/milkbox-app/src/main/java/top/milkbox/Application.java index 2b378d43f113275eaa40036bed74ace3f8787486..37e8e2ca39cc5b9a8e90422a2dd6716e08105e67 100644 --- a/milkbox-app/src/main/java/top/milkbox/Application.java +++ b/milkbox-app/src/main/java/top/milkbox/Application.java @@ -10,12 +10,13 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import top.milkbox.pojo.CommonResult; +import top.milkbox.common.pojo.CommonResult; import java.util.Date; import java.util.TimeZone; /** + * springboot启动类,注意这个类必须在top.milkbox包下面,不能再往里了 * 创建时间: 2023-12-26 下午 5:54 * * @author milkbox diff --git a/milkbox-app/src/main/java/top/milkbox/core/config/CommonConfiguration.java b/milkbox-app/src/main/java/top/milkbox/app/core/config/CommonConfiguration.java similarity index 75% rename from milkbox-app/src/main/java/top/milkbox/core/config/CommonConfiguration.java rename to milkbox-app/src/main/java/top/milkbox/app/core/config/CommonConfiguration.java index e0c08752ca0a06d4b9b9babd0e9b5295f742ad18..56ad6b7767f6971df4f4b7dafdef459e213d0400 100644 --- a/milkbox-app/src/main/java/top/milkbox/core/config/CommonConfiguration.java +++ b/milkbox-app/src/main/java/top/milkbox/app/core/config/CommonConfiguration.java @@ -1,4 +1,4 @@ -package top.milkbox.core.config; +package top.milkbox.app.core.config; import org.springframework.context.annotation.Configuration; diff --git a/milkbox-app/src/main/java/top/milkbox/core/config/MybatisPlusConfig.java b/milkbox-app/src/main/java/top/milkbox/app/core/config/MybatisPlusConfig.java similarity index 96% rename from milkbox-app/src/main/java/top/milkbox/core/config/MybatisPlusConfig.java rename to milkbox-app/src/main/java/top/milkbox/app/core/config/MybatisPlusConfig.java index 6b5c37f982a0bf4d8fd8720cb8f945c140db2d3d..f17188ed2f6ed2bd4e04fdea3ab568031d8c9811 100644 --- a/milkbox-app/src/main/java/top/milkbox/core/config/MybatisPlusConfig.java +++ b/milkbox-app/src/main/java/top/milkbox/app/core/config/MybatisPlusConfig.java @@ -1,4 +1,4 @@ -package top.milkbox.core.config; +package top.milkbox.app.core.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; diff --git a/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java b/milkbox-app/src/main/java/top/milkbox/app/core/handler/GlobalControllerAdvice.java similarity index 94% rename from milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java rename to milkbox-app/src/main/java/top/milkbox/app/core/handler/GlobalControllerAdvice.java index cb7a5310bb043f5caf6edbd6078f805e8a8fb952..1636594adfd1f2ed6db27fb68f3c28450b23e440 100644 --- a/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java +++ b/milkbox-app/src/main/java/top/milkbox/app/core/handler/GlobalControllerAdvice.java @@ -1,4 +1,4 @@ -package top.milkbox.core.handler; +package top.milkbox.app.core.handler; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; @@ -8,9 +8,9 @@ import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import org.springframework.web.method.annotation.HandlerMethodValidationException; -import top.milkbox.enums.CommonStatusCodeEnum; -import top.milkbox.exceprion.CommonServiceException; -import top.milkbox.pojo.CommonResult; +import top.milkbox.common.enums.CommonStatusCodeEnum; +import top.milkbox.common.exceprion.CommonServiceException; +import top.milkbox.common.pojo.CommonResult; import java.util.Arrays; @@ -83,7 +83,7 @@ public class GlobalControllerAdvice { // 请求参数的格式错误 else if (exception instanceof HttpMessageNotReadableException httpMessageNotReadableException) { String errorMessage = "请求参数格式错误(" + httpMessageNotReadableException.getMessage() + ")"; - log.warn(errorMessage, exception); + log.warn(errorMessage); return new CommonResult<>(CommonStatusCodeEnum.ERROR415.getCode(), CommonStatusCodeEnum.ERROR415.getMessage(), errorMessage); } diff --git a/milkbox-app/src/main/java/top/milkbox/core/handler/mybatisPlus/MyMetaObjectHandler.java b/milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java similarity index 92% rename from milkbox-app/src/main/java/top/milkbox/core/handler/mybatisPlus/MyMetaObjectHandler.java rename to milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java index 6e45b9bb5228380b53f2fd9d7988ec59335b7539..a425dcb21a2240057232153e22e0ebc648381471 100644 --- a/milkbox-app/src/main/java/top/milkbox/core/handler/mybatisPlus/MyMetaObjectHandler.java +++ b/milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java @@ -1,10 +1,10 @@ -package top.milkbox.core.handler.mybatisPlus; +package top.milkbox.app.core.handler.mybatisPlus; import cn.hutool.core.date.DateTime; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; -import top.milkbox.enums.CommonDeleteFlagEnum; +import top.milkbox.common.enums.CommonDeleteFlagEnum; import java.util.Date; diff --git a/milkbox-common/src/main/java/top/milkbox/common/annotation/CommonLog.java b/milkbox-common/src/main/java/top/milkbox/common/annotation/CommonLog.java new file mode 100644 index 0000000000000000000000000000000000000000..a093ef229cd98fa72e80c90448a0d4ec8d01b7f9 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/annotation/CommonLog.java @@ -0,0 +1,46 @@ +package top.milkbox.common.annotation; + +import top.milkbox.common.enums.LogLevelEnum; +import top.milkbox.common.enums.LogTypeEnum; + +import java.lang.annotation.*; + +/** + * 创建时间: 2024-01-19 下午 2:06 + * + * @author milkbox + */ +@Documented +@Target(ElementType.METHOD) // 仅作用于方法上 +@Retention(RetentionPolicy.RUNTIME) +public @interface CommonLog { + + /** + * 日志名称 + */ + String value() default ""; + + /** + * 日志级别 + * + * @return 默认返回INFO级别 + */ + LogLevelEnum level() default LogLevelEnum.INFO; + + /** + * 日志的详细描述 + */ + String description() default ""; + + /** + * 模块名称 + */ + String module() default ""; + + /** + * 日志的类型 + * + * @return 默认返回空 + */ + LogTypeEnum type() default LogTypeEnum.NOT; +} diff --git a/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java b/milkbox-common/src/main/java/top/milkbox/common/enums/CommonDeleteFlagEnum.java similarity index 92% rename from milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java rename to milkbox-common/src/main/java/top/milkbox/common/enums/CommonDeleteFlagEnum.java index 824a6d65bc0dd927c07c15d713adc8db80812c9f..fda145a0fbb2ae324c0235eb97062971915b20c7 100644 --- a/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java +++ b/milkbox-common/src/main/java/top/milkbox/common/enums/CommonDeleteFlagEnum.java @@ -1,4 +1,4 @@ -package top.milkbox.enums; +package top.milkbox.common.enums; import com.baomidou.mybatisplus.annotation.IEnum; import lombok.AllArgsConstructor; diff --git a/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java b/milkbox-common/src/main/java/top/milkbox/common/enums/CommonSortTypeEnum.java similarity index 87% rename from milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java rename to milkbox-common/src/main/java/top/milkbox/common/enums/CommonSortTypeEnum.java index 83c8678fa68ff5280a999e6317b36479f93b36ac..8297ecabf5ff0695f1cad83b28643b1e0169f336 100644 --- a/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java +++ b/milkbox-common/src/main/java/top/milkbox/common/enums/CommonSortTypeEnum.java @@ -1,8 +1,8 @@ -package top.milkbox.enums; +package top.milkbox.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; -import top.milkbox.exceprion.CommonServiceException; +import top.milkbox.common.exceprion.CommonServiceException; /** * 排序方式枚举 diff --git a/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java b/milkbox-common/src/main/java/top/milkbox/common/enums/CommonStatusCodeEnum.java similarity index 87% rename from milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java rename to milkbox-common/src/main/java/top/milkbox/common/enums/CommonStatusCodeEnum.java index 57de6960ffeaf2e8a6e6a9b019a38fc597cc98dd..014bb4d67c3fafcde7477f1a96e7d0bb0cad1ec2 100644 --- a/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java +++ b/milkbox-common/src/main/java/top/milkbox/common/enums/CommonStatusCodeEnum.java @@ -1,4 +1,4 @@ -package top.milkbox.enums; +package top.milkbox.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; @@ -17,7 +17,7 @@ public enum CommonStatusCodeEnum { ERROR403("403", "无权限"), ERROR404("404", "路径不存在"), ERROR405("405", "请求方法不正确"), - ERROR415("415", "参数类型"), + ERROR415("415", "参数类型错误"), ERROR500("500", "未知异常"), ERROR506("506", "业务逻辑异常"); diff --git a/milkbox-common/src/main/java/top/milkbox/common/enums/LogCategoryEnum.java b/milkbox-common/src/main/java/top/milkbox/common/enums/LogCategoryEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..5c524b706bbc61f9d9be1729c76b7eb4d2cf813c --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/enums/LogCategoryEnum.java @@ -0,0 +1,47 @@ +package top.milkbox.common.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; + +/** + * 日志分类枚举 + * 创建时间: 2024-01-19 下午 2:35 + * + * @author milkbox + */ +@AllArgsConstructor // 如果使用此注解,请勿随意修改成员变量的定义顺序 +public enum LogCategoryEnum { + + /** + * 表示日志是接口类型的 + */ + API("接口", "API"), + + /** + * 表示日志是一个普通方法的 + */ + METHOD("方法", "METHOD"); + + private final String label; + + @EnumValue // mybatis-plus控制数据库字段,数据库中保存的字段。如果数据库中的字段与不在枚举中则返回空 + private final String value; + + public String getLabel() { + return label; + } + + @JsonValue // jackson的标识,用于json转枚举的时候使用的字段 + public String getValue() { + return value; + } + + /** + * 枚举对象转为json的时候,字段的值 + */ + @Override + public String toString() { + return value; + } +} diff --git a/milkbox-common/src/main/java/top/milkbox/common/enums/LogLevelEnum.java b/milkbox-common/src/main/java/top/milkbox/common/enums/LogLevelEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..033a518894f5b20104a1c6927c27ba78518dd522 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/enums/LogLevelEnum.java @@ -0,0 +1,43 @@ +package top.milkbox.common.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; + +/** + * 日志级别枚举 + * 创建时间: 2024-01-22 下午 12:03 + * + * @author milkbox + */ +@AllArgsConstructor // 如果使用此注解,请勿随意修改成员变量的定义顺序 +public enum LogLevelEnum { + + TRACE("跟踪", "TRACE"), + INFO("信息", "INFO"), + DEBUG("调试", "DEBUG"), + WARN("警告", "WARN"), + ERROR("错误", "ERROR"); + + private final String label; + + @EnumValue // mybatis-plus控制数据库字段,数据库中保存的字段。如果数据库中的字段与不在枚举中则返回空 + private final String value; + + public String getLabel() { + return label; + } + + @JsonValue // jackson的标识,用于json转枚举的时候使用的字段 + public String getValue() { + return value; + } + + /** + * 枚举对象转为json的时候,字段的值 + */ + @Override + public String toString() { + return value; + } +} diff --git a/milkbox-common/src/main/java/top/milkbox/common/enums/LogTypeEnum.java b/milkbox-common/src/main/java/top/milkbox/common/enums/LogTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..901037fff2087596a7799591db90d49c9a3988ac --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/enums/LogTypeEnum.java @@ -0,0 +1,43 @@ +package top.milkbox.common.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; + +/** + * 日志类型枚举 + * 创建时间: 2024-01-22 下午 12:03 + * + * @author milkbox + */ +@AllArgsConstructor // 如果使用此注解,请勿随意修改成员变量的定义顺序 +public enum LogTypeEnum { + + INSERT("添加", "INSERT"), + DELETE("删除", "DELETE"), + UPDATE("修改", "UPDATE"), + SELECT("查询", "SELECT"), + NOT("无", null); + + private final String label; + + @EnumValue // mybatis-plus控制数据库字段,数据库中保存的字段。如果数据库中的字段与不在枚举中则返回空 + private final String value; + + public String getLabel() { + return label; + } + + @JsonValue // jackson的标识,用于json转枚举的时候使用的字段 + public String getValue() { + return value; + } + + /** + * 枚举对象转为json的时候,字段的值 + */ + @Override + public String toString() { + return value; + } +} diff --git a/milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java b/milkbox-common/src/main/java/top/milkbox/common/exceprion/CommonServiceException.java similarity index 93% rename from milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java rename to milkbox-common/src/main/java/top/milkbox/common/exceprion/CommonServiceException.java index f162588fa9ec088ef057c513a8596e103a7c665d..5482884e4dd276d78579326d0e66f1607ff95999 100644 --- a/milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java +++ b/milkbox-common/src/main/java/top/milkbox/common/exceprion/CommonServiceException.java @@ -1,4 +1,4 @@ -package top.milkbox.exceprion; +package top.milkbox.common.exceprion; import cn.hutool.core.util.StrUtil; diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonEntity.java similarity index 93% rename from milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java rename to milkbox-common/src/main/java/top/milkbox/common/pojo/CommonEntity.java index b423847ea2750032a548732e3cc35e2c3e3cd624..76af006209cd8eee7ce8b227e2604881d0dba5c1 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java +++ b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonEntity.java @@ -1,11 +1,11 @@ -package top.milkbox.pojo; +package top.milkbox.common.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import top.milkbox.enums.CommonDeleteFlagEnum; +import top.milkbox.common.enums.CommonDeleteFlagEnum; import java.io.Serializable; import java.util.Date; diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonPageParam.java similarity index 95% rename from milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java rename to milkbox-common/src/main/java/top/milkbox/common/pojo/CommonPageParam.java index 14834bfdd47e9876c43b57ed6e9248e661f54a0e..d9eb58696676da9b9650e8931e9f462a7308356a 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java +++ b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonPageParam.java @@ -1,4 +1,4 @@ -package top.milkbox.pojo; +package top.milkbox.common.pojo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.media.Schema; @@ -6,7 +6,7 @@ import jakarta.validation.constraints.DecimalMax; import jakarta.validation.constraints.DecimalMin; import lombok.*; import lombok.extern.slf4j.Slf4j; -import top.milkbox.enums.CommonSortTypeEnum; +import top.milkbox.common.enums.CommonSortTypeEnum; import java.io.Serializable; diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonResult.java similarity index 94% rename from milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java rename to milkbox-common/src/main/java/top/milkbox/common/pojo/CommonResult.java index 0469bf7204071f28d9a6c3bd82abc4aba85a657e..641331b014f3e1b3fa0319627a755e9889c3fc1a 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java +++ b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonResult.java @@ -1,10 +1,10 @@ -package top.milkbox.pojo; +package top.milkbox.common.pojo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import top.milkbox.enums.CommonStatusCodeEnum; +import top.milkbox.common.enums.CommonStatusCodeEnum; import java.io.Serializable; diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonVo.java similarity index 95% rename from milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java rename to milkbox-common/src/main/java/top/milkbox/common/pojo/CommonVo.java index f5e093c515c57b941a8a799ff680a3c1e64fee10..0570b3ee717618f7c4b8702d69c0659cddedac51 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java +++ b/milkbox-common/src/main/java/top/milkbox/common/pojo/CommonVo.java @@ -1,4 +1,4 @@ -package top.milkbox.pojo; +package top.milkbox.common.pojo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/milkbox-common/src/main/java/top/milkbox/utils/CommonUtil.java b/milkbox-common/src/main/java/top/milkbox/common/utils/CommonUtil.java similarity index 99% rename from milkbox-common/src/main/java/top/milkbox/utils/CommonUtil.java rename to milkbox-common/src/main/java/top/milkbox/common/utils/CommonUtil.java index ff805e6a40965f1fc336d16a758907b3f0200bbe..39b7fd52a2b93eda13c2a0738337956770bc32c1 100644 --- a/milkbox-common/src/main/java/top/milkbox/utils/CommonUtil.java +++ b/milkbox-common/src/main/java/top/milkbox/common/utils/CommonUtil.java @@ -1,4 +1,4 @@ -package top.milkbox.utils; +package top.milkbox.common.utils; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.tree.Tree; diff --git a/milkbox-common/src/main/java/top/milkbox/common/utils/NetUtil.java b/milkbox-common/src/main/java/top/milkbox/common/utils/NetUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..7ffd30cc4bb783dcb8e282c8ffa61cb6fe2da59b --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/common/utils/NetUtil.java @@ -0,0 +1,35 @@ +package top.milkbox.common.utils; + +import jakarta.servlet.http.HttpServletRequest; + +/** + * 创建时间: 2024-01-23 上午 10:40 + * + * @author milkbox + */ +public class NetUtil { + + + /** + * 获取用户的真实ip地址 + * + * @param request request对象 + * @return 返回StringIp + */ + public static String getRealIp(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; + } +} diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/core/aop/LogAop.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/core/aop/LogAop.java new file mode 100644 index 0000000000000000000000000000000000000000..3b01a98dfd42b9eaf41296c60165366b27403716 --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/core/aop/LogAop.java @@ -0,0 +1,62 @@ +package top.milkbox.log.core.aop; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; +import top.milkbox.log.modular.main.service.LogMainService; + +/** + * 日志注解的切点处理 + * 创建时间: 2024-01-19 下午 2:01 + * + * @author milkbox + */ +@Slf4j +@Aspect +@Component +@AllArgsConstructor +public class LogAop { + + private LogMainService logMainService; + + /** + * 抽取切点,抽取所有被注解CommonLog修饰的方法 + */ + @Pointcut("@annotation(top.milkbox.common.annotation.CommonLog)") + public void logPointcut() { + } + + /** + * 环绕通知 + * + * @param joinPoint 切点 + * @return 切点方法的返回值 + */ + @Around("LogAop.logPointcut()") + public Object logAround(ProceedingJoinPoint joinPoint) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Object result; + // 这里只能捕获到对应方法内部发生的异常 + // 如果在controller方法上使用注解,是无法捕获到springboot对于参数操作时期发生的异常 + // 无法捕获请求体转json和返回值转json时期的异常 + try { + result = joinPoint.proceed(); + logMainService.saveNormalLogAsync(joinPoint, result); + } catch (Throwable throwable) { + logMainService.saveThrowableLogAsync(joinPoint, throwable); + // 需要继续抛出异常 + throw new RuntimeException(throwable); + } + return result; + } + +// @After("LogAop.logPointcut()") +// public void logAfter(JoinPoint joinPoint) { +// log.warn("后置通知"); +// } +} diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/core/config/LogConfiguration.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/core/config/LogConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..bd8399506630476205669048980d1166a915f018 --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/core/config/LogConfiguration.java @@ -0,0 +1,36 @@ +package top.milkbox.log.core.config; + +import cn.hutool.core.thread.ExecutorBuilder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * 创建时间: 2024-01-22 下午 3:13 + * + * @author milkbox + */ +@Slf4j +@Configuration +public class LogConfiguration { + public static final String MODULE_NAME = "日志模块"; + + /** + * 初始线程5,最大线程10,线程超过10以后等待,等待队列最大100个 + * 主要用于异步保存日志信息 + * + * @return 返回一个线程池 + */ + @Bean("logExecutorService") + public ExecutorService createExecutorService() { + log.info("创建日志线程池......"); + return ExecutorBuilder.create() + .setCorePoolSize(5) + .setMaxPoolSize(10) + .setWorkQueue(new LinkedBlockingQueue<>(100)) + .build(); + } +} diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java index 4ae1155e5fee8b2d13d4ec5f8c9ae7fbecc07723..3694e1de45ad1b44c7596c123d718dd7107490db 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java @@ -8,13 +8,16 @@ import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import top.milkbox.common.annotation.CommonLog; +import top.milkbox.common.enums.LogTypeEnum; +import top.milkbox.log.core.config.LogConfiguration; import top.milkbox.log.modular.main.param.LogMainAddParam; import top.milkbox.log.modular.main.param.LogMainEditParam; import top.milkbox.log.modular.main.param.LogMainIdParam; import top.milkbox.log.modular.main.param.LogMainPageParam; import top.milkbox.log.modular.main.service.LogMainService; import top.milkbox.log.modular.main.vo.LogMainVo; -import top.milkbox.pojo.CommonResult; +import top.milkbox.common.pojo.CommonResult; import java.util.List; @@ -22,7 +25,7 @@ import java.util.List; * 日志主表(log_main)控制器 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @RestController @AllArgsConstructor @@ -32,8 +35,10 @@ public class LogMainController { private LogMainService logMainService; - @PutMapping("/add") + @PostMapping("/add") @Operation(summary = "添加", description = "添加一条数据") + @CommonLog(value = "添加", description = "添加一条数据", + module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) public CommonResult add(@Validated @RequestBody LogMainAddParam addParam) { logMainService.add(addParam); return CommonResult.ok(); @@ -41,6 +46,7 @@ public class LogMainController { @DeleteMapping("/delete") @Operation(summary = "批量删除") + @CommonLog(value = "批量删除", module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) public CommonResult delete( @Validated @RequestBody @@ -53,6 +59,8 @@ public class LogMainController { @PutMapping("/edit") @Operation(summary = "修改", description = "修改一条数据") + @CommonLog(value = "修改", description = "修改一条数据", + module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) public CommonResult edit(@Validated @RequestBody LogMainEditParam editParam) { logMainService.edit(editParam); return CommonResult.ok(); @@ -60,12 +68,16 @@ public class LogMainController { @GetMapping("/detail") @Operation(summary = "详情", description = "查询一条数据的详情") + @CommonLog(value = "详情", description = "查询一条数据的详情", + module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) public CommonResult detail(@Validated LogMainIdParam idParam) { return CommonResult.ok(logMainService.detail(idParam)); } @GetMapping("/page") @Operation(summary = "分页查询", description = "查询条件分页查询") + @CommonLog(value = "分页查询", description = "查询条件分页查询", + module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) public CommonResult> page(@Validated LogMainPageParam pageParam) { return CommonResult.ok(logMainService.page(pageParam)); } diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/entity/LogMainEntity.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/entity/LogMainEntity.java index 04fb3e53bbcc6c1c740ab50df560cfbb86e4c8d3..fbe93d6ef78655b0b51f82f6dce6bdfa685571de 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/entity/LogMainEntity.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/entity/LogMainEntity.java @@ -1,13 +1,18 @@ package top.milkbox.log.modular.main.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import top.milkbox.pojo.CommonEntity; +import top.milkbox.common.enums.LogCategoryEnum; +import top.milkbox.common.enums.LogLevelEnum; +import top.milkbox.common.enums.LogTypeEnum; +import top.milkbox.common.pojo.CommonEntity; import java.io.Serializable; @@ -21,7 +26,7 @@ import java.io.Serializable; @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -@TableName("log_main") +@TableName(value = "log_main", autoResultMap = true) @Schema(description = "LogMainEntity 日志_日志主表。") public class LogMainEntity extends CommonEntity implements Serializable { @@ -34,11 +39,11 @@ public class LogMainEntity extends CommonEntity implements Serializable { private Integer id; /** - * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下 + * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method */ @Schema(title = "日志分类", - description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下") - private String category; + description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method") + private LogCategoryEnum category; /** * 日志名称;对日志做一个简单的描述 @@ -53,7 +58,7 @@ public class LogMainEntity extends CommonEntity implements Serializable { @Schema(title = "日志级别", description = "日志级别。枚举类型,INFO,DEBUG,ERROR等。默认值“'TRACE'”", example = "'TRACE'", defaultValue = "'TRACE'") - private String level; + private LogLevelEnum level; /** * 执行状态;1表示成功,0表示失败 @@ -82,7 +87,7 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "操作的浏览器", description = "操作的浏览器") - private String operationBorwser; + private String operationBrowser; /** * 操作系统 @@ -99,18 +104,20 @@ public class LogMainEntity extends CommonEntity implements Serializable { private String requestUrl; /** - * 请求参数json类型;如果是api日志 + * 参数json类型 */ - @Schema(title = "请求参数json类型", - description = "请求参数json类型。如果是api日志") - private Object requestBodyJson; + @Schema(title = "参数json类型", + description = "请求参数json类型") + @TableField(typeHandler = JacksonTypeHandler.class) + private Object paramJson; /** - * 响应对象json类型;如果是api日志 + * 结果json类型 */ - @Schema(title = "响应对象json类型", - description = "响应对象json类型。如果是api日志") - private Object responseBodyJson; + @Schema(title = "结果json类型", + description = "响应对象json类型") + @TableField(typeHandler = JacksonTypeHandler.class) + private Object resultJson; /** * 模块名称 @@ -124,6 +131,6 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "类型", description = "类型。枚举") - private String type; + private LogTypeEnum type; } \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java index 5a1fe0f964967346dc96ee16e13b7970d7e9afad..903c6b3d187f374711c6ff4aaac6895c794cd756 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java @@ -6,8 +6,10 @@ import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import java.io.Serializable; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import top.milkbox.common.enums.LogCategoryEnum; +import top.milkbox.common.enums.LogLevelEnum; +import top.milkbox.common.enums.LogTypeEnum; /** * 添加参数对象 @@ -24,8 +26,8 @@ public class LogMainAddParam implements Serializable { * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下 */ @Schema(title = "日志分类", - description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下") - private String category; + description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method") + private LogCategoryEnum category; /** * 日志名称;对日志做一个简单的描述 @@ -40,8 +42,8 @@ public class LogMainAddParam implements Serializable { @Schema(title = "日志级别", description = "日志级别。枚举类型,INFO,DEBUG,ERROR等。默认值“'TRACE'”", example = "'TRACE'", defaultValue = "'TRACE'") - @NotBlank(message = "日志级别不能为空") - private String level; + @NotNull(message = "日志级别不能为空") + private LogLevelEnum level; /** * 执行状态;1表示成功,0表示失败 @@ -71,7 +73,7 @@ public class LogMainAddParam implements Serializable { */ @Schema(title = "操作的浏览器", description = "操作的浏览器") - private String operationBorwser; + private String operationBrowser; /** * 操作系统 @@ -88,18 +90,18 @@ public class LogMainAddParam implements Serializable { private String requestUrl; /** - * 请求参数json类型;如果是api日志 + * 参数json类型 */ - @Schema(title = "请求参数json类型", - description = "请求参数json类型。如果是api日志") - private Object requestBodyJson; + @Schema(title = "参数json类型", + description = "请求参数json类型") + private Object paramJson; /** - * 响应对象json类型;如果是api日志 + * 结果json类型 */ - @Schema(title = "响应对象json类型", - description = "响应对象json类型。如果是api日志") - private Object responseBodyJson; + @Schema(title = "结果json类型", + description = "响应对象json类型") + private Object resultJson; /** * 模块名称 @@ -113,6 +115,6 @@ public class LogMainAddParam implements Serializable { */ @Schema(title = "类型", description = "类型。枚举") - private String type; + private LogTypeEnum type; } \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainEditParam.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainEditParam.java index 629a270e370ca4a3e216462a97d561635caf4951..afed3ea6d331184057fcbc948e3f91c7c2cb05f5 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainEditParam.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainEditParam.java @@ -7,7 +7,9 @@ import lombok.NoArgsConstructor; import java.io.Serializable; import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.NotBlank; +import top.milkbox.common.enums.LogCategoryEnum; +import top.milkbox.common.enums.LogLevelEnum; +import top.milkbox.common.enums.LogTypeEnum; /** * 编辑参数对象 @@ -32,8 +34,8 @@ public class LogMainEditParam implements Serializable { * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下 */ @Schema(title = "日志分类", - description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下") - private String category; + description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method") + private LogCategoryEnum category; /** * 日志名称;对日志做一个简单的描述 @@ -48,8 +50,8 @@ public class LogMainEditParam implements Serializable { @Schema(title = "日志级别", description = "日志级别。枚举类型,INFO,DEBUG,ERROR等。默认值“'TRACE'”", example = "'TRACE'", defaultValue = "'TRACE'") - @NotBlank(message = "日志级别不能为空") - private String level; + @NotNull(message = "日志级别不能为空") + private LogLevelEnum level; /** * 执行状态;1表示成功,0表示失败 @@ -79,7 +81,7 @@ public class LogMainEditParam implements Serializable { */ @Schema(title = "操作的浏览器", description = "操作的浏览器") - private String operationBorwser; + private String operationBrowser; /** * 操作系统 @@ -96,18 +98,18 @@ public class LogMainEditParam implements Serializable { private String requestUrl; /** - * 请求参数json类型;如果是api日志 + * 参数json类型 */ - @Schema(title = "请求参数json类型", - description = "请求参数json类型。如果是api日志") - private Object requestBodyJson; + @Schema(title = "参数json类型", + description = "请求参数json类型") + private Object paramJson; /** - * 响应对象json类型;如果是api日志 + * 结果json类型 */ - @Schema(title = "响应对象json类型", - description = "响应对象json类型。如果是api日志") - private Object responseBodyJson; + @Schema(title = "结果json类型", + description = "响应对象json类型") + private Object resultJson; /** * 模块名称 @@ -121,6 +123,6 @@ public class LogMainEditParam implements Serializable { */ @Schema(title = "类型", description = "类型。枚举") - private String type; + private LogTypeEnum type; } \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainPageParam.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainPageParam.java index 1e60bf675ca08ff510787cf5751b15b3bb03c0e0..e48bbf29554252f3db8caf31ffbff888df808a4b 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainPageParam.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainPageParam.java @@ -5,7 +5,10 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import top.milkbox.pojo.CommonPageParam; +import top.milkbox.common.enums.LogCategoryEnum; +import top.milkbox.common.enums.LogLevelEnum; +import top.milkbox.common.enums.LogTypeEnum; +import top.milkbox.common.pojo.CommonPageParam; import java.io.Serializable; @@ -25,8 +28,8 @@ public class LogMainPageParam extends CommonPageParam implements Serializable { * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下 */ @Schema(title = "日志分类", - description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下") - private String category; + description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method") + private LogCategoryEnum category; /** * 日志名称;对日志做一个简单的描述 @@ -40,7 +43,7 @@ public class LogMainPageParam extends CommonPageParam implements Serializable { */ @Schema(title = "日志级别", description = "日志级别。枚举类型,INFO,DEBUG,ERROR等") - private String level; + private LogLevelEnum level; /** * 执行状态;1表示成功,0表示失败 @@ -68,7 +71,7 @@ public class LogMainPageParam extends CommonPageParam implements Serializable { */ @Schema(title = "操作的浏览器", description = "操作的浏览器") - private String operationBorwser; + private String operationBrowser; /** * 操作系统 @@ -85,18 +88,18 @@ public class LogMainPageParam extends CommonPageParam implements Serializable { private String requestUrl; /** - * 请求参数json类型;如果是api日志 + * 参数json类型 */ - @Schema(title = "请求参数json类型", - description = "请求参数json类型。如果是api日志") - private Object requestBodyJson; + @Schema(title = "参数json类型", + description = "请求参数json类型") + private Object paramJson; /** - * 响应对象json类型;如果是api日志 + * 结果json类型 */ - @Schema(title = "响应对象json类型", - description = "响应对象json类型。如果是api日志") - private Object responseBodyJson; + @Schema(title = "结果json类型", + description = "响应对象json类型") + private Object resultJson; /** * 模块名称 @@ -110,6 +113,6 @@ public class LogMainPageParam extends CommonPageParam implements Serializable { */ @Schema(title = "类型", description = "类型。枚举") - private String type; + private LogTypeEnum type; } \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java index 7763b47e9ec7caf081c2e0a5a877816b0fa43545..5de9d652f83c4cd1e4e1b771a4a98e5b841f896d 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java @@ -2,6 +2,7 @@ package top.milkbox.log.modular.main.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import org.aspectj.lang.ProceedingJoinPoint; import top.milkbox.log.modular.main.entity.LogMainEntity; import top.milkbox.log.modular.main.param.LogMainAddParam; import top.milkbox.log.modular.main.param.LogMainEditParam; @@ -64,4 +65,20 @@ public interface LogMainService extends IService { */ Page page(LogMainPageParam pageParam); + /** + * 异步保存日志 + * + * @param joinPoint 切点 + * @param result 方法的返回值 + */ + void saveNormalLogAsync(ProceedingJoinPoint joinPoint, Object result); + + /** + * 异步保存报错日志 + * + * @param joinPoint 切点 + * @param throwable 报错信息 + */ + void saveThrowableLogAsync(ProceedingJoinPoint joinPoint, Throwable throwable); + } \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java index c7e4e1dcf7d2bf8eafad5efbc693054a16c28b86..1a1e87b34d0d7c00aa6e851bf898274489c59079 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java @@ -3,14 +3,25 @@ package top.milkbox.log.modular.main.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.JakartaServletUtil; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentInfo; +import cn.hutool.http.useragent.UserAgentUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.AllArgsConstructor; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Service; -import top.milkbox.enums.CommonSortTypeEnum; -import top.milkbox.exceprion.CommonServiceException; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import top.milkbox.common.annotation.CommonLog; +import top.milkbox.common.enums.CommonSortTypeEnum; +import top.milkbox.common.enums.LogCategoryEnum; +import top.milkbox.common.exceprion.CommonServiceException; import top.milkbox.log.modular.main.entity.LogMainEntity; import top.milkbox.log.modular.main.mapper.LogMainMapper; import top.milkbox.log.modular.main.param.LogMainAddParam; @@ -19,9 +30,11 @@ import top.milkbox.log.modular.main.param.LogMainIdParam; import top.milkbox.log.modular.main.param.LogMainPageParam; import top.milkbox.log.modular.main.service.LogMainService; import top.milkbox.log.modular.main.vo.LogMainVo; -import top.milkbox.utils.CommonUtil; +import top.milkbox.common.utils.CommonUtil; +import java.lang.reflect.Method; import java.util.List; +import java.util.concurrent.ExecutorService; /** * 日志_日志主表(log_main)服务层实现类 @@ -31,11 +44,17 @@ import java.util.List; */ @Slf4j @Service -@AllArgsConstructor public class LogMainServiceImpl extends ServiceImpl implements LogMainService { private LogMainMapper logMainMapper; + public LogMainServiceImpl(LogMainMapper logMainMapper) { + this.logMainMapper = logMainMapper; + } + + @Resource(name = "logExecutorService") + private ExecutorService logExecute; + @Override public void add(LogMainAddParam addParam) { LogMainEntity entity = BeanUtil.toBean(addParam, LogMainEntity.class); @@ -96,4 +115,91 @@ public class LogMainServiceImpl extends ServiceImpl { + LogMainAddParam addParam = + createLogMainAddParam(servletRequestAttributes, joinPoint, result, null); + add(addParam); + }); + } + + @Override + public void saveThrowableLogAsync(ProceedingJoinPoint joinPoint, Throwable throwable) { + ServletRequestAttributes servletRequestAttributes + = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + logExecute.execute(() -> { + LogMainAddParam addParam = + createLogMainAddParam(servletRequestAttributes, joinPoint, null, throwable); + add(addParam); + }); + } + + /** + * 构建日志addParam对象 + * + * @param servletRequestAttributes 请求对象 + * @param joinPoint 切点 + * @param result 方法的返回值 + * @param throwable 抛出的异常,如果为空则表示没有发生异常,可以通过这个值判断方法的运行状况 + * @return 返回AddParam对象 + */ + private LogMainAddParam createLogMainAddParam( + ServletRequestAttributes servletRequestAttributes, ProceedingJoinPoint joinPoint, + Object result, Throwable throwable) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + CommonLog commonLog = method.getAnnotation(CommonLog.class); + + LogMainAddParam addParam = new LogMainAddParam(); + + // 状态信息 + addParam.setStatus(throwable == null ? 1 : 0); + + // 注解上的信息 + addParam.setName(commonLog.value()); + addParam.setLevel(commonLog.level()); + if (throwable != null) { + if (ObjectUtil.isNotNull(commonLog.description())) { + addParam.setDescription(commonLog.description() + "\n错误信息:\n" + throwable); + } else { + addParam.setDescription("错误信息:\n" + throwable); + } + } else { + addParam.setDescription(commonLog.description()); + } + addParam.setModule(commonLog.module()); + addParam.setType(commonLog.type()); + + // 是否有http请求对象 + if (ObjectUtil.isNotNull(servletRequestAttributes)) { + addParam.setCategory(LogCategoryEnum.API); + + HttpServletRequest request = servletRequestAttributes.getRequest(); + addParam.setRequestUrl(request.getRequestURL().toString()); + // addParam.setOperationIp(NetUtil.getRealIp(request)); // 自己的获取ip方式 + addParam.setOperationIp(JakartaServletUtil.getClientIP(request)); // 糊涂工具的获取ip方式 + + String userAgentString = JakartaServletUtil.getHeaderIgnoreCase( + request, "User-Agent"); + UserAgent userAgent = UserAgentUtil.parse(userAgentString); + if (userAgent.getBrowser().getName().equals(UserAgentInfo.NameUnknown)) { + addParam.setOperationBrowser(userAgentString); + } else { + addParam.setOperationBrowser(userAgent.getBrowser().getName()); + addParam.setOperationSystem(userAgent.getPlatform().getName()); + } + } else { + addParam.setCategory(LogCategoryEnum.METHOD); + } + + // 切点方法的参数数组 + addParam.setParamJson(joinPoint.getArgs()); + addParam.setResultJson(result); + + return addParam; + } + } \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/vo/LogMainVo.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/vo/LogMainVo.java index 9fc998f64c84acf1276963181b94e3960bcff081..4a7b3951ebb2fc257221a52decd052e8748aa77f 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/vo/LogMainVo.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/vo/LogMainVo.java @@ -5,7 +5,10 @@ import lombok.Data; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import top.milkbox.pojo.CommonVo; +import top.milkbox.common.enums.LogCategoryEnum; +import top.milkbox.common.enums.LogLevelEnum; +import top.milkbox.common.enums.LogTypeEnum; +import top.milkbox.common.pojo.CommonVo; import java.io.Serializable; @@ -33,8 +36,8 @@ public class LogMainVo extends CommonVo implements Serializable { * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下 */ @Schema(title = "日志分类", - description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下") - private String category; + description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method") + private LogCategoryEnum category; /** * 日志名称;对日志做一个简单的描述 @@ -49,7 +52,7 @@ public class LogMainVo extends CommonVo implements Serializable { @Schema(title = "日志级别", description = "日志级别。枚举类型,INFO,DEBUG,ERROR等。默认值“'TRACE'”", example = "'TRACE'", defaultValue = "'TRACE'") - private String level; + private LogLevelEnum level; /** * 执行状态;1表示成功,0表示失败 @@ -78,7 +81,7 @@ public class LogMainVo extends CommonVo implements Serializable { */ @Schema(title = "操作的浏览器", description = "操作的浏览器") - private String operationBorwser; + private String operationBrowser; /** * 操作系统 @@ -95,18 +98,18 @@ public class LogMainVo extends CommonVo implements Serializable { private String requestUrl; /** - * 请求参数json类型;如果是api日志 + * 参数json类型 */ - @Schema(title = "请求参数json类型", - description = "请求参数json类型。如果是api日志") - private Object requestBodyJson; + @Schema(title = "参数json类型", + description = "请求参数json类型") + private Object paramJson; /** - * 响应对象json类型;如果是api日志 + * 结果json类型 */ - @Schema(title = "响应对象json类型", - description = "响应对象json类型。如果是api日志") - private Object responseBodyJson; + @Schema(title = "结果json类型", + description = "响应对象json类型") + private Object resultJson; /** * 模块名称 @@ -120,6 +123,6 @@ public class LogMainVo extends CommonVo implements Serializable { */ @Schema(title = "类型", description = "类型。枚举") - private String type; + private LogTypeEnum type; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/core/config/SysConfiguration.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/core/config/SysConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..27b999e4c759f5518aa7103d8387a7475a886057 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/core/config/SysConfiguration.java @@ -0,0 +1,13 @@ +package top.milkbox.sys.core.config; + +import org.springframework.context.annotation.Configuration; + +/** + * 创建时间: 2024-01-22 下午 3:43 + * + * @author milkbox + */ +@Configuration +public class SysConfiguration { + public static final String MODULE_NAME = "系统模块"; +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java index 1c2bbe7aff50049a930d9521d4c8449c2c6d790a..3dd34a873d6716cac743504b7ca7f3d69f3da1e7 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java @@ -8,13 +8,16 @@ import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import top.milkbox.common.annotation.CommonLog; +import top.milkbox.common.enums.LogTypeEnum; +import top.milkbox.sys.core.config.SysConfiguration; import top.milkbox.sys.modular.role.param.SysRoleAddParam; import top.milkbox.sys.modular.role.param.SysRoleEditParam; import top.milkbox.sys.modular.role.param.SysRoleIdParam; import top.milkbox.sys.modular.role.param.SysRolePageParam; import top.milkbox.sys.modular.role.service.SysRoleService; import top.milkbox.sys.modular.role.vo.SysRoleVo; -import top.milkbox.pojo.CommonResult; +import top.milkbox.common.pojo.CommonResult; import java.util.List; @@ -22,7 +25,7 @@ import java.util.List; * 角色表(sys_role)控制器 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @RestController @AllArgsConstructor @@ -32,8 +35,10 @@ public class SysRoleController { private SysRoleService sysRoleService; - @PutMapping("/add") + @PostMapping("/add") @Operation(summary = "添加", description = "添加一条数据") + @CommonLog(value = "添加", description = "添加一条数据", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) public CommonResult add(@Validated @RequestBody SysRoleAddParam addParam) { sysRoleService.add(addParam); return CommonResult.ok(); @@ -41,6 +46,7 @@ public class SysRoleController { @DeleteMapping("/delete") @Operation(summary = "批量删除") + @CommonLog(value = "批量删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) public CommonResult delete( @Validated @RequestBody @@ -53,6 +59,8 @@ public class SysRoleController { @PutMapping("/edit") @Operation(summary = "修改", description = "修改一条数据") + @CommonLog(value = "修改", description = "修改一条数据", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) public CommonResult edit(@Validated @RequestBody SysRoleEditParam editParam) { sysRoleService.edit(editParam); return CommonResult.ok(); @@ -60,12 +68,16 @@ public class SysRoleController { @GetMapping("/detail") @Operation(summary = "详情", description = "查询一条数据的详情") + @CommonLog(value = "详情", description = "查询一条数据的详情", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) public CommonResult detail(@Validated SysRoleIdParam idParam) { return CommonResult.ok(sysRoleService.detail(idParam)); } @GetMapping("/page") @Operation(summary = "分页查询", description = "查询条件分页查询") + @CommonLog(value = "分页查询", description = "查询条件分页查询", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) public CommonResult> page(@Validated SysRolePageParam pageParam) { return CommonResult.ok(sysRoleService.page(pageParam)); } diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/entity/SysRoleEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/entity/SysRoleEntity.java index 08bec08003488ef3532fc27b4166b2724b06f7bf..7382f116aaabad4d9ecada4226135146681f7d54 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/entity/SysRoleEntity.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/entity/SysRoleEntity.java @@ -7,7 +7,7 @@ import lombok.Data; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import top.milkbox.pojo.CommonEntity; +import top.milkbox.common.pojo.CommonEntity; import java.io.Serializable; @@ -15,13 +15,13 @@ import java.io.Serializable; * 系统_角色表 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -@TableName("sys_role") +@TableName(value = "sys_role") @Schema(description = "SysRoleEntity 系统_角色表。") public class SysRoleEntity extends CommonEntity implements Serializable { diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/SysRoleMapper.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/SysRoleMapper.java index e31a55213f0799017cd422b79412f5231dc57f0e..b53d1d41de4997059c763b7ae34f242fd82727af 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/SysRoleMapper.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/SysRoleMapper.java @@ -8,7 +8,7 @@ import top.milkbox.sys.modular.role.entity.SysRoleEntity; * 系统_角色表(sys_role)表数据库访问层 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @Mapper public interface SysRoleMapper extends BaseMapper { diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAddParam.java index abf79e11a0f2a5f79d78381218366493a0b35c97..1daf298b4c0d7233f9d350ff2be2efc34e5808ce 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAddParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAddParam.java @@ -12,7 +12,7 @@ import jakarta.validation.constraints.NotBlank; * 添加参数对象 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @Data @NoArgsConstructor diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleEditParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleEditParam.java index 8b1755341f64bf9c205ecb8b43a683a6d2efd184..42d7df75d3389e5f86dcef7c99ff0e1859b1ac19 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleEditParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleEditParam.java @@ -13,7 +13,7 @@ import jakarta.validation.constraints.NotBlank; * 编辑参数对象 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @Data @NoArgsConstructor diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleIdParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleIdParam.java index c0e1fe117280b7cf22a098deb325789f58b9150f..400208667053d4a9137c022186d56fe46af6bd2a 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleIdParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleIdParam.java @@ -12,7 +12,7 @@ import java.io.Serializable; * 主键参数对象 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @Data @NoArgsConstructor diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRolePageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRolePageParam.java index 33d1e846a0721c7c583e983426518d92073b468a..473bf143d28746784ed304cc4b66f89cfedaee72 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRolePageParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRolePageParam.java @@ -5,7 +5,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import top.milkbox.pojo.CommonPageParam; +import top.milkbox.common.pojo.CommonPageParam; import java.io.Serializable; @@ -13,7 +13,7 @@ import java.io.Serializable; * 分页参数对象 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @Data @NoArgsConstructor diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java index 223219fbc017ed2eb24450ca8d3bf3caa938f39c..d30b545225484717e904efcd186d722cbb19ad12 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java @@ -15,7 +15,7 @@ import java.util.List; * 系统_角色表(sys_role)服务层接口 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ public interface SysRoleService extends IService { diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java index ed83f857f1b2d4eaf3a59b7542f1834133c8488e..f18cdcbab1d7274bafc7e0af846579e38f2869bf 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java @@ -9,8 +9,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import top.milkbox.enums.CommonSortTypeEnum; -import top.milkbox.exceprion.CommonServiceException; +import top.milkbox.common.enums.CommonSortTypeEnum; +import top.milkbox.common.exceprion.CommonServiceException; import top.milkbox.sys.modular.role.entity.SysRoleEntity; import top.milkbox.sys.modular.role.mapper.SysRoleMapper; import top.milkbox.sys.modular.role.param.SysRoleAddParam; @@ -19,7 +19,7 @@ import top.milkbox.sys.modular.role.param.SysRoleIdParam; import top.milkbox.sys.modular.role.param.SysRolePageParam; import top.milkbox.sys.modular.role.service.SysRoleService; import top.milkbox.sys.modular.role.vo.SysRoleVo; -import top.milkbox.utils.CommonUtil; +import top.milkbox.common.utils.CommonUtil; import java.util.List; @@ -27,7 +27,7 @@ import java.util.List; * 系统_角色表(sys_role)服务层实现类 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @Slf4j @Service diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/vo/SysRoleVo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/vo/SysRoleVo.java index 4d88f67e9a020077858284070b887199460101b3..f43a6eaff43bc53d2d744879eeca8f2ee1fc494e 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/vo/SysRoleVo.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/vo/SysRoleVo.java @@ -5,7 +5,7 @@ import lombok.Data; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import top.milkbox.pojo.CommonVo; +import top.milkbox.common.pojo.CommonVo; import java.io.Serializable; @@ -13,7 +13,7 @@ import java.io.Serializable; * 系统_角色表默认vo * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @Data @NoArgsConstructor diff --git a/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java b/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java index 838d031ff6c65edc91fde89d34d26eacfc8eaf80..7d7e7f6fa137159cf703d3490b5b6ff06fad686c 100644 --- a/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java +++ b/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java @@ -8,8 +8,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import top.milkbox.modular.entity.SysRole; -import top.milkbox.pojo.CommonPageParam; -import top.milkbox.pojo.CommonResult; +import top.milkbox.common.pojo.CommonPageParam; +import top.milkbox.common.pojo.CommonResult; /** * 创建时间: 2023-12-27 下午 2:48 diff --git a/milkbox-service/service-test/src/main/java/top/milkbox/modular/entity/SysRole.java b/milkbox-service/service-test/src/main/java/top/milkbox/modular/entity/SysRole.java index ffb7b9cd16cafc7580641b5681f1274276168f80..ca8e9653c63d4b28cb598cf3c2219f8c413d7e37 100644 --- a/milkbox-service/service-test/src/main/java/top/milkbox/modular/entity/SysRole.java +++ b/milkbox-service/service-test/src/main/java/top/milkbox/modular/entity/SysRole.java @@ -7,10 +7,9 @@ import lombok.Data; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import top.milkbox.pojo.CommonEntity; +import top.milkbox.common.pojo.CommonEntity; import java.io.Serializable; -import java.util.Date; /** * 系统_角色表 diff --git a/pom.xml b/pom.xml index 2074c6318d0a6572fb8154bcfe886d91e6a4b7b9..96173efa23ae92a70e2eae6ec09178b4bf0228d9 100644 --- a/pom.xml +++ b/pom.xml @@ -95,6 +95,7 @@ + com.mysql @@ -102,7 +103,7 @@ ${mysql-connector.version} - + org.slf4j slf4j-api @@ -121,6 +122,25 @@ ${hutool.version} + + + junit + junit + test + + + + + + + + + + + + + + @@ -137,6 +157,7 @@ 3.5.5 2.2.0 8.2.0 +