upgrade to c#12
This commit is contained in:
+33
-45
@@ -1,60 +1,48 @@
|
||||
using System;
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Caching.Distributed;
|
||||
using SimApi.Communications;
|
||||
|
||||
namespace SimApi.Helpers
|
||||
namespace SimApi.Helpers;
|
||||
|
||||
/// <summary>
|
||||
/// 认证助手
|
||||
/// </summary>
|
||||
public class SimApiAuth(IDistributedCache cache)
|
||||
{
|
||||
/// <summary>
|
||||
/// 认证助手
|
||||
/// 产生一个Token记录并返回Token
|
||||
/// </summary>
|
||||
public class SimApiAuth
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public string Login(string id, string type = "user", string token = null)
|
||||
{
|
||||
private IDistributedCache Cache { get; }
|
||||
return Login(id, new[] { type }, token);
|
||||
}
|
||||
|
||||
public SimApiAuth(IDistributedCache cache)
|
||||
{
|
||||
Cache = cache;
|
||||
}
|
||||
/// <summary>
|
||||
/// 产生一个Token并记录用户ID角色[多角色]
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public string Login(string id, string[] type, string uuid = null)
|
||||
{
|
||||
uuid ??= Guid.NewGuid().ToString();
|
||||
var loginItem = new SimApiLoginItem(id, type);
|
||||
cache.SetString(uuid, JsonSerializer.Serialize(loginItem));
|
||||
return uuid;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 产生一个Token记录并返回Token
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public string Login(string id, string type = "user", string token = null)
|
||||
/// <summary>
|
||||
/// 退出登陆
|
||||
/// </summary>
|
||||
/// <param name="uuid">登陆标识</param>
|
||||
public void Logout(string uuid)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(uuid))
|
||||
{
|
||||
return Login(id, new[]
|
||||
{
|
||||
type
|
||||
}, token);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 产生一个Token并记录用户ID角色[多角色]
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public string Login(string id, string[] type, string uuid = null)
|
||||
{
|
||||
uuid ??= Guid.NewGuid().ToString();
|
||||
var loginItem = new SimApiLoginItem(id, type);
|
||||
Cache.SetString(uuid, JsonSerializer.Serialize(loginItem));
|
||||
return uuid;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 退出登陆
|
||||
/// </summary>
|
||||
/// <param name="uuid">登陆标识</param>
|
||||
public void Logout(string uuid)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(uuid))
|
||||
{
|
||||
Cache.Remove(uuid);
|
||||
}
|
||||
cache.Remove(uuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
+83
-85
@@ -2,102 +2,100 @@
|
||||
using System.IO;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Minio;
|
||||
using Minio.Exceptions;
|
||||
using SimApi.Configs;
|
||||
|
||||
namespace SimApi.Helpers
|
||||
namespace SimApi.Helpers;
|
||||
|
||||
public class SimApiStorage
|
||||
{
|
||||
public class SimApiStorage
|
||||
private MinioClient Mc { get; }
|
||||
|
||||
public MinioClient Client => Mc;
|
||||
|
||||
private string ServeUrl { get; }
|
||||
|
||||
public string Bucket { get; }
|
||||
|
||||
private IHttpContextAccessor HttpContextAccessor { get; }
|
||||
|
||||
public SimApiStorage(SimApiOptions apiOptions, IHttpContextAccessor httpContextAccessor)
|
||||
{
|
||||
private MinioClient Mc { get; }
|
||||
|
||||
public MinioClient Client => Mc;
|
||||
|
||||
private string ServeUrl { get; }
|
||||
|
||||
public string Bucket { get; }
|
||||
|
||||
private IHttpContextAccessor HttpContextAccessor { get; }
|
||||
|
||||
public SimApiStorage(SimApiOptions apiOptions, IHttpContextAccessor httpContextAccessor)
|
||||
var options = apiOptions.SimApiStorageOptions;
|
||||
HttpContextAccessor = httpContextAccessor;
|
||||
var useSsl = false;
|
||||
string endpoint;
|
||||
if (options.Endpoint.StartsWith("http://"))
|
||||
{
|
||||
var options = apiOptions.SimApiStorageOptions;
|
||||
HttpContextAccessor = httpContextAccessor;
|
||||
var useSsl = false;
|
||||
string endpoint;
|
||||
if (options.Endpoint.StartsWith("http://"))
|
||||
{
|
||||
endpoint = options.Endpoint.Replace("http://", string.Empty);
|
||||
}
|
||||
else if (options.Endpoint.StartsWith("https://"))
|
||||
{
|
||||
endpoint = options.Endpoint.Replace("https://", string.Empty);
|
||||
useSsl = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("SimApiStorage: Error Endpoint");
|
||||
}
|
||||
|
||||
ServeUrl = options.ServeUrl;
|
||||
Bucket = options.Bucket;
|
||||
var mcb = new MinioClient().WithEndpoint(endpoint)
|
||||
.WithCredentials(options.AccessKey, options.SecretKey);
|
||||
if (useSsl)
|
||||
{
|
||||
mcb = mcb.WithSSL();
|
||||
}
|
||||
Mc = mcb.Build();
|
||||
|
||||
var found = Mc.BucketExistsAsync(new BucketExistsArgs().WithBucket(Bucket)).Result;
|
||||
if (!found)
|
||||
{
|
||||
Mc.MakeBucketAsync(new MakeBucketArgs().WithBucket(Bucket)).Wait();
|
||||
}
|
||||
endpoint = options.Endpoint.Replace("http://", string.Empty);
|
||||
}
|
||||
else if (options.Endpoint.StartsWith("https://"))
|
||||
{
|
||||
endpoint = options.Endpoint.Replace("https://", string.Empty);
|
||||
useSsl = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("SimApiStorage: Error Endpoint");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取上传的URL
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="expire"></param>
|
||||
/// <returns></returns>
|
||||
public string GetUploadUrl(string path, int expire = 7200)
|
||||
ServeUrl = options.ServeUrl;
|
||||
Bucket = options.Bucket;
|
||||
var mcb = new MinioClient().WithEndpoint(endpoint)
|
||||
.WithCredentials(options.AccessKey, options.SecretKey);
|
||||
if (useSsl)
|
||||
{
|
||||
return Mc.PresignedPutObjectAsync(new PresignedPutObjectArgs().WithBucket(Bucket)
|
||||
.WithObject(path).WithExpiry(expire)).Result;
|
||||
mcb = mcb.WithSSL();
|
||||
}
|
||||
Mc = mcb.Build();
|
||||
|
||||
/// <summary>
|
||||
/// 获取下载的URL
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="expire"></param>
|
||||
/// <returns></returns>
|
||||
public string GetDownloadUrl(string path, int expire = 600)
|
||||
var found = Mc.BucketExistsAsync(new BucketExistsArgs().WithBucket(Bucket)).Result;
|
||||
if (!found)
|
||||
{
|
||||
return Mc.PresignedGetObjectAsync(new PresignedGetObjectArgs().WithBucket(Bucket).WithObject(path)
|
||||
.WithExpiry(expire)).Result;
|
||||
}
|
||||
|
||||
|
||||
public string UploadFile(string path, Stream stream, string contentType = "image/png")
|
||||
{
|
||||
Mc.PutObjectAsync(new PutObjectArgs().WithBucket(Bucket).WithObject(path).WithObjectSize(stream.Length)
|
||||
.WithStreamData(stream).WithContentType(contentType)).Wait();
|
||||
return null;
|
||||
}
|
||||
|
||||
public string FullUrl(string path)
|
||||
{
|
||||
var httpRequest = HttpContextAccessor.HttpContext?.Request;
|
||||
var url = $"{httpRequest?.Scheme}://{httpRequest?.Host}";
|
||||
if (string.IsNullOrEmpty(path))
|
||||
{
|
||||
return path;
|
||||
}
|
||||
|
||||
return path.StartsWith("~") ? url + path.Substring(1, path.Length - 1) : $"{ServeUrl}{path}";
|
||||
Mc.MakeBucketAsync(new MakeBucketArgs().WithBucket(Bucket)).Wait();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取上传的URL
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="expire"></param>
|
||||
/// <returns></returns>
|
||||
public string GetUploadUrl(string path, int expire = 7200)
|
||||
{
|
||||
return Mc.PresignedPutObjectAsync(new PresignedPutObjectArgs().WithBucket(Bucket)
|
||||
.WithObject(path).WithExpiry(expire)).Result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取下载的URL
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="expire"></param>
|
||||
/// <returns></returns>
|
||||
public string GetDownloadUrl(string path, int expire = 600)
|
||||
{
|
||||
return Mc.PresignedGetObjectAsync(new PresignedGetObjectArgs().WithBucket(Bucket).WithObject(path)
|
||||
.WithExpiry(expire)).Result;
|
||||
}
|
||||
|
||||
|
||||
public string UploadFile(string path, Stream stream, string contentType = "image/png")
|
||||
{
|
||||
Mc.PutObjectAsync(new PutObjectArgs().WithBucket(Bucket).WithObject(path).WithObjectSize(stream.Length)
|
||||
.WithStreamData(stream).WithContentType(contentType)).Wait();
|
||||
return null;
|
||||
}
|
||||
|
||||
public string FullUrl(string path)
|
||||
{
|
||||
var httpRequest = HttpContextAccessor.HttpContext?.Request;
|
||||
var url = $"{httpRequest?.Scheme}://{httpRequest?.Host}";
|
||||
if (string.IsNullOrEmpty(path))
|
||||
{
|
||||
return path;
|
||||
}
|
||||
|
||||
return path.StartsWith('~') ? string.Concat(url, path.AsSpan(1, path.Length - 1)) : $"{ServeUrl}{path}";
|
||||
}
|
||||
}
|
||||
+56
-57
@@ -7,69 +7,68 @@ using System.Text.Json.Serialization;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Text.Unicode;
|
||||
|
||||
namespace SimApi.Helpers
|
||||
namespace SimApi.Helpers;
|
||||
|
||||
public static class SimApiUtil
|
||||
{
|
||||
public static class SimApiUtil
|
||||
/// <summary>
|
||||
/// 当前CST时间
|
||||
/// </summary>
|
||||
public static DateTime CstNow => DateTime.UtcNow.AddHours(8);
|
||||
|
||||
/// <summary>
|
||||
/// JSON序列化常规选项
|
||||
/// </summary>
|
||||
public static JsonSerializerOptions JsonOption => new()
|
||||
{
|
||||
/// <summary>
|
||||
/// 当前CST时间
|
||||
/// </summary>
|
||||
public static DateTime CstNow => DateTime.UtcNow.AddHours(8);
|
||||
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// JSON序列化常规选项
|
||||
/// </summary>
|
||||
public static JsonSerializerOptions JsonOption => new()
|
||||
/// <summary>
|
||||
/// 当前秒级时间戳
|
||||
/// </summary>
|
||||
public static double TimestampNow => (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds;
|
||||
|
||||
/// <summary>
|
||||
/// 检测手机号是否正确
|
||||
/// </summary>
|
||||
/// <param name="cell">手机号码</param>
|
||||
/// <returns></returns>
|
||||
public static bool CheckCell(string cell)
|
||||
{
|
||||
var regex = new Regex("^1[3456789]\\d{9}$");
|
||||
return regex.IsMatch(cell);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// MD5加密字符串
|
||||
/// </summary>
|
||||
/// <param name="source">源字符串</param>
|
||||
/// <param name="mode">加密结果"x2"结果为32位,"x3"结果为48位,"x4"结果为64位</param>
|
||||
/// <returns></returns>
|
||||
public static string Md5(string source, string mode = "x2")
|
||||
{
|
||||
var sor = Encoding.UTF8.GetBytes(source);
|
||||
var md5 = MD5.Create();
|
||||
var result = md5.ComputeHash(sor);
|
||||
var strbul = new StringBuilder(40);
|
||||
foreach (var t in result)
|
||||
{
|
||||
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 当前秒级时间戳
|
||||
/// </summary>
|
||||
public static double TimestampNow => (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds;
|
||||
|
||||
/// <summary>
|
||||
/// 检测手机号是否正确
|
||||
/// </summary>
|
||||
/// <param name="cell">手机号码</param>
|
||||
/// <returns></returns>
|
||||
public static bool CheckCell(string cell)
|
||||
{
|
||||
var regex = new Regex("^1[3456789]\\d{9}$");
|
||||
return regex.IsMatch(cell);
|
||||
strbul.Append(t.ToString(mode));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// MD5加密字符串
|
||||
/// </summary>
|
||||
/// <param name="source">源字符串</param>
|
||||
/// <param name="mode">加密结果"x2"结果为32位,"x3"结果为48位,"x4"结果为64位</param>
|
||||
/// <returns></returns>
|
||||
public static string Md5(string source, string mode = "x2")
|
||||
{
|
||||
var sor = Encoding.UTF8.GetBytes(source);
|
||||
var md5 = MD5.Create();
|
||||
var result = md5.ComputeHash(sor);
|
||||
var strbul = new StringBuilder(40);
|
||||
foreach (var t in result)
|
||||
{
|
||||
strbul.Append(t.ToString(mode));
|
||||
}
|
||||
return strbul.ToString();
|
||||
}
|
||||
|
||||
return strbul.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将对象序列化成JSON (控制台输出中文不会被编码)
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
/// <returns></returns>
|
||||
public static string Json(object obj)
|
||||
{
|
||||
return JsonSerializer.Serialize(obj, JsonOption);
|
||||
}
|
||||
/// <summary>
|
||||
/// 将对象序列化成JSON (控制台输出中文不会被编码)
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
/// <returns></returns>
|
||||
public static string Json(object obj)
|
||||
{
|
||||
return JsonSerializer.Serialize(obj, JsonOption);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user