// Admin.NET 项目的版æƒã€å•†æ ‡ã€ä¸“利和其他相关æƒåˆ©å‡å—ç›¸åº”æ³•å¾‹æ³•è§„çš„ä¿æŠ¤ã€‚ä½¿ç”¨æœ¬é¡¹ç›®åº”éµå®ˆç›¸å…³æ³•律法规和许å¯è¯çš„è¦æ±‚。
//
// 本项目主è¦éµå¾ª MIT 许å¯è¯å’Œ Apache 许å¯è¯ï¼ˆç‰ˆæœ¬ 2.0)进行分å‘和使用。许å¯è¯ä½äºŽæºä»£ç æ ‘æ ¹ç›®å½•ä¸çš„ LICENSE-MIT å’Œ LICENSE-APACHE 文件。
//
// ä¸å¾—利用本项目从事å±å®³å›½å®¶å®‰å…¨ã€æ‰°ä¹±ç¤¾ä¼šç§©åºã€ä¾µçŠ¯ä»–äººåˆæ³•æƒç›Šç‰æ³•å¾‹æ³•è§„ç¦æ¢çš„æ´»åЍï¼ä»»ä½•基于本项目二次开å‘è€Œäº§ç”Ÿçš„ä¸€åˆ‡æ³•å¾‹çº çº·å’Œè´£ä»»ï¼Œæˆ‘ä»¬ä¸æ‰¿æ‹…任何责任ï¼
namespace Admin.NET.Core;
/// <summary>
/// 全局规范化结果
/// </summary>
[UnifyModel(typeof(AdminResult<>))]
public class AdminResultProvider : IUnifyResultProvider
{
/// <summary>
/// JWT 授æƒå¼‚常返回值
/// </summary>
/// <param name="context"></param>
/// <param name="metadata"></param>
/// <returns></returns>
public IActionResult OnAuthorizeException(DefaultHttpContext context, ExceptionMetadata metadata)
{
return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors), UnifyContext.GetSerializerSettings(context));
}
/// <summary>
/// 异常返回值
/// </summary>
/// <param name="context"></param>
/// <param name="metadata"></param>
/// <returns></returns>
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
{
return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors), UnifyContext.GetSerializerSettings(context));
}
/// <summary>
/// æˆåŠŸè¿”å›žå€¼
/// </summary>
/// <param name="context"></param>
/// <param name="data"></param>
/// <returns></returns>
public IActionResult OnSucceeded(ActionExecutedContext context, object data)
{
return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data), UnifyContext.GetSerializerSettings(context));
}
/// <summary>
/// 验è¯å¤±è´¥è¿”回值
/// </summary>
/// <param name="context"></param>
/// <param name="metadata"></param>
/// <returns></returns>
public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
{
return new JsonResult(RESTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, data: metadata.Data, errors: metadata.ValidationResult), UnifyContext.GetSerializerSettings(context));
}
/// <summary>
/// 特定状æ€ç 返回值
/// </summary>
/// <param name="context"></param>
/// <param name="statusCode"></param>
/// <param name="unifyResultSettings"></param>
/// <returns></returns>
public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)
{
// 设置å“应状æ€ç
UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);
switch (statusCode)
{
// å¤„ç† 401 状æ€ç
case StatusCodes.Status401Unauthorized:
var msg = "401 ç™»å½•å·²è¿‡æœŸï¼Œè¯·é‡æ–°ç™»å½•";
// è‹¥å˜åœ¨èº«ä»½éªŒè¯å¤±è´¥æ¶ˆæ¯ï¼Œåˆ™è¿”回消æ¯å†…容
if (context.Items.TryGetValue(SignatureAuthenticationDefaults.AuthenticateFailMsgKey, out var authFailMsg))
msg = authFailMsg + "";
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: msg),
App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
break;
// å¤„ç† 403 状æ€ç
case StatusCodes.Status403Forbidden:
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 ç¦æ¢è®¿é—®ï¼Œæ²¡æœ‰æƒé™"),
App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
break;
// å¤„ç† 302 状æ€ç
case StatusCodes.Status302Found:
if (context.Response.Headers.TryGetValue("Location", out var redirectUrl))
{
context.Response.Redirect(redirectUrl);
}
else
{
var errorMessage = "302 跳转失败,没有æä¾› Location 头信æ¯";
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: errorMessage),
App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
}
break;
default: break;
}
}
/// <summary>
/// 返回 RESTful é£Žæ ¼ç»“æžœé›†
/// </summary>
/// <param name="statusCode"></param>
/// <param name="succeeded"></param>
/// <param name="data"></param>
/// <param name="errors"></param>
/// <returns></returns>
private static AdminResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default)
{
//// 统一返回值脱æ•处ç†
//if (data?.GetType() == typeof(String))
//{
// data = App.GetRequiredService<ISensitiveDetectionProvider>().ReplaceAsync(data.ToString(), '*').GetAwaiter().GetResult();
//}
//else if (data?.GetType() == typeof(JsonResult))
//{
// data = App.GetRequiredService<ISensitiveDetectionProvider>().ReplaceAsync(JSON.Serialize(data), '*').GetAwaiter().GetResult();
//}
return new AdminResult<object>
{
Code = statusCode,
Message = errors is null or string ? (errors + "") : JSON.Serialize(errors),
Result = data,
Type = succeeded ? "success" : "error",
Extras = UnifyContext.Take(),
Time = DateTime.Now
};
}
}
/// <summary>
/// 全局返回结果
/// </summary>
/// <typeparam name="T"></typeparam>
public class AdminResult<T>
{
/// <summary>
/// 状æ€ç
/// </summary>
public int Code { get; set; }
/// <summary>
/// 类型successã€warningã€error
/// </summary>
public string Type { get; set; }
/// <summary>
/// 错误信æ¯
/// </summary>
public string Message { get; set; }
/// <summary>
/// æ•°æ®
/// </summary>
public T Result { get; set; }
/// <summary>
/// é™„åŠ æ•°æ®
/// </summary>
public object Extras { get; set; }
/// <summary>
/// æ—¶é—´
/// </summary>
public DateTime Time { get; set; }
}