Compare commits

...
15 Commits
Author SHA1 Message Date
xrain 63dcd0f13f update minio, default all option to false; 2022-06-29 02:50:15 +08:00
xrain 22704590f5 update util 2022-05-19 01:41:09 +08:00
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
xrain 74c6cb6027 update to .net6 2021-11-14 15:45:28 +08:00
xrain 98ec9ae231 update to .net6 2021-11-14 15:43:23 +08:00
xrain 18d2dfb86e add get upload url 2021-09-29 02:37:14 +08:00
xrain ef3f1bfa88 fix checkcell regex 2021-09-26 13:11:22 +08:00
xrain 01a2689549 fix ci 2021-07-10 18:39:32 +08:00
xrainandGitHub 916f046789 fix ci 2021-07-10 18:39:02 +08:00
16 changed files with 209 additions and 85 deletions
-21
View File
@@ -1,21 +0,0 @@
name: PublishNugetPackage
on: [create]
jobs:
publish:
name: Publish Project to Nuget
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: '5.0.100'
- name: Publish
run: |
version=`git describe --tags`
dotnet build --configuration release -p:PackageVersion=$version
dotnet nuget push bin/release/Simcu.SimApi.$version.nupkg -k ${NUGET_APIKEY} -s https://www.nuget.org/api/v2/package
env:
NUGET_APIKEY: ${{ secrets.NUGET_APIKEY }}
+24
View File
@@ -0,0 +1,24 @@
name: PublishNugetPackage
on:
push:
tags:
- "*"
jobs:
publish:
name: Publish Project to Nuget
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: "6.0.100"
- name: Publish
run: |
version=`git describe --tags`
dotnet build --configuration release -p:PackageVersion=$version
dotnet nuget push bin/release/Simcu.SimApi.$version.nupkg -k ${NUGET_APIKEY} -s https://www.nuget.org/api/v2/package
env:
NUGET_APIKEY: ${{ secrets.NUGET_APIKEY }}
+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; }
}
}
}
+15 -6
View File
@@ -4,15 +4,24 @@ namespace SimApi.Configs
{
public class SimApiOptions
{
public bool EnableCors { get; set; } = true;
public bool EnableCors { get; set; } = false;
public bool EnableSimApiAuth { get; set; } = false;
public bool EnableSimApiDoc { get; set; } = true;
public bool EnableSimApiException { get; set; } = true;
public bool EnableSimApiDoc { get; set; } = false;
public bool EnableSimApiException { get; set; } = false;
public bool EnableSimApiStorage { get; set; } = false;
public bool EnableForwardHeaders { get; set; } = true;
public bool EnableLowerUrl { get; set; } = true;
public bool EnableLogger { get; set; } = true;
public bool EnableForwardHeaders { get; set; } = false;
public bool EnableLowerUrl { get; set; } = false;
public bool EnableLogger { get; set; } = false;
public SimApiDocOptions SimApiDocOptions { get; set; } = new SimApiDocOptions();
public SimApiStorageOptions SimApiStorageOptions { get; set; } = new SimApiStorageOptions();
-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)
{
+28 -12
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,27 +41,41 @@ 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();
}
}
public string UploadFile(string path, Stream stream)
public string GetUploadUrl(string path, int expire = 7200)
{
try
{
Mc.PutObjectAsync(Bucket, path, stream, stream.Length).Wait();
return Mc.PresignedPutObjectAsync(new PresignedPutObjectArgs().WithBucket(Bucket)
.WithObject(path).WithExpiry(expire)).Result;
}
catch (MinioException e)
{
Console.WriteLine("Error occurred: " + e);
return e.Message;
}
}
public string UploadFile(string path, Stream stream,string contentType = "image/png")
{
try
{
Mc.PutObjectAsync(new PutObjectArgs().WithBucket(Bucket).WithObject(path).
WithObjectSize(stream.Length).WithStreamData(stream).WithContentType(contentType)).Wait();
return null;
}
catch (MinioException e)
@@ -71,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;
+35 -2
View File
@@ -1,11 +1,31 @@
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
{
/// <summary>
/// 当前CST时间
/// </summary>
public static DateTime CstNow
{
get => DateTime.UtcNow.AddHours(8);
}
/// <summary>
/// 当前秒级时间戳
/// </summary>
public static double TimestampNow
{
get => (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds;
}
/// <summary>
/// 检测手机号是否正确
/// </summary>
@@ -13,7 +33,7 @@ namespace SimApi.Helpers
/// <returns></returns>
public static bool CheckCell(string cell)
{
var regex = new Regex("^1[34578]\\d{9}$");
var regex = new Regex("^1[3456789]\\d{9}$");
return regex.IsMatch(cell);
}
@@ -36,5 +56,18 @@ 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)
});
}
}
}
+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": {
+4 -5
View File
@@ -14,10 +14,9 @@
<SynchReleaseVersion>false</SynchReleaseVersion>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageVersion>5.0.2</PackageVersion>
<TargetFrameworks>net5.0;netcoreapp3.1</TargetFrameworks>
<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.1.4" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.1.4" />
<PackageReference Include="Minio" Version="4.0.4" />
<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)
{