diff --git a/scripts/build-adminapi-forlinux b/scripts/build-adminapi-forlinux.sh similarity index 100% rename from scripts/build-adminapi-forlinux rename to scripts/build-adminapi-forlinux.sh diff --git a/src/Core/TakeoutSaaS.Shared.Web/Swagger/SwaggerExtensions.cs b/src/Core/TakeoutSaaS.Shared.Web/Swagger/SwaggerExtensions.cs index 48021b1..0cfe43b 100644 --- a/src/Core/TakeoutSaaS.Shared.Web/Swagger/SwaggerExtensions.cs +++ b/src/Core/TakeoutSaaS.Shared.Web/Swagger/SwaggerExtensions.cs @@ -52,8 +52,10 @@ public static class SwaggerExtensions var provider = app.ApplicationServices.GetRequiredService(); var settings = app.ApplicationServices.GetRequiredService(); const string routePrefix = "api/docs"; - // 1. 注册 Swagger 中间件 + const string legacyRoutePrefix = "swagger"; + // 1. 注册 Swagger 中间件(新旧入口同时支持) app.UseSwagger(options => { options.RouteTemplate = $"{routePrefix}/{{documentName}}/swagger.json"; }); + app.UseSwagger(options => { options.RouteTemplate = $"{legacyRoutePrefix}/{{documentName}}/swagger.json"; }); app.UseSwaggerUI(options => { options.RoutePrefix = routePrefix; @@ -67,6 +69,19 @@ public static class SwaggerExtensions // 2. 显示请求耗时 options.DisplayRequestDuration(); }); + app.UseSwaggerUI(options => + { + options.RoutePrefix = legacyRoutePrefix; + foreach (var description in provider.ApiVersionDescriptions) + { + // 3. 使用相对路径适配反向代理/网关前缀 + options.SwaggerEndpoint( + $"./{description.GroupName}/swagger.json", + $"{settings.Title} {description.ApiVersion}"); + } + // 2. 显示请求耗时 + options.DisplayRequestDuration(); + }); return app; } } diff --git a/tests/TakeoutSaaS.Integration.Tests/App/Dictionary/DictionaryApiTests.cs b/tests/TakeoutSaaS.Integration.Tests/App/Dictionary/DictionaryApiTests.cs index 176317a..dde9318 100644 --- a/tests/TakeoutSaaS.Integration.Tests/App/Dictionary/DictionaryApiTests.cs +++ b/tests/TakeoutSaaS.Integration.Tests/App/Dictionary/DictionaryApiTests.cs @@ -1,6 +1,7 @@ using System.Text; using System.Text.Json; using FluentAssertions; +using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging.Abstractions; using TakeoutSaaS.Application.Dictionary.Contracts; @@ -443,6 +444,7 @@ public sealed class DictionaryApiTests new DictionaryItemRepository(context), cache, tenantProvider, + new HttpContextAccessor { HttpContext = new DefaultHttpContext() }, NullLogger.Instance); } @@ -494,6 +496,7 @@ public sealed class DictionaryApiTests cache, tenantProvider, currentUser, + new HttpContextAccessor { HttpContext = new DefaultHttpContext() }, NullLogger.Instance); }