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