初始刷
This commit is contained in:
146
ZR.Admin.WebApi/Extensions/SwaggerExtension.cs
Normal file
146
ZR.Admin.WebApi/Extensions/SwaggerExtension.cs
Normal file
@@ -0,0 +1,146 @@
|
||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||
using Microsoft.OpenApi.Models;
|
||||
using Swashbuckle.AspNetCore.Filters;
|
||||
using Swashbuckle.AspNetCore.SwaggerUI;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ZR.Admin.WebApi.Extensions
|
||||
{
|
||||
public static class SwaggerExtension
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="app"></param>
|
||||
public static void UseSwagger(this IApplicationBuilder app)
|
||||
{
|
||||
app.UseSwagger(c =>
|
||||
{
|
||||
c.RouteTemplate = "swagger/{documentName}/swagger.json";
|
||||
c.PreSerializeFilters.Add((swaggerDoc, httpReq) =>
|
||||
{
|
||||
var url = $"{httpReq.Scheme}://{httpReq.Host.Value}";
|
||||
var referer = httpReq.Headers["Referer"].ToString();
|
||||
if (referer.Contains(GlobalConstant.DevApiProxy))
|
||||
url = referer[..(referer.IndexOf(GlobalConstant.DevApiProxy, StringComparison.InvariantCulture) + GlobalConstant.DevApiProxy.Length - 1)];
|
||||
swaggerDoc.Servers =
|
||||
new List<OpenApiServer>
|
||||
{
|
||||
new OpenApiServer
|
||||
{
|
||||
Url = url
|
||||
}
|
||||
};
|
||||
});
|
||||
});
|
||||
app.UseSwaggerUI(c =>
|
||||
{
|
||||
c.SwaggerEndpoint("sys/swagger.json", "系统管理");
|
||||
c.SwaggerEndpoint("article/swagger.json", "文章管理");
|
||||
c.SwaggerEndpoint("v1/swagger.json", "business");
|
||||
c.DocExpansion(DocExpansion.None); //->修改界面打开时自动折叠
|
||||
});
|
||||
}
|
||||
|
||||
public static void AddSwaggerConfig(this IServiceCollection services)
|
||||
{
|
||||
if (services == null) throw new ArgumentNullException(nameof(services));
|
||||
//IWebHostEnvironment hostEnvironment = services.BuildServiceProvider().GetRequiredService<IWebHostEnvironment>();
|
||||
|
||||
services.AddSwaggerGen(c =>
|
||||
{
|
||||
c.SwaggerDoc("sys", new OpenApiInfo
|
||||
{
|
||||
Title = "ZrAdmin.NET Api",
|
||||
Version = "v1",
|
||||
Description = "系统管理",
|
||||
Contact = new OpenApiContact { Name = "ZRAdmin doc", Url = new Uri("https://www.izhaorui.cn/doc") }
|
||||
});
|
||||
c.SwaggerDoc("article", new OpenApiInfo
|
||||
{
|
||||
Title = "ZrAdmin.NET Api",
|
||||
Version = "v1",
|
||||
Description = "文章管理",
|
||||
Contact = new OpenApiContact { Name = "ZRAdmin doc", Url = new Uri("https://www.izhaorui.cn/doc") }
|
||||
});
|
||||
c.SwaggerDoc("v1", new OpenApiInfo
|
||||
{
|
||||
Title = "ZrAdmin.NET Api",
|
||||
Version = "v1",
|
||||
Description = "",
|
||||
});
|
||||
try
|
||||
{
|
||||
//var tempPath = hostEnvironment.ContentRootPath;
|
||||
//添加文档注释
|
||||
var baseDir = AppContext.BaseDirectory;
|
||||
c.IncludeXmlComments(Path.Combine(baseDir, "ZR.Model.xml"), true);
|
||||
c.IncludeXmlComments(Path.Combine(baseDir, "ZR.ServiceCore.xml"), true);
|
||||
c.IncludeXmlComments(Path.Combine(baseDir, "ZR.Service.xml"), true);
|
||||
c.IncludeXmlComments(Path.Combine(baseDir, "ZR.Admin.WebApi.xml"), true);
|
||||
|
||||
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
|
||||
var xmlPath = Path.Combine(baseDir, xmlFile);
|
||||
c.IncludeXmlComments(xmlPath);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("swagger 文档加载失败" + ex.Message);
|
||||
}
|
||||
|
||||
//参考文章:http://www.zyiz.net/tech/detail-134965.html
|
||||
//需要安装包Swashbuckle.AspNetCore.Filters
|
||||
// 开启权限小锁 需要在对应的Action上添加[Authorize]才能看到
|
||||
c.OperationFilter<AddResponseHeadersFilter>();
|
||||
c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
|
||||
|
||||
//在header 中添加token,传递到后台
|
||||
c.OperationFilter<SecurityRequirementsOperationFilter>();
|
||||
|
||||
c.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme,
|
||||
new OpenApiSecurityScheme
|
||||
{
|
||||
In = ParameterLocation.Header,
|
||||
Description = "请输入Login接口返回的Token,前置Bearer。示例:Bearer {Token}",
|
||||
Name = "Authorization",//jwt默认的参数名称,
|
||||
Type = SecuritySchemeType.ApiKey, //指定ApiKey
|
||||
BearerFormat = "JWT",//标识承载令牌的格式 该信息主要是出于文档目的
|
||||
Scheme = JwtBearerDefaults.AuthenticationScheme//授权中要使用的HTTP授权方案的名称
|
||||
});
|
||||
c.AddSecurityRequirement(new OpenApiSecurityRequirement
|
||||
{
|
||||
{
|
||||
new OpenApiSecurityScheme
|
||||
{
|
||||
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
|
||||
},
|
||||
new List<string>()
|
||||
}
|
||||
});
|
||||
|
||||
try
|
||||
{
|
||||
//判断接口归于哪个分组
|
||||
c.DocInclusionPredicate((docName, apiDescription) =>
|
||||
{
|
||||
if (docName == "v1")
|
||||
{
|
||||
//当分组为NoGroup时,只要没加特性的都属于这个组
|
||||
return string.IsNullOrEmpty(apiDescription.GroupName);
|
||||
}
|
||||
else
|
||||
{
|
||||
return apiDescription.GroupName == docName;
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
throw;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
78
ZR.Admin.WebApi/Extensions/TasksExtension.cs
Normal file
78
ZR.Admin.WebApi/Extensions/TasksExtension.cs
Normal file
@@ -0,0 +1,78 @@
|
||||
using Quartz.Spi;
|
||||
using SqlSugar;
|
||||
using SqlSugar.IOC;
|
||||
using ZR.Model.System;
|
||||
using ZR.Tasks;
|
||||
|
||||
namespace ZR.Admin.WebApi.Extensions
|
||||
{
|
||||
/// <summary>
|
||||
/// 定时任务扩展方法
|
||||
/// </summary>
|
||||
public static class TasksExtension
|
||||
{
|
||||
/// <summary>
|
||||
/// 注册任务
|
||||
/// </summary>
|
||||
/// <param name="services"></param>
|
||||
/// <exception cref="ArgumentNullException"></exception>
|
||||
public static void AddTaskSchedulers(this IServiceCollection services)
|
||||
{
|
||||
if (services == null) throw new ArgumentNullException(nameof(services));
|
||||
|
||||
//添加Quartz服务
|
||||
services.AddSingleton<IJobFactory, JobFactory>();
|
||||
services.AddTransient<ITaskSchedulerServer, TaskSchedulerServer>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 程序启动后添加任务计划
|
||||
/// </summary>
|
||||
/// <param name="app"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseAddTaskSchedulers(this IApplicationBuilder app)
|
||||
{
|
||||
ITaskSchedulerServer _schedulerServer = app.ApplicationServices.GetRequiredService<ITaskSchedulerServer>();
|
||||
|
||||
var tasks = DbScoped.SugarScope.Queryable<SysTasks>()
|
||||
.Where(m => m.IsStart == 1).ToListAsync();
|
||||
|
||||
//程序启动后注册所有定时任务
|
||||
foreach (var task in tasks.Result)
|
||||
{
|
||||
var result = _schedulerServer.AddTaskScheduleAsync(task);
|
||||
if (result.Result.IsSuccess())
|
||||
{
|
||||
Console.WriteLine($"注册任务[{task.Name}]ID:{task.ID}成功");
|
||||
}
|
||||
}
|
||||
|
||||
return app;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化字典
|
||||
/// </summary>
|
||||
/// <param name="app"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseInit(this IApplicationBuilder app)
|
||||
{
|
||||
//Console.WriteLine("初始化字典数据...");
|
||||
var db = DbScoped.SugarScope;
|
||||
var types = db.Queryable<SysDictType>()
|
||||
.Where(it => it.Status == "0")
|
||||
.Select(it => it.DictType)
|
||||
.ToList();
|
||||
|
||||
//上面有耗时操作写在Any上面,保证程序启动后只执行一次
|
||||
if (!db.ConfigQuery.Any())
|
||||
{
|
||||
foreach (var type in types)
|
||||
{
|
||||
db.ConfigQuery.SetTable<SysDictData>(it => SqlFunc.ToString(it.DictValue), it => it.DictLabel, type, it => it.DictType == type);
|
||||
}
|
||||
}
|
||||
return app;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user