Compare commits

...
9 Commits
Author SHA1 Message Date
xrain b545af2365 add password oauth method for doc 2021-06-27 10:59:19 +08:00
xrain ac9fd706f9 add map special field method 2021-06-08 10:54:51 +08:00
xrain 8b4d551af8 storage add client 2021-06-07 15:24:22 +08:00
xrain 3445531972 add cors 2021-06-05 14:33:59 +08:00
xrain 2268ad0c8c add cors 2021-06-05 14:30:52 +08:00
xrain 0b6c6af51d add httpcontextaccessor for simapistorage 2021-06-05 12:07:47 +08:00
xrain 1c8ea86fd3 add basemodel 2021-06-05 11:20:32 +08:00
xrain f5e4cc97ba new request type 2021-06-05 07:56:48 +08:00
xrain 8550d663de fix useapi mutil return bug 2021-06-03 17:16:55 +08:00
6 changed files with 129 additions and 7 deletions
+11 -1
View File
@@ -1,4 +1,5 @@
using System;
namespace SimApi.Communications
{
/// <summary>
@@ -9,6 +10,15 @@ namespace SimApi.Communications
public int Id { get; set; }
}
/// <summary>
/// 动态类型单字段请求
/// </summary>
/// <typeparam name="T"></typeparam>
public class SimApiOneFieldRequest<T>
{
public T Data { get; set; }
}
/// <summary>
/// 基础分页请求
/// </summary>
@@ -17,4 +27,4 @@ namespace SimApi.Communications
public int Page { get; set; }
public int Count { get; set; }
}
}
}
+1
View File
@@ -4,6 +4,7 @@ namespace SimApi.Configs
{
public class SimApiOptions
{
public bool EnableCors { get; set; } = true;
public bool EnableSimApiAuth { get; set; } = false;
public bool EnableSimApiDoc { get; set; } = true;
public bool EnableSimApiException { get; set; } = true;
+3
View File
@@ -10,6 +10,9 @@ namespace SimApi.Helpers
public class SimApiStorage
{
private MinioClient Mc { get; }
public MinioClient Client => Mc;
private string ServeUrl { get; }
private string Bucket { get; }
private IHttpContextAccessor HttpContextAccessor { get; }
+7
View File
@@ -37,5 +37,12 @@ namespace SimApi.Helpers
return strbul.ToString();
}
public static void Log(string message, string type = "Information")
{
Console.WriteLine($"[ SimApi ][ {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff")} ][ {type} ]");
Console.WriteLine(message);
Console.WriteLine("");
}
}
}
+69
View File
@@ -0,0 +1,69 @@
using System;
using System.Linq;
using System.Text.Json;
namespace SimApi.Models
{
public class SimApiBaseModel
{
protected virtual string[] MapperIgnoreField { get; set; } = {"Id", "CreatedAt", "UpdatedAt"};
protected virtual string UpdatedTimeField { get; set; } = "UpdatedAt";
public void MapData<TS>(TS source, bool mapAll = false)
{
//获取要赋值的源数据不为null的项目
var sourceProps = source.GetType().GetProperties().Where(x => x.GetValue(source) != null)
.Select(x => new {x.Name, x.PropertyType})
.ToDictionary(x => x.Name, x => x.PropertyType);
//获取目标对象的属性信息
var targetProps = GetType().GetProperties().Select(x => new {x.Name, x.PropertyType})
.ToDictionary(x => x.Name, x => x.PropertyType);
foreach (var sp in sourceProps)
{
//检查源对象不为空的属性是否在目标对象中存在
if (targetProps.ContainsKey(sp.Key) && sp.Value == targetProps[sp.Key] &&
(!MapperIgnoreField.Contains(sp.Key) || mapAll))
{
GetType().GetProperty(sp.Key)?
.SetValue(this, source.GetType().GetProperty(sp.Key)?.GetValue(source));
}
}
UpdateTime();
}
public void MapData<TS>(TS source, string[] mapFields)
{
//获取要赋值的源数据不为null的项目
var sourceProps = source.GetType().GetProperties().Where(x => x.GetValue(source) != null)
.Select(x => new {x.Name, x.PropertyType})
.ToDictionary(x => x.Name, x => x.PropertyType);
//获取目标对象的属性信息
var targetProps = GetType().GetProperties().Select(x => new {x.Name, x.PropertyType})
.ToDictionary(x => x.Name, x => x.PropertyType);
foreach (var sp in sourceProps)
{
//检查源对象不为空的属性是否在目标对象中存在
if (targetProps.ContainsKey(sp.Key) && sp.Value == targetProps[sp.Key] &&
mapFields.Contains(sp.Key))
{
GetType().GetProperty(sp.Key)?
.SetValue(this, source.GetType().GetProperty(sp.Key)?.GetValue(source));
}
}
UpdateTime();
}
/// <summary>
/// 更新update时间
/// </summary>
/// <returns></returns>
public void UpdateTime()
{
GetType().GetProperty(UpdatedTimeField)?.SetValue(this, DateTime.Now);
}
}
}
+38 -6
View File
@@ -27,6 +27,12 @@ namespace SimApi
builder.AddScoped<SimApiAuth>();
}
if (simApiOptions.EnableCors)
{
builder.AddCors(cors => cors.AddPolicy("any",
policy => { policy.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin(); }));
}
// 使用SimApiDoc
if (simApiOptions.EnableSimApiDoc)
{
@@ -87,6 +93,14 @@ namespace SimApi
};
haveOauth = true;
break;
case "Password":
oauthFlows.Password = new OpenApiOAuthFlow
{
TokenUrl = new Uri(docOptions.ApiAuth.TokenUrl, UriKind.RelativeOrAbsolute),
Scopes = docOptions.ApiAuth.Scopes
};
haveOauth = true;
break;
}
}
@@ -138,6 +152,7 @@ namespace SimApi
if (simApiOptions.EnableSimApiStorage)
{
builder.AddHttpContextAccessor();
builder.AddSingleton<SimApiStorage>();
}
@@ -153,15 +168,29 @@ namespace SimApi
public static IApplicationBuilder UseSimApi(this IApplicationBuilder builder)
{
var options = builder.ApplicationServices.GetService<SimApiOptions>();
if (options.EnableForwardHeaders)
{
SimApiUtil.Log("开始配置ForwardedHeaders...");
builder.UseForwardedHeaders();
}
if (options.EnableCors)
{
SimApiUtil.Log("开始配置Cors全部允许...");
builder.UseCors("any");
}
if (options.EnableSimApiAuth)
{
SimApiUtil.Log("开始配置SimApiAuth...");
builder.UseMiddleware<SimApiAuthMiddleware>();
}
if (options.EnableSimApiDoc)
{
SimApiUtil.Log("开始配置SimApiDoc...");
var docOptions = options.SimApiDocOptions;
return builder.UseSwagger(x => x.RouteTemplate = "/swagger/{documentName}.json").UseSwaggerUI(x =>
builder.UseSwagger(x => x.RouteTemplate = "/swagger/{documentName}.json").UseSwaggerUI(x =>
{
x.DocumentTitle = docOptions.DocumentTitle;
foreach (var group in docOptions.ApiGroups)
@@ -177,17 +206,20 @@ namespace SimApi
if (options.EnableSimApiException)
{
SimApiUtil.Log("开始配置SimApiException...");
builder.UseMiddleware<SimApiExceptionMiddleware>();
}
if (options.EnableForwardHeaders)
//请求一下检测存储错误
if (options.EnableSimApiStorage)
{
builder.UseForwardedHeaders();
SimApiUtil.Log("开始配置SimApiStorage...");
builder.ApplicationServices.GetService<SimApiStorage>();
}
//请求一下检测存储错误
if(options.EnableSimApiStorage){
builder.ApplicationServices.GetService<SimApiStorage>();
if (options.EnableLowerUrl)
{
SimApiUtil.Log("开始配置使用URL小写...");
}
return builder;