feat: 实现自动分组功能

This commit is contained in:
陈淳
2023-12-11 18:43:36 +08:00
parent 769a6a9c63
commit 01825ad87f
39 changed files with 83 additions and 3424 deletions

View File

@@ -9,18 +9,22 @@ namespace Yi.Framework.AspNetCore.Microsoft.AspNetCore.Builder
app.UseSwagger();
app.UseSwaggerUI(c =>
{
if (swaggerModels.Length == 0)
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Yi.Framework");
}
else
{
foreach (var k in swaggerModels)
{
// 配置 Swagger UI 面板链接,添加的顺序,就是排序
c.SwaggerEndpoint("/swagger/default/swagger.json", "default");
c.SwaggerEndpoint("/swagger/rbac/swagger.json", "rbac");
c.SwaggerEndpoint(k.Url, k.Name);
}
}
//if (swaggerModels.Length == 0)
//{
// c.SwaggerEndpoint("/swagger/v1/swagger.json", "Yi.Framework");
//}
//else
//{
// foreach (var k in swaggerModels)
// {
// c.SwaggerEndpoint(k.Url, k.Name);
// }
//}
});
return app;

View File

@@ -1,6 +1,9 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Volo.Abp.AspNetCore.Mvc;
namespace Yi.Framework.AspNetCore.Microsoft.Extensions.DependencyInjection
{
@@ -8,10 +11,38 @@ namespace Yi.Framework.AspNetCore.Microsoft.Extensions.DependencyInjection
{
public static IServiceCollection AddYiSwaggerGen<Program>(this IServiceCollection services, Action<SwaggerGenOptions>? action)
{
var serviceProvider = services.BuildServiceProvider();
var mvcOptions = serviceProvider.GetRequiredService<IOptions<AbpAspNetCoreMvcOptions>>();
var mvcSettings = mvcOptions.Value.ConventionalControllers.ConventionalControllerSettings.Where(x => x.RemoteServiceName != "default").DistinctBy(x => x.RemoteServiceName);
services.AddAbpSwaggerGen(
options =>
{
options.DocInclusionPredicate((docName, description) => true);
// 配置分组,还需要去重
foreach (var setting in mvcSettings)
{
options.SwaggerDoc(setting.RemoteServiceName, new OpenApiInfo { Title = setting.RemoteServiceName, Version = "v1" });
}
options.SwaggerDoc("default", new OpenApiInfo { Title = "default", Version = "v1" });
// 根据分组名称过滤 API 文档
options.DocInclusionPredicate((docName, apiDesc) =>
{
if (apiDesc.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
{
var settingOrNull = mvcSettings.Where(x => x.Assembly == controllerActionDescriptor.ControllerTypeInfo.Assembly).FirstOrDefault();
if (settingOrNull is not null)
{
return docName == settingOrNull.RemoteServiceName;
}
}
return docName == "default";
});
//options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
if (basePath is not null)

View File

@@ -5,6 +5,11 @@
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Cors\**" />
<EmbeddedResource Remove="Cors\**" />
<None Remove="Cors\**" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Json" Version="7.4.2" />
@@ -15,8 +20,4 @@
<ProjectReference Include="..\Yi.Framework.Core\Yi.Framework.Core.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Cors\" />
</ItemGroup>
</Project>

View File

@@ -1,42 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Yi.Framework.AspNetCore</name>
</assembly>
<members>
<member name="M:Yi.Framework.AspNetCore.RemoteServiceSuccessInfo.#ctor">
<summary>
Creates a new instance of <see cref="T:Yi.Framework.AspNetCore.RemoteServiceSuccessInfo"/>.
</summary>
</member>
<member name="M:Yi.Framework.AspNetCore.RemoteServiceSuccessInfo.#ctor(System.String,System.String,System.String,System.Object)">
<summary>
Creates a new instance of <see cref="T:Yi.Framework.AspNetCore.RemoteServiceSuccessInfo"/>.
</summary>
<param name="code">Error code</param>
<param name="details">Error details</param>
<param name="message">Error message</param>
<param name="data">Error data</param>
</member>
<member name="P:Yi.Framework.AspNetCore.RemoteServiceSuccessInfo.Code">
<summary>
code.
</summary>
</member>
<member name="P:Yi.Framework.AspNetCore.RemoteServiceSuccessInfo.Message">
<summary>
message.
</summary>
</member>
<member name="P:Yi.Framework.AspNetCore.RemoteServiceSuccessInfo.Details">
<summary>
details.
</summary>
</member>
<member name="P:Yi.Framework.AspNetCore.RemoteServiceSuccessInfo.Data">
<summary>
data.
</summary>
</member>
</members>
</doc>

View File

@@ -1,5 +1,17 @@
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json.Linq;
using Swashbuckle.AspNetCore.SwaggerGen;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity;
using Yi.Framework.AspNetCore.Mvc;
using Yi.Framework.Core;
@@ -10,8 +22,6 @@ namespace Yi.Framework.AspNetCore
)]
public class YiFrameworkAspNetCoreModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
}
}
}