package com.lingyue.config; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Contact; import io.swagger.v3.oas.models.info.Info; import org.springdoc.core.models.GroupedOpenApi; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; /** * SpringDoc OpenAPI 配置 * ⚠️ 仅在 dev 环境启用(双重保障机制) * * @author lingyue */ @Configuration @Profile("dev") // 第一层保障:只在 dev profile 时加载 @ConditionalOnProperty( name = "springdoc.api-docs.enabled", havingValue = "true", matchIfMissing = false // 第二层保障:必须明确启用 ) public class SpringDocConfig { @Autowired private AppConfig appConfig; /** * 自定义 OpenAPI 信息 */ @Bean public OpenAPI customOpenAPI() { return new OpenAPI() .info(new Info() .title("灵越智报 API 文档") .description("灵越智报 v2.0 - 智能文档处理平台 API 接口文档
" + "版本: " + appConfig.getVersion() + "
" + "版权所有 © " + appConfig.getCopyrightYear()) .version(appConfig.getVersion()) .contact(new Contact() .name(appConfig.getName()) .email(""))) ; } /** * 认证服务 API 分组 */ @Bean public GroupedOpenApi authApi() { return GroupedOpenApi.builder() .group("auth-api") .displayName("认证服务 API") .pathsToMatch("/auth/**") .build(); } /** * 文档管理 API 分组 */ @Bean public GroupedOpenApi documentApi() { return GroupedOpenApi.builder() .group("document-api") .displayName("文档管理 API") .pathsToMatch("/documents/**") .build(); } /** * 解析服务 API 分组 */ @Bean public GroupedOpenApi parseApi() { return GroupedOpenApi.builder() .group("parse-api") .displayName("解析服务 API") .pathsToMatch("/parse/**") .build(); } /** * AI处理服务 API 分组 */ @Bean public GroupedOpenApi aiApi() { return GroupedOpenApi.builder() .group("ai-api") .displayName("AI处理服务 API") .pathsToMatch("/ai/**") .build(); } /** * 关系网络服务 API 分组 */ @Bean public GroupedOpenApi graphApi() { return GroupedOpenApi.builder() .group("graph-api") .displayName("关系网络服务 API") .pathsToMatch("/graphs/**") .build(); } }