Compare commits

...
7 Commits
Author SHA1 Message Date
xrain 98907ba5af add simutil cstNow, other times use this prop 2022-05-18 20:37:41 +08:00
xrain 7b0f0a9245 add cst time util 2022-05-18 20:15:25 +08:00
xrain 1c4fb06163 add json util 2022-05-16 11:26:42 +08:00
xrain e79ed47d39 fix upload stream data 2022-05-07 23:52:45 +08:00
xrain 6fdb3da059 update minio 2022-05-07 22:56:22 +08:00
xrain 55ea40b757 add string id only 2022-05-07 21:45:12 +08:00
xrain d252c1d302 fix login use string 2022-05-07 21:30:45 +08:00
13 changed files with 154 additions and 57 deletions
+9
View File
@@ -10,6 +10,14 @@ namespace SimApi.Communications
public int Id { get; set; }
}
/// <summary>
/// 只有ID的请求(字符串)
/// </summary>
public class SimApiStringIdOnlyRequest
{
public string Id { get; set; }
}
/// <summary>
/// 动态类型单字段请求
/// </summary>
@@ -25,6 +33,7 @@ namespace SimApi.Communications
public class SimApiBasePageRequest
{
public int Page { get; set; }
public int Count { get; set; }
}
}
+4 -2
View File
@@ -1,4 +1,5 @@
using System;
namespace SimApi.Communications
{
/// <summary>
@@ -7,8 +8,9 @@ namespace SimApi.Communications
public class SimApiLoginItem
{
//登录用户的ID
public int Id { get; set; }
public string Id { get; set; }
//登录用户来源
public string[] Type { get; set; }
}
}
}
-2
View File
@@ -85,7 +85,5 @@ namespace SimApi.Controllers
{
return new SimApiBaseResponse<string>();
}
}
}
+5 -2
View File
@@ -35,10 +35,13 @@ namespace SimApi.Controllers
/// </summary>
/// <returns></returns>
[HttpPost("/auth/check"), SimApiDoc("认证", "检测登陆")]
public SimApiBaseResponse<int> CheckLogin()
public SimApiBaseResponse<string> CheckLogin()
{
ErrorWhenNull(LoginInfo, 401);
return new SimApiBaseResponse<int> {Data = LoginInfo.Id};
return new SimApiBaseResponse<string>
{
Data = LoginInfo.Id
};
}
/// <summary>
+2 -2
View File
@@ -23,7 +23,7 @@ namespace SimApi.Helpers
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public string Login(int id, string type = "user", string token = null)
public string Login(string id, string type = "user", string token = null)
{
return Login(id, new[] { type }, token);
}
@@ -34,7 +34,7 @@ namespace SimApi.Helpers
/// <param name="id"></param>
/// <param name="type"></param>
/// <returns></returns>
public string Login(int id, string[] type, string uuid = null)
public string Login(string id, string[] type, string uuid = null)
{
if (uuid == null)
{
+16 -13
View File
@@ -14,7 +14,9 @@ namespace SimApi.Helpers
public MinioClient Client => Mc;
private string ServeUrl { get; }
private string Bucket { get; }
private IHttpContextAccessor HttpContextAccessor { get; }
public SimApiStorage(SimApiOptions apiOptions, IHttpContextAccessor httpContextAccessor)
@@ -22,7 +24,7 @@ namespace SimApi.Helpers
var options = apiOptions.SimApiStorageOptions;
HttpContextAccessor = httpContextAccessor;
var useSsl = false;
var endpoint = string.Empty;
string endpoint;
if (options.Endpoint.StartsWith("http://"))
{
endpoint = options.Endpoint.Replace("http://", string.Empty);
@@ -39,19 +41,18 @@ namespace SimApi.Helpers
ServeUrl = options.ServeUrl;
Bucket = options.Bucket;
var mcb = new MinioClient().WithEndpoint(endpoint)
.WithCredentials(options.AccessKey, options.SecretKey);
if (useSsl)
{
Mc = new MinioClient(endpoint, options.AccessKey, options.SecretKey).WithSSL();
}
else
{
Mc = new MinioClient(endpoint, options.AccessKey, options.SecretKey);
mcb = mcb.WithSSL();
}
Mc = mcb.Build();
bool found = Mc.BucketExistsAsync(Bucket).Result;
bool found = Mc.BucketExistsAsync(new BucketExistsArgs().WithBucket(Bucket)).Result;
if (!found)
{
Mc.MakeBucketAsync(Bucket).Wait();
Mc.MakeBucketAsync(new MakeBucketArgs().WithBucket(Bucket)).Wait();
}
}
@@ -59,7 +60,8 @@ namespace SimApi.Helpers
{
try
{
return Mc.PresignedPutObjectAsync(Bucket, path, expire).Result;
return Mc.PresignedPutObjectAsync(new PresignedPutObjectArgs().WithBucket(Bucket)
.WithObject(path).WithExpiry(expire)).Result;
}
catch (MinioException e)
{
@@ -68,11 +70,12 @@ namespace SimApi.Helpers
}
}
public string UploadFile(string path, Stream stream)
public string UploadFile(string path, Stream stream,string contentType = "image/png")
{
try
{
Mc.PutObjectAsync(Bucket, path, stream, stream.Length).Wait();
Mc.PutObjectAsync(new PutObjectArgs().WithBucket(Bucket).WithObject(path).
WithObjectSize(stream.Length).WithStreamData(stream).WithContentType(contentType)).Wait();
return null;
}
catch (MinioException e)
@@ -84,8 +87,8 @@ namespace SimApi.Helpers
public string FullUrl(string path)
{
var httpRequest = HttpContextAccessor.HttpContext.Request;
var url = $"{httpRequest.Scheme}://{httpRequest.Host}";
var httpRequest = HttpContextAccessor.HttpContext?.Request;
var url = $"{httpRequest?.Scheme}://{httpRequest?.Host}";
if (string.IsNullOrEmpty(path))
{
return path;
+32 -1
View File
@@ -1,11 +1,20 @@
using System.Security.Cryptography;
using System;
using System.Security.Cryptography;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Text.Unicode;
namespace SimApi.Helpers
{
public static class SimApiUtil
{
public static DateTime CstNow
{
get => DateTime.UtcNow.AddHours(8);
}
/// <summary>
/// 检测手机号是否正确
/// </summary>
@@ -36,5 +45,27 @@ namespace SimApi.Helpers
return strbul.ToString();
}
/// <summary>
/// 将对象序列化成JSON (控制台输出中文不会被编码)
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string Json(object obj)
{
return JsonSerializer.Serialize(obj, new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
});
}
/// <summary>
/// 获取 CST 当前时间
/// </summary>
/// <returns></returns>
public static DateTime GetCstNow()
{
return CstNow;
}
}
}
+4 -9
View File
@@ -1,5 +1,6 @@
using System;
using Microsoft.Extensions.Logging;
using SimApi.Helpers;
namespace SimApi.Logger
{
@@ -12,15 +13,9 @@ namespace SimApi.Logger
Name = name;
}
public IDisposable BeginScope<TState>(TState state)
{
return null;
}
public IDisposable BeginScope<TState>(TState state) => default!;
public bool IsEnabled(LogLevel logLevel)
{
return true;
}
public bool IsEnabled(LogLevel logLevel) => true;
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception,
Func<TState, Exception, string> formatter)
@@ -36,7 +31,7 @@ namespace SimApi.Logger
_ => defautColor
};
Console.WriteLine(
$"[ {Name} ][ {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff")} ][ {logLevel.ToString()} ]");
$"[ {Name} ][ {SimApiUtil.CstNow.ToString("yyyy-MM-dd HH:mm:ss:ffff")} ][ {logLevel.ToString()} ]");
Console.ForegroundColor = defautColor;
Console.WriteLine($"{state}");
if (exception != null)
+15
View File
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
namespace SimApi.Logger;
public class SimApiLoggerConfiguration
{
public int EventId { get; set; }
public Dictionary<LogLevel, ConsoleColor> LogLevels { get; set; } = new()
{
[LogLevel.Information] = ConsoleColor.Green
};
}
+27 -6
View File
@@ -1,23 +1,36 @@
using System;
using System.Linq;
using System.Text.Json;
using SimApi.Helpers;
namespace SimApi.Models
{
public class SimApiBaseModel
{
protected virtual string[] MapperIgnoreField { get; set; } = {"Id", "CreatedAt", "UpdatedAt"};
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})
.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})
var targetProps = GetType().GetProperties().Select(x => new
{
x.Name,
x.PropertyType
})
.ToDictionary(x => x.Name, x => x.PropertyType);
foreach (var sp in sourceProps)
{
@@ -37,11 +50,19 @@ namespace SimApi.Models
{
//获取要赋值的源数据不为null的项目
var sourceProps = source.GetType().GetProperties().Where(x => x.GetValue(source) != null)
.Select(x => new {x.Name, x.PropertyType})
.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})
var targetProps = GetType().GetProperties().Select(x => new
{
x.Name,
x.PropertyType
})
.ToDictionary(x => x.Name, x => x.PropertyType);
foreach (var sp in sourceProps)
{
@@ -63,7 +84,7 @@ namespace SimApi.Models
/// <returns></returns>
public void UpdateTime()
{
GetType().GetProperty(UpdatedTimeField)?.SetValue(this, DateTime.Now);
GetType().GetProperty(UpdatedTimeField)?.SetValue(this, SimApiUtil.CstNow);
}
}
}
+1 -1
View File
@@ -4,7 +4,7 @@
"anonymousAuthentication": true
},
"profiles": {
"YYApi": {
"SimApi": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
+3 -4
View File
@@ -17,7 +17,6 @@
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition=" '$(RunConfiguration)' == 'YYApi' " />
<ItemGroup>
<Folder Include="Helpers\" />
<Folder Include="Communications\" />
@@ -28,9 +27,9 @@
<Folder Include="Configurations\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Minio" Version="3.1.13" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.2.3" />
<PackageReference Include="Minio" Version="4.0.2" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.3.1" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.3.1" />
</ItemGroup>
<ProjectExtensions>
<MonoDevelop>
+36 -15
View File
@@ -23,7 +23,7 @@ namespace SimApi
var simApiOptions = new SimApiOptions();
options?.Invoke(simApiOptions);
// 是否使用SIMAUTH
// 是否使用 AUTH
if (simApiOptions.EnableSimApiAuth)
{
builder.AddScoped<SimApiAuth>();
@@ -43,7 +43,11 @@ namespace SimApi
{
foreach (var group in docOptions.ApiGroups)
{
x.SwaggerDoc(group.Id, new OpenApiInfo {Title = group.Name, Description = group.Description});
x.SwaggerDoc(group.Id, new OpenApiInfo
{
Title = group.Name,
Description = group.Description
});
}
x.EnableAnnotations();
@@ -61,9 +65,15 @@ namespace SimApi
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{Type = ReferenceType.SecurityScheme, Id = "HeaderToken"}
{
Type = ReferenceType.SecurityScheme,
Id = "HeaderToken"
}
},
new[] {"readAccess", "writeAccess"}
new[]
{
"readAccess", "writeAccess"
}
}
});
haveSimApiAuth = true;
@@ -121,9 +131,15 @@ namespace SimApi
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{Type = ReferenceType.SecurityScheme, Id = "oauth2"}
{
Type = ReferenceType.SecurityScheme,
Id = "oauth2"
}
},
new[] {"SimApiAuth"}
new[]
{
"SimApiAuth"
}
}
});
}
@@ -131,7 +147,11 @@ namespace SimApi
if (haveSimApiAuth)
{
x.AddSecurityDefinition("HeaderToken",
new OpenApiSecurityScheme {Name = "Token", In = ParameterLocation.Header});
new OpenApiSecurityScheme
{
Name = "Token",
In = ParameterLocation.Header
});
}
});
}
@@ -139,17 +159,17 @@ namespace SimApi
// 使用Header转发,应对代理后获取真实ip
if (simApiOptions.EnableForwardHeaders)
{
builder.Configure<ForwardedHeadersOptions>(options =>
builder.Configure<ForwardedHeadersOptions>(fwOptions =>
{
options.ForwardedHeaders = ForwardedHeaders.All;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
fwOptions.ForwardedHeaders = ForwardedHeaders.All;
fwOptions.KnownNetworks.Clear();
fwOptions.KnownProxies.Clear();
});
}
if (simApiOptions.EnableLowerUrl)
{
builder.AddRouting(options => options.LowercaseUrls = true);
builder.AddRouting(rOptions => rOptions.LowercaseUrls = true);
}
if (simApiOptions.EnableSimApiStorage)
@@ -169,13 +189,14 @@ namespace SimApi
/// <returns></returns>
public static IApplicationBuilder UseSimApi(this IApplicationBuilder builder)
{
var options = builder.ApplicationServices.GetService<SimApiOptions>();
var options = builder.ApplicationServices.GetRequiredService<SimApiOptions>();
if (options.EnableLogger)
{
builder.ApplicationServices.GetService<ILoggerFactory>().AddProvider(new SimApiLoggerProvider());
builder.ApplicationServices.GetRequiredService<ILoggerFactory>()
.AddProvider(new SimApiLoggerProvider());
}
var logger = builder.ApplicationServices.GetService<ILogger<SimApiLogger>>();
var logger = builder.ApplicationServices.GetRequiredService<ILogger<SimApiLogger>>();
if (options.EnableForwardHeaders)
{