diff --git a/.idea/CoolRequestCommonStatePersistent.xml b/.idea/CoolRequestCommonStatePersistent.xml index 85f1509..e2e9036 100644 --- a/.idea/CoolRequestCommonStatePersistent.xml +++ b/.idea/CoolRequestCommonStatePersistent.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 684f676..267fcc1 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -25,29 +25,5 @@ jdbc:mysql://10.0.0.10/aioj_dev $ProjectFileDir$ - - mysql.8 - true - true - com.mysql.cj.jdbc.Driver - jdbc:mysql://10.0.0.10/aioj_dev - $ProjectFileDir$ - - - mysql.8 - true - true - com.mysql.cj.jdbc.Driver - jdbc:mysql://10.0.0.10/aioj_dev - $ProjectFileDir$ - - - mysql.8 - true - true - com.mysql.cj.jdbc.Driver - jdbc:mysql://10.0.0.10/aioj_dev - $ProjectFileDir$ - \ No newline at end of file diff --git a/.idea/db-forest-config.xml b/.idea/db-forest-config.xml index f3df434..de227fd 100644 --- a/.idea/db-forest-config.xml +++ b/.idea/db-forest-config.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 15c0ed8..06c2395 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,6 +1,8 @@ + + @@ -14,6 +16,7 @@ + @@ -33,7 +36,5 @@ - - \ No newline at end of file diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/SwaggerConfiguration.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/SwaggerConfiguration.java index f2fe921..b80492d 100644 --- a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/SwaggerConfiguration.java +++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/SwaggerConfiguration.java @@ -25,7 +25,7 @@ public class SwaggerConfiguration implements ApplicationRunner { @Bean public OpenAPI customerOpenAPI() { - return new OpenAPI().info(new Info().title("AIOJ-renz微服务✨") + return new OpenAPI().info(new Info().title("AIOJ-认证微服务✨") .description("用户认证功能") .version("v1.0.0") .contact(new Contact().name("meowrain").email("meowrain@126.com")) diff --git a/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/web/Result.java b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/web/Result.java index 8be2767..67dcf24 100644 --- a/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/web/Result.java +++ b/aioj-backend-common/aioj-backend-common-core/src/main/java/cn/meowrain/aioj/backend/framework/core/web/Result.java @@ -1,5 +1,6 @@ package cn.meowrain.aioj.backend.framework.core.web; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import lombok.experimental.Accessors; @@ -40,6 +41,7 @@ public class Result implements Serializable { * 返回是否是正确响应 * @return boolean */ + @JsonIgnore public boolean isSuccess() { return SUCCESS_CODE.equals(code); } @@ -48,6 +50,7 @@ public class Result implements Serializable { * 返回是否是错误响应 * @return boolean */ + @JsonIgnore public boolean isFail() { return !isSuccess(); } diff --git a/aioj-backend-gateway/pom.xml b/aioj-backend-gateway/pom.xml index 4c2902b..8bf41e4 100644 --- a/aioj-backend-gateway/pom.xml +++ b/aioj-backend-gateway/pom.xml @@ -79,5 +79,9 @@ + + org.springframework.boot + spring-boot-starter-actuator + \ No newline at end of file diff --git a/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/config/GatewayConfiguration.java b/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/config/GatewayConfiguration.java index d1e34b7..edff2dd 100644 --- a/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/config/GatewayConfiguration.java +++ b/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/config/GatewayConfiguration.java @@ -1,6 +1,7 @@ package cn.meowrain.aioj.backend.gateway.config; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; @@ -13,9 +14,11 @@ import org.springframework.web.reactive.function.client.WebClient; public class GatewayConfiguration { /** - * WebClient Bean,用于服务间调用 + * 支持负载均衡的 WebClient Bean,用于服务间调用 + * 加上 @LoadBalanced 注解后可以使用 lb://service-name 格式的 URI */ @Bean + @LoadBalanced public WebClient.Builder webClientBuilder() { return WebClient.builder(); } diff --git a/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/config/SwaggerDocPrinter.java b/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/config/SwaggerDocPrinter.java new file mode 100644 index 0000000..c928b16 --- /dev/null +++ b/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/config/SwaggerDocPrinter.java @@ -0,0 +1,42 @@ +package cn.meowrain.aioj.backend.gateway.config; + +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.stereotype.Component; + +import java.net.InetAddress; + +/** + * 启动时打印 Swagger 文档地址 + */ +@Slf4j +@Component +public class SwaggerDocPrinter implements ApplicationRunner { + + @Value("${server.port:8080}") + private int port; + + @Value("${server.servlet.context-path:}") + private String contextPath; + + @Override + public void run(ApplicationArguments args) throws Exception { + String ip = InetAddress.getLocalHost().getHostAddress(); + String ctx = contextPath == null ? "" : contextPath; + + String line = "=".repeat(60); + + log.info("\n" + line + + "\n 应用启动成功!Swagger 文档地址:" + + "\n" + line + + "\n 本地访问: http://localhost:" + port + ctx + "/doc.html" + + "\n 网络访问: http://" + ip + ":" + port + ctx + "/doc.html" + + "\n" + line + + "\n API 文档资源:" + + "\n - Knife4j UI: http://localhost:" + port + ctx + "/doc.html" + + "\n - Swagger Resources: http://localhost:" + port + ctx + "/swagger-resources" + + "\n" + line); + } +} diff --git a/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/filter/AuthGlobalFilter.java b/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/filter/AuthGlobalFilter.java index 6de7761..2338371 100644 --- a/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/filter/AuthGlobalFilter.java +++ b/aioj-backend-gateway/src/main/java/cn/meowrain/aioj/backend/gateway/filter/AuthGlobalFilter.java @@ -48,19 +48,19 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered { ServerHttpRequest request = exchange.getRequest(); String path = request.getURI().getPath(); - log.info("Auth filter processing request: {}", path); - log.info("Loaded white list from config: {}", gatewayPropertiesConfiguration.getWhiteList()); + log.info("🚀 网关拦截请求: {}", path); + log.debug("📋 白名单配置: {}", gatewayPropertiesConfiguration.getWhiteList()); // 检查是否在白名单中 if (isWhiteListPath(path)) { - log.info("Path {} is in whitelist, skip authentication", path); + log.info("✅ 路径 {} 在白名单中,跳过认证", path); return chain.filter(exchange); } // 获取Authorization头 String authHeader = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); if (authHeader == null || !authHeader.startsWith("Bearer ")) { - log.warn("No valid authorization header found for path: {}", path); + log.warn("⚠️ 请求缺少有效的 Authorization 头: {}", path); return handleUnauthorized(exchange); } @@ -70,15 +70,15 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered { return validateToken(token) .flatMap(isValid -> { if (isValid) { - log.info("Token validation successful for path: {}", path); + log.info("🔓 Token 验证成功: {}", path); return chain.filter(exchange); } else { - log.warn("Token validation failed for path: {}", path); + log.warn("🔒 Token 验证失败: {}", path); return handleUnauthorized(exchange); } }) .onErrorResume(throwable -> { - log.error("Token validation error for path: {}", path, throwable); + log.error("❌ Token 验证异常: {}", path, throwable); return handleUnauthorized(exchange); }); } @@ -105,7 +105,7 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered { private Mono validateToken(String token) { return webClientBuilder.build() .post() - .uri("lb://auth-service/v1/auth/validate") + .uri("lb://auth-service/api/v1/auth/validate") .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .contentType(MediaType.APPLICATION_JSON) .retrieve() @@ -116,7 +116,7 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered { Result result = objectMapper.readValue(response, Result.class); return Objects.equals(result.getCode(), Result.SUCCESS_CODE); } catch (JsonProcessingException e) { - log.error("Failed to parse auth response", e); + log.error("❌ 解析认证服务响应失败", e); return false; } }) diff --git a/aioj-backend-gateway/src/main/resources/application-dev.yml b/aioj-backend-gateway/src/main/resources/application-dev.yml index b5f9fde..c33a28a 100644 --- a/aioj-backend-gateway/src/main/resources/application-dev.yml +++ b/aioj-backend-gateway/src/main/resources/application-dev.yml @@ -64,11 +64,11 @@ logging: root: INFO # Nacos 相关日志 com.alibaba.nacos: INFO - com.alibaba.cloud.nacos: DEBUG + com.alibaba.cloud.nacos: INFO # LoadBalancer 日志 - org.springframework.cloud.loadbalancer: DEBUG - # Gateway 日志 - org.springframework.cloud.gateway: DEBUG + org.springframework.cloud.loadbalancer: INFO + # Gateway 日志 - 改为 INFO 减少输出,需要调试时改回 DEBUG + org.springframework.cloud.gateway: INFO # 自定义过滤器日志 cn.meowrain.aioj.backend.gateway: DEBUG