diff --git a/.idea/CoolRequestCommonStatePersistent.xml b/.idea/CoolRequestCommonStatePersistent.xml new file mode 100644 index 0000000..9253e64 --- /dev/null +++ b/.idea/CoolRequestCommonStatePersistent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml index c6acba9..15c0ed8 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -9,6 +9,7 @@ + @@ -32,7 +33,7 @@ - - + + \ No newline at end of file diff --git a/aioj-backend-common/aioj-backend-common-bom/pom.xml b/aioj-backend-common/aioj-backend-common-bom/pom.xml index 65f0598..7225b5d 100644 --- a/aioj-backend-common/aioj-backend-common-bom/pom.xml +++ b/aioj-backend-common/aioj-backend-common-bom/pom.xml @@ -18,10 +18,19 @@ 3.5.14 3.5.7 2025.0.0.0 - 9.5.0 + 9.4.0 + 3.0.2 + + + tools.jackson + jackson-bom + ${jackson.bom} + pom + import + cn.hutool @@ -72,7 +81,7 @@ org.springframework.security spring-security-test - 6.5.7 + 6.5.6 test @@ -82,6 +91,7 @@ spring-boot-starter-security 3.5.7 + \ No newline at end of file diff --git a/aioj-backend-common/aioj-backend-common-core/pom.xml b/aioj-backend-common/aioj-backend-common-core/pom.xml index 6c54934..42062a4 100644 --- a/aioj-backend-common/aioj-backend-common-core/pom.xml +++ b/aioj-backend-common/aioj-backend-common-core/pom.xml @@ -26,5 +26,29 @@ cn.hutool hutool-core + + + cn.hutool + hutool-extra + + + cn.hutool + hutool-http + + + org.springframework.boot + spring-boot-starter-web + true + + + + org.springframework.boot + spring-boot-starter-json + + + + org.springframework.boot + spring-boot-starter-validation + \ No newline at end of file diff --git a/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/banner/BannerApplicationRunner.java b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/banner/BannerApplicationRunner.java new file mode 100644 index 0000000..5444d01 --- /dev/null +++ b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/banner/BannerApplicationRunner.java @@ -0,0 +1,56 @@ +package cn.meowrain.aioj.backend.framework.core.banner; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.env.Environment; + +import java.lang.management.ManagementFactory; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Slf4j +@RequiredArgsConstructor +public class BannerApplicationRunner implements ApplicationRunner { + private final Environment env; + @Value("${spring.application.name:unknown}") + private String appName; + + @Override + public void run(ApplicationArguments args) throws Exception { + // Active profiles + String profiles = String.join(",", env.getActiveProfiles()); + if (profiles.isEmpty()) { + profiles = "default"; + } + + // Port + String port = env.getProperty("server.port", "unknown"); + + // JVM info + String jvm = System.getProperty("java.version") + " (" + System.getProperty("java.vendor") + ")"; + + // PID + String pid = ManagementFactory.getRuntimeMXBean().getPid() + ""; + + // Time + String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + + // Git commit id (如果没有 git.properties,不会报错) + String gitCommit = env.getProperty("git.commit.id.abbrev", "N/A"); + + printBanner(appName, profiles, port, jvm, pid, time, gitCommit); + } + private void printBanner(String appName, String profiles, String port, String jvm, String pid, String time, + String gitCommit) { + + String banner = "\n" + "------------------------------------------------------------\n" + + " ✨AI Online Judge✨ - " + appName + "\n" + " Environment : " + profiles + "\n" + " Port : " + + port + "\n" + " Git Commit : " + gitCommit + "\n" + " JVM : " + jvm + "\n" + + " PID : " + pid + "\n" + " Started At : " + time + "\n" + + "------------------------------------------------------------\n"; + System.out.println(banner); + } +} diff --git a/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/banner/EnvironmentBanner.java b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/banner/EnvironmentBanner.java index 5788706..f914822 100644 --- a/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/banner/EnvironmentBanner.java +++ b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/banner/EnvironmentBanner.java @@ -12,7 +12,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @Slf4j -@Component +@Deprecated public class EnvironmentBanner implements ApplicationListener { @Value("${spring.application.name:unknown}") diff --git a/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/banner/config/AIOJBannerAutoConfiguration.java b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/banner/config/AIOJBannerAutoConfiguration.java new file mode 100644 index 0000000..7f1bc17 --- /dev/null +++ b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/banner/config/AIOJBannerAutoConfiguration.java @@ -0,0 +1,14 @@ +package cn.meowrain.aioj.backend.framework.core.banner.config; + +import cn.meowrain.aioj.backend.framework.core.banner.BannerApplicationRunner; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.core.env.Environment; + +@AutoConfiguration +public class AIOJBannerAutoConfiguration { + @Bean + public BannerApplicationRunner bannerApplicationRunner(Environment env) { + return new BannerApplicationRunner(env); + } +} diff --git a/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/config/WebAutoConfiguration.java b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/config/WebAutoConfiguration.java index 6f26cf6..7c5e501 100644 --- a/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/config/WebAutoConfiguration.java +++ b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/config/WebAutoConfiguration.java @@ -1,11 +1,13 @@ package cn.meowrain.aioj.backend.framework.core.config; import cn.meowrain.aioj.backend.framework.core.exception.handler.GlobalExceptionHandler; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; /** * 注册为bean,全局异常拦截器 */ +@AutoConfiguration public class WebAutoConfiguration { @Bean diff --git a/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/constants/ServiceNameConstants.java b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/constants/ServiceNameConstants.java new file mode 100644 index 0000000..d0b440f --- /dev/null +++ b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/constants/ServiceNameConstants.java @@ -0,0 +1,21 @@ +package cn.meowrain.aioj.backend.framework.core.constants; + +/** + * 全局服务名称 + */ +public class ServiceNameConstants { + /** + * 用户服务 SERVICE NAME + */ + public static final String USER_SERVICE = "user-service"; + + /** + * 认证服务 SERVICE NAME + */ + public static final String AUTH_SERVICE = "auth-service"; + + /** + * UPMS模块 + */ + public static final String UPMS_SERVICE = "upms-service"; +} diff --git a/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/jackson/JavaTimeModule.java b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/jackson/JavaTimeModule.java new file mode 100644 index 0000000..92ca9b0 --- /dev/null +++ b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/jackson/JavaTimeModule.java @@ -0,0 +1,50 @@ +package cn.meowrain.aioj.backend.framework.core.jackson; + +import cn.hutool.core.date.DatePattern; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jsr310.PackageVersion; +import com.fasterxml.jackson.datatype.jsr310.deser.*; +import com.fasterxml.jackson.datatype.jsr310.ser.*; + +import java.io.Serial; +import java.time.*; +import java.time.format.DateTimeFormatter; + + +public class JavaTimeModule extends SimpleModule { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * JavaTimeModule构造函数,用于初始化时间序列化和反序列化规则 + */ + public JavaTimeModule() { + super(PackageVersion.VERSION); + + // ======================= 时间序列化规则 =============================== + // yyyy-MM-dd HH:mm:ss + this.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DatePattern.NORM_DATETIME_FORMATTER)); + // yyyy-MM-dd + this.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE)); + // HH:mm:ss + this.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ISO_LOCAL_TIME)); + // Instant 类型序列化 + this.addSerializer(Instant.class, InstantSerializer.INSTANCE); + // Duration 类型序列化 + this.addSerializer(Duration.class, DurationSerializer.INSTANCE); + + // ======================= 时间反序列化规则 ============================== + // yyyy-MM-dd HH:mm:ss + this.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DatePattern.NORM_DATETIME_FORMATTER)); + // yyyy-MM-dd + this.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE)); + // HH:mm:ss + this.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ISO_LOCAL_TIME)); + // Instant 反序列化 + this.addDeserializer(Instant.class, InstantDeserializer.INSTANT); + // Duration 反序列化 + this.addDeserializer(Duration.class, DurationDeserializer.INSTANCE); + } + +} diff --git a/aioj-backend-common/aioj-backend-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/aioj-backend-common/aioj-backend-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..f9a5382 --- /dev/null +++ b/aioj-backend-common/aioj-backend-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +cn.meowrain.aioj.backend.framework.core.banner.config.AIOJBannerAutoConfiguration +cn.meowrain.aioj.backend.framework.core.config.WebAutoConfiguration \ No newline at end of file diff --git a/aioj-backend-common/aioj-backend-common-feign/pom.xml b/aioj-backend-common/aioj-backend-common-feign/pom.xml new file mode 100644 index 0000000..b7a00bf --- /dev/null +++ b/aioj-backend-common/aioj-backend-common-feign/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + cn.meowrain + aioj-backend-common + 1.0-SNAPSHOT + + + aioj-backend-common-feign + + + 17 + 17 + UTF-8 + + + + cn.meowrain + aioj-backend-common-core + 1.0-SNAPSHOT + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + io.github.openfeign + feign-okhttp + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + com.github.ben-manes.caffeine + caffeine + + + + org.springframework.security + spring-security-core + + + + org.springframework + spring-webmvc + + + \ No newline at end of file diff --git a/aioj-backend-common/aioj-backend-common-feign/src/main/java/cn/meowrain/aioj/backend/framework/feign/FeignAutoConfiguration.java b/aioj-backend-common/aioj-backend-common-feign/src/main/java/cn/meowrain/aioj/backend/framework/feign/FeignAutoConfiguration.java new file mode 100644 index 0000000..7f34be2 --- /dev/null +++ b/aioj-backend-common/aioj-backend-common-feign/src/main/java/cn/meowrain/aioj/backend/framework/feign/FeignAutoConfiguration.java @@ -0,0 +1,7 @@ +package cn.meowrain.aioj.backend.framework.feign; + +import org.springframework.boot.autoconfigure.AutoConfiguration; + +@AutoConfiguration +public class FeignAutoConfiguration { +} diff --git a/aioj-backend-common/aioj-backend-common-feign/src/main/java/cn/meowrain/aioj/backend/framework/feign/annotation/EnableAIOJFeignClients.java b/aioj-backend-common/aioj-backend-common-feign/src/main/java/cn/meowrain/aioj/backend/framework/feign/annotation/EnableAIOJFeignClients.java new file mode 100644 index 0000000..86290f6 --- /dev/null +++ b/aioj-backend-common/aioj-backend-common-feign/src/main/java/cn/meowrain/aioj/backend/framework/feign/annotation/EnableAIOJFeignClients.java @@ -0,0 +1,13 @@ +package cn.meowrain.aioj.backend.framework.feign.annotation; + +import org.springframework.cloud.openfeign.EnableFeignClients; + +import java.lang.annotation.*; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@EnableFeignClients +public @interface EnableAIOJFeignClients { + String[] basePackages() default {}; +} diff --git a/aioj-backend-common/aioj-backend-common-feign/src/main/java/cn/meowrain/aioj/backend/framework/feign/annotation/NoToken.java b/aioj-backend-common/aioj-backend-common-feign/src/main/java/cn/meowrain/aioj/backend/framework/feign/annotation/NoToken.java new file mode 100644 index 0000000..c3e3853 --- /dev/null +++ b/aioj-backend-common/aioj-backend-common-feign/src/main/java/cn/meowrain/aioj/backend/framework/feign/annotation/NoToken.java @@ -0,0 +1,16 @@ +package cn.meowrain.aioj.backend.framework.feign.annotation; + +import java.lang.annotation.*; + +/** + * 服务无token调用声明注解 + *

+ * 只有发起方没有 token 时候才需要添加此注解, @NoToken + @Inner + *

+ */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface NoToken { + +} diff --git a/aioj-backend-common/aioj-backend-common-log/pom.xml b/aioj-backend-common/aioj-backend-common-log/pom.xml index 7aa5505..9a870b8 100644 --- a/aioj-backend-common/aioj-backend-common-log/pom.xml +++ b/aioj-backend-common/aioj-backend-common-log/pom.xml @@ -17,4 +17,17 @@ UTF-8 + + + cn.meowrain + aioj-backend-common-core + 1.0-SNAPSHOT + + + + cn.meowrain + aioj-backend-upms-api + 1.0-SNAPSHOT + + \ No newline at end of file diff --git a/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/aspect/SysLogAspect.java b/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/aspect/SysLogAspect.java index a2f28d7..2dde676 100644 --- a/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/aspect/SysLogAspect.java +++ b/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/aspect/SysLogAspect.java @@ -2,6 +2,7 @@ package cn.meowrain.aioj.backend.framework.log.aspect; import cn.hutool.core.util.StrUtil; import cn.meowrain.aioj.backend.framework.log.annotation.SysLog; +import cn.meowrain.aioj.backend.framework.log.utils.SysLogUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; @@ -25,7 +26,7 @@ public class SysLogAspect { if (StrUtil.isNotBlank(expression)) { // 解析SPEL MethodSignature signature = (MethodSignature) joinPoint.getSignature(); - EvaluationContext context = SysLogUtils.getContext(point.getArgs(), signature.getMethod()); + EvaluationContext context = SysLogUtils.getContext(joinPoint.getArgs(), signature.getMethod()); } } diff --git a/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/config/AIOJLogPropertiesConfiguration.java b/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/config/AIOJLogPropertiesConfiguration.java index 873d0d6..dd90fd4 100644 --- a/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/config/AIOJLogPropertiesConfiguration.java +++ b/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/config/AIOJLogPropertiesConfiguration.java @@ -2,8 +2,11 @@ package cn.meowrain.aioj.backend.framework.log.config; import lombok.Getter; import lombok.Setter; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.util.List; + @Getter @Setter @ConfigurationProperties(AIOJLogPropertiesConfiguration.PREFIX) @@ -21,4 +24,11 @@ public class AIOJLogPropertiesConfiguration { */ private Integer maxLength = 20000; + /** + * 放行字段,password,mobile,idcard,phone + */ + @Value("${log.exclude-fields:password,mobile,idcard,phone}") + private List excludeFields; + + } diff --git a/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/entity/SysLog.java b/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/entity/SysLog.java deleted file mode 100644 index 54c611e..0000000 --- a/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/entity/SysLog.java +++ /dev/null @@ -1,93 +0,0 @@ -package cn.meowrain.aioj.backend.framework.log.entity; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 日志对象 - */ -@Data -public class SysLog implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 编号 - */ - private Long id; - - /** - * 日志类型 - */ - private String logType; - - /** - * 日志标题 - */ - private String title; - - /** - * 创建者 - */ - private String createBy; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 操作IP地址 - */ - private String remoteAddr; - - /** - * 用户代理 - */ - private String userAgent; - - /** - * 请求URI - */ - private String requestUri; - - /** - * 操作方式 - */ - private String method; - - /** - * 操作提交的数据 - */ - private String params; - - /** - * 执行时间 - */ - private Long time; - - /** - * 异常信息 - */ - private String exception; - - /** - * 服务ID - */ - private String serviceId; - - /** - * 删除标记 - */ - private String delFlag; - -} diff --git a/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/event/SysLogListener.java b/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/event/SysLogListener.java index f01df9b..d0c4618 100644 --- a/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/event/SysLogListener.java +++ b/aioj-backend-common/aioj-backend-common-log/src/main/java/cn/meowrain/aioj/backend/framework/log/event/SysLogListener.java @@ -1,8 +1,15 @@ package cn.meowrain.aioj.backend.framework.log.event; +import cn.hutool.core.util.StrUtil; +import cn.meowrain.aioj.backend.framework.core.jackson.JavaTimeModule; import cn.meowrain.aioj.backend.framework.log.config.AIOJLogPropertiesConfiguration; -import cn.meowrain.aioj.backend.framework.log.entity.SysLog; +import cn.meowrain.aioj.backend.upms.api.entity.SysLog; +import cn.meowrain.aioj.backend.upms.api.feign.RemoteLogService; +import com.fasterxml.jackson.annotation.JsonFilter; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.beans.BeanUtils; @@ -11,6 +18,8 @@ import org.springframework.context.event.EventListener; import org.springframework.core.annotation.Order; import org.springframework.scheduling.annotation.Async; +import java.util.Objects; + @RequiredArgsConstructor public class SysLogListener implements InitializingBean { @@ -29,11 +38,38 @@ public class SysLogListener implements InitializingBean { SysLog sysLog = new SysLog(); BeanUtils.copyProperties(source, sysLog); + // json 格式刷参数放在异步中处理,提升性能 + if (Objects.nonNull(source.getBody())) { + String params = objectMapper.writeValueAsString(source.getBody()); + sysLog.setParams(StrUtil.subPre(params, logProperties.getMaxLength())); + } + + remoteLogService.saveLog(sysLog); } + /** + * 在 Bean 初始化后执行,用于初始化 ObjectMapper + * @throws Exception + */ @Override public void afterPropertiesSet() throws Exception { + //给 ObjectMapper 添加 MixIn(用于过滤字段) + objectMapper.addMixIn(Object.class, PropertyFilterMixIn.class); + String[] ignorableFieldNames = logProperties.getExcludeFields().toArray(new String[0]); + FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", + SimpleBeanPropertyFilter.serializeAllExcept(ignorableFieldNames)); + objectMapper.setFilterProvider(filters); + objectMapper.registerModule(new JavaTimeModule()); } + /** + * 属性过滤混合类:用于通过名称过滤属性 + * + * @author lengleng + * @date 2025/05/31 + */ + @JsonFilter("filter properties by name") + class PropertyFilterMixIn { + } } diff --git a/aioj-backend-common/aioj-backend-common-mybatis/pom.xml b/aioj-backend-common/aioj-backend-common-mybatis/pom.xml index 65a560a..67a741f 100644 --- a/aioj-backend-common/aioj-backend-common-mybatis/pom.xml +++ b/aioj-backend-common/aioj-backend-common-mybatis/pom.xml @@ -25,6 +25,11 @@ cn.hutool hutool-core + + + com.baomidou + mybatis-plus-spring-boot3-starter + com.baomidou diff --git a/aioj-backend-common/aioj-backend-common-mybatis/src/main/java/cn/meowrain/backend/common/mybaits/MybatisPlusAutoConfiguration.java b/aioj-backend-common/aioj-backend-common-mybatis/src/main/java/cn/meowrain/backend/common/mybaits/MybatisPlusAutoConfiguration.java index b61b420..35caa66 100644 --- a/aioj-backend-common/aioj-backend-common-mybatis/src/main/java/cn/meowrain/backend/common/mybaits/MybatisPlusAutoConfiguration.java +++ b/aioj-backend-common/aioj-backend-common-mybatis/src/main/java/cn/meowrain/backend/common/mybaits/MybatisPlusAutoConfiguration.java @@ -3,10 +3,10 @@ package cn.meowrain.backend.common.mybaits; import cn.meowrain.backend.common.mybaits.config.MybatisPlusMetaObjectHandler; import cn.meowrain.backend.common.mybaits.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -@Configuration(proxyBeanMethods = false) +@AutoConfiguration public class MybatisPlusAutoConfiguration { @Bean diff --git a/aioj-backend-common/pom.xml b/aioj-backend-common/pom.xml index 8cf6122..4e45643 100644 --- a/aioj-backend-common/pom.xml +++ b/aioj-backend-common/pom.xml @@ -17,6 +17,7 @@ aioj-backend-common-starter aioj-backend-common-mybatis aioj-backend-common-bom + aioj-backend-common-feign diff --git a/aioj-backend-upms/aioj-backend-upms-api/pom.xml b/aioj-backend-upms/aioj-backend-upms-api/pom.xml index 5aee90b..6520d36 100644 --- a/aioj-backend-upms/aioj-backend-upms-api/pom.xml +++ b/aioj-backend-upms/aioj-backend-upms-api/pom.xml @@ -17,4 +17,22 @@ UTF-8 + + + cn.meowrain + aioj-backend-common-core + 1.0-SNAPSHOT + + + cn.meowrain + aioj-backend-common-mybatis + 1.0-SNAPSHOT + + + + cn.meowrain + aioj-backend-common-feign + 1.0-SNAPSHOT + + \ No newline at end of file diff --git a/aioj-backend-upms/aioj-backend-upms-api/src/main/java/cn/meowrain/aioj/backend/upms/api/dto/SysLogDTO.java b/aioj-backend-upms/aioj-backend-upms-api/src/main/java/cn/meowrain/aioj/backend/upms/api/dto/SysLogDTO.java index a619c53..8260910 100644 --- a/aioj-backend-upms/aioj-backend-upms-api/src/main/java/cn/meowrain/aioj/backend/upms/api/dto/SysLogDTO.java +++ b/aioj-backend-upms/aioj-backend-upms-api/src/main/java/cn/meowrain/aioj/backend/upms/api/dto/SysLogDTO.java @@ -1,5 +1,7 @@ package cn.meowrain.aioj.backend.upms.api.dto; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.Data; import java.time.LocalDateTime; diff --git a/aioj-backend-upms/aioj-backend-upms-api/src/main/java/cn/meowrain/aioj/backend/upms/api/entity/SysLog.java b/aioj-backend-upms/aioj-backend-upms-api/src/main/java/cn/meowrain/aioj/backend/upms/api/entity/SysLog.java new file mode 100644 index 0000000..2a1ca44 --- /dev/null +++ b/aioj-backend-upms/aioj-backend-upms-api/src/main/java/cn/meowrain/aioj/backend/upms/api/entity/SysLog.java @@ -0,0 +1,159 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package cn.meowrain.aioj.backend.upms.api.entity; + + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 日志表 + *

+ * + * @author lengleng + * @since 2017-11-20 + */ +@Data +@Schema(description = "日志") +public class SysLog implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) +// @ExcelProperty("日志编号") + @Schema(description = "日志编号") + private Long id; + + /** + * 日志类型 + */ + @NotBlank(message = "日志类型不能为空") +// @ExcelProperty("日志类型(0-正常 9-错误)") + @Schema(description = "日志类型") + private String logType; + + /** + * 日志标题 + */ + @NotBlank(message = "日志标题不能为空") +// @ExcelProperty("日志标题") + @Schema(description = "日志标题") + private String title; + + /** + * 创建者 + */ +// @ExcelProperty("创建人") + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ +// @ExcelProperty("创建时间") + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ +// @ExcelIgnore + @TableField(fill = FieldFill.UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 操作IP地址 + */ +// @ExcelProperty("操作ip地址") + @Schema(description = "操作ip地址") + private String remoteAddr; + + /** + * 用户代理 + */ + @Schema(description = "用户代理") + private String userAgent; + + /** + * 请求URI + */ +// @ExcelProperty("浏览器") + @Schema(description = "请求uri") + private String requestUri; + + /** + * 操作方式 + */ +// @ExcelProperty("操作方式") + @Schema(description = "操作方式") + private String method; + + /** + * 操作提交的数据 + */ +// @ExcelProperty("提交数据") + @Schema(description = "提交数据") + private String params; + + /** + * 执行时间 + */ +// @ExcelProperty("执行时间") + @Schema(description = "方法执行时间") + private Long time; + + /** + * 异常信息 + */ +// @ExcelProperty("异常信息") + @Schema(description = "异常信息") + private String exception; + + /** + * 服务ID + */ +// @ExcelProperty("应用标识") + @Schema(description = "应用标识") + private String serviceId; + + /** + * 删除标记 + */ + @TableLogic +// @ExcelIgnore + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记,1:已删除,0:正常") + private String delFlag; + +} diff --git a/aioj-backend-upms/aioj-backend-upms-api/src/main/java/cn/meowrain/aioj/backend/upms/api/feign/RemoteLogService.java b/aioj-backend-upms/aioj-backend-upms-api/src/main/java/cn/meowrain/aioj/backend/upms/api/feign/RemoteLogService.java new file mode 100644 index 0000000..41c5784 --- /dev/null +++ b/aioj-backend-upms/aioj-backend-upms-api/src/main/java/cn/meowrain/aioj/backend/upms/api/feign/RemoteLogService.java @@ -0,0 +1,21 @@ +package cn.meowrain.aioj.backend.upms.api.feign; + +import cn.meowrain.aioj.backend.framework.core.constants.ServiceNameConstants; +import cn.meowrain.aioj.backend.framework.core.web.Result; +import cn.meowrain.aioj.backend.framework.feign.annotation.NoToken; +import cn.meowrain.aioj.backend.upms.api.entity.SysLog; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteLogService { + /** + * 保存日志 (异步多线程调用,无token) + * @param sysLog 日志实体 + * @return succes、false + */ + @NoToken + @PostMapping("/log/save") + Result saveLog(@RequestBody SysLog sysLog); +} diff --git a/aioj-backend-upms/aioj-backend-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/aioj-backend-upms/aioj-backend-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports new file mode 100644 index 0000000..1d9df39 --- /dev/null +++ b/aioj-backend-upms/aioj-backend-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -0,0 +1 @@ +cn.meowrain.aioj.backend.upms.api.feign.RemoteLogService \ No newline at end of file diff --git a/aioj-backend-upms/aioj-backend-upms-biz/pom.xml b/aioj-backend-upms/aioj-backend-upms-biz/pom.xml index 554f4cf..f577a29 100644 --- a/aioj-backend-upms/aioj-backend-upms-biz/pom.xml +++ b/aioj-backend-upms/aioj-backend-upms-biz/pom.xml @@ -17,4 +17,16 @@ UTF-8 + + + cn.meowrain + aioj-backend-common-mybatis + 1.0-SNAPSHOT + + + cn.meowrain + aioj-backend-upms-api + 1.0-SNAPSHOT + + \ No newline at end of file diff --git a/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/AIOJAdminApplication.java b/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/AIOJAdminApplication.java new file mode 100644 index 0000000..62285df --- /dev/null +++ b/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/AIOJAdminApplication.java @@ -0,0 +1,11 @@ +package cn.meowrain.aioj.backend.upms.biz; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AIOJAdminApplication { + public static void main(String[] args) { + SpringApplication.run(AIOJAdminApplication.class, args); + } +} diff --git a/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/controller/SysLogController.java b/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/controller/SysLogController.java new file mode 100644 index 0000000..b6ca48d --- /dev/null +++ b/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/controller/SysLogController.java @@ -0,0 +1,78 @@ +package cn.meowrain.aioj.backend.upms.biz.controller; + +import cn.hutool.core.collection.CollUtil; +import cn.meowrain.aioj.backend.framework.core.web.Result; +import cn.meowrain.aioj.backend.framework.core.web.Results; +import cn.meowrain.aioj.backend.upms.api.dto.SysLogDTO; +import cn.meowrain.aioj.backend.upms.api.entity.SysLog; +import cn.meowrain.aioj.backend.upms.biz.service.SysLogService; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/log") +@Tag(description = "log", name = "日志管理模块") +@RequiredArgsConstructor +public class SysLogController { + + private final SysLogService sysLogService; + + + /** + * 分页查询系统日志 + * + * @param page 分页参数对象 + * @param sysLog 系统日志查询条件 + * @return 包含分页结果的响应对象 + */ + @GetMapping("/page") + @Operation(summary = "分页查询系统日志", description = "分页查询系统日志") + public Result getLogPage(@ParameterObject Page page, @ParameterObject SysLogDTO sysLog) { + return Results.success(sysLogService.getLogPage(page, sysLog)); + } + + /** + * 批量删除日志 + * + * @param ids 要删除的日志ID数组 + * @return 操作结果,成功返回success,失败返回false + */ + @DeleteMapping +// @HasPermission("sys_log_del") + @Operation(summary = "批量删除日志", description = "批量删除日志") + public Result removeByIds(@RequestBody Long[] ids) { + return Results.success(sysLogService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 保存日志 + * + * @param sysLog 日志实体 + * @return 操作结果,成功返回success,失败返回false + */ + + @PostMapping("/save") + @Operation(summary = "保存日志", description = "保存日志") + public Result saveLog(@Valid @RequestBody SysLog sysLog) { + return Results.success(sysLogService.saveLog(sysLog)); + } + + /** + * 导出系统日志到Excel表格 + * @param sysLog 系统日志查询条件DTO + * @return 符合查询条件的系统日志列表 + */ +// @ResponseExcel +// @GetMapping("/export") +// @HasPermission("sys_log_export") +// @Operation(summary = "导出系统日志到Excel表格", description = "导出系统日志到Excel表格") +// public List exportLogs(SysLogDTO sysLog) { +// return sysLogService.listLogs(sysLog); +// } + +} diff --git a/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/mapper/SysLogMapper.java b/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/mapper/SysLogMapper.java new file mode 100644 index 0000000..36ac02b --- /dev/null +++ b/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/mapper/SysLogMapper.java @@ -0,0 +1,12 @@ +package cn.meowrain.aioj.backend.upms.biz.mapper; + +import cn.meowrain.aioj.backend.upms.api.entity.SysLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统日志表 Mapper 接口 + */ +@Mapper +public interface SysLogMapper extends BaseMapper { +} diff --git a/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/service/SysLogService.java b/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/service/SysLogService.java new file mode 100644 index 0000000..1a1ebf5 --- /dev/null +++ b/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/service/SysLogService.java @@ -0,0 +1,35 @@ +package cn.meowrain.aioj.backend.upms.biz.service; + +import cn.meowrain.aioj.backend.upms.api.dto.SysLogDTO; +import cn.meowrain.aioj.backend.upms.api.entity.SysLog; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface SysLogService extends IService { + /** + * 分页查询系统日志 + * + * @param page 分页对象 + * @param sysLog 系统日志 + * @return 系统日志分页数据 + */ + Page getLogPage(Page page, SysLogDTO sysLog); + + /** + * 保存日志 + * + * @param sysLog 日志实体 + * @return Boolean + */ + Boolean saveLog(SysLog sysLog); + + /** + * 查询日志列表 + * + * @param sysLog 查询条件 + * @return 日志列表 + */ + List listLogs(SysLogDTO sysLog); +} diff --git a/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/service/impl/SysLogServiceImpl.java b/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/service/impl/SysLogServiceImpl.java new file mode 100644 index 0000000..a0f1ce6 --- /dev/null +++ b/aioj-backend-upms/aioj-backend-upms-biz/src/main/java/cn/meowrain/aioj/backend/upms/biz/service/impl/SysLogServiceImpl.java @@ -0,0 +1,75 @@ +package cn.meowrain.aioj.backend.upms.biz.service.impl; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.meowrain.aioj.backend.upms.api.dto.SysLogDTO; +import cn.meowrain.aioj.backend.upms.api.entity.SysLog; +import cn.meowrain.aioj.backend.upms.biz.mapper.SysLogMapper; +import cn.meowrain.aioj.backend.upms.biz.service.SysLogService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class SysLogServiceImpl extends ServiceImpl implements SysLogService { + /** + * 分页查询系统日志 + * + * @param page 分页参数 + * @param sysLog 日志查询条件 + * @return 分页结果 + */ + @Override + public Page getLogPage(Page page, SysLogDTO sysLog) { + return baseMapper.selectPage(page, buildQuery(sysLog)); + } + + /** + * 保存日志 + * + * @param sysLog 日志对象 + * @return 保存成功返回true + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveLog(SysLog sysLog) { + baseMapper.insert(sysLog); + return Boolean.TRUE; + } + + /** + * 查询日志列表 + * + * @param sysLog 查询条件DTO对象 + * @return 日志列表 + */ + @Override + public List listLogs(SysLogDTO sysLog) { + return baseMapper.selectList(buildQuery(sysLog)); + } + + /** + * 构建查询条件 + * + * @param sysLog 前端查询条件DTO + * @return 构建好的LambdaQueryWrapper对象 + */ + private LambdaQueryWrapper buildQuery(SysLogDTO sysLog) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + if (StrUtil.isNotBlank(sysLog.getLogType())) { + wrapper.eq(SysLog::getLogType, sysLog.getLogType()); + } + + if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { + wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]) + .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); + } + + return wrapper; + } +} diff --git a/aioj-backend-user-service/pom.xml b/aioj-backend-user-service/pom.xml index b0d4202..5bb7bfe 100644 --- a/aioj-backend-user-service/pom.xml +++ b/aioj-backend-user-service/pom.xml @@ -23,15 +23,16 @@ aioj-backend-common-starter 1.0-SNAPSHOT + + cn.meowrain + aioj-backend-common-mybatis + 1.0-SNAPSHOT + org.springframework.boot spring-boot-starter-web - - - com.github.xiaoymin - knife4j-openapi3-jakarta-spring-boot-starter - + org.springframework.boot spring-boot-starter-data-redis diff --git a/pom.xml b/pom.xml index 5d572fe..984ec16 100644 --- a/pom.xml +++ b/pom.xml @@ -30,8 +30,11 @@ 17 UTF-8 3.5.7 + 2025.0.0 2025.0.0.0 0.0.47 + 9.0.2 + dev @@ -72,6 +75,14 @@ import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + com.alibaba.cloud spring-cloud-alibaba-dependencies @@ -123,7 +134,82 @@ + + + + io.github.git-commit-id + git-commit-id-maven-plugin + ${git.commit.plugin} + + + get-the-git-infos + initialize + + + + false + true + + yyyy-MM-dd HH:mm:ss + + ^git.build.(time|version)$ + ^git.commit.(id|message|time).*$ + + + + + + + com.google.cloud.tools + jib-maven-plugin + 3.4.5 + + true + + + registry.cn-shanghai.aliyuncs.com/all_lib/eclipse-temurin:17.0.10_7-jdk-jammy + + + + 10.0.0.3/aioj/${project.artifactId}:${project.version} + + + ${project.version} + + + + + + + + ${project.build.directory}/${project.artifactId}-${project.version}.tar + + + + + Asia/Shanghai + ${docker.spring.active} + + + + -Xms512m + -Xmx512m + + + + + + package + + build + buildTar + + + + + +