AdminResultProvider.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证。
  2. //
  3. // 必须在法律法规允许的范围内正确使用,严禁将其用于非法、欺诈、恶意或侵犯他人合法权益的目的。
  4. namespace Admin.NET.Core;
  5. /// <summary>
  6. /// 全局规范化结果
  7. /// </summary>
  8. [UnifyModel(typeof(AdminResult<>))]
  9. public class AdminResultProvider : IUnifyResultProvider
  10. {
  11. /// <summary>
  12. /// 异常返回值
  13. /// </summary>
  14. /// <param name="context"></param>
  15. /// <param name="metadata"></param>
  16. /// <returns></returns>
  17. public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
  18. {
  19. return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors), UnifyContext.GetSerializerSettings(context));
  20. }
  21. /// <summary>
  22. /// 成功返回值
  23. /// </summary>
  24. /// <param name="context"></param>
  25. /// <param name="data"></param>
  26. /// <returns></returns>
  27. public IActionResult OnSucceeded(ActionExecutedContext context, object data)
  28. {
  29. return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data), UnifyContext.GetSerializerSettings(context));
  30. }
  31. /// <summary>
  32. /// 验证失败返回值
  33. /// </summary>
  34. /// <param name="context"></param>
  35. /// <param name="metadata"></param>
  36. /// <returns></returns>
  37. public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
  38. {
  39. return new JsonResult(RESTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, data: metadata.Data, errors: metadata.ValidationResult), UnifyContext.GetSerializerSettings(context));
  40. }
  41. /// <summary>
  42. /// 特定状态码返回值
  43. /// </summary>
  44. /// <param name="context"></param>
  45. /// <param name="statusCode"></param>
  46. /// <param name="unifyResultSettings"></param>
  47. /// <returns></returns>
  48. public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)
  49. {
  50. // 设置响应状态码
  51. UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);
  52. switch (statusCode)
  53. {
  54. // 处理 401 状态码
  55. case StatusCodes.Status401Unauthorized:
  56. var msg = "401 登录已过期,请重新登录";
  57. // 若存在身份验证失败消息,则返回消息内容
  58. if (context.Items.TryGetValue(SignatureAuthenticationDefaults.AuthenticateFailMsgKey, out var authFailMsg))
  59. msg = authFailMsg + "";
  60. await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: msg),
  61. App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
  62. break;
  63. // 处理 403 状态码
  64. case StatusCodes.Status403Forbidden:
  65. await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 禁止访问,没有权限"),
  66. App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
  67. break;
  68. default: break;
  69. }
  70. }
  71. /// <summary>
  72. /// 返回 RESTful 风格结果集
  73. /// </summary>
  74. /// <param name="statusCode"></param>
  75. /// <param name="succeeded"></param>
  76. /// <param name="data"></param>
  77. /// <param name="errors"></param>
  78. /// <returns></returns>
  79. private static AdminResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default)
  80. {
  81. //// 统一返回值脱敏处理
  82. //if (data?.GetType() == typeof(String))
  83. //{
  84. // data = App.GetRequiredService<ISensitiveDetectionProvider>().ReplaceAsync(data.ToString(), '*').GetAwaiter().GetResult();
  85. //}
  86. //else if (data?.GetType() == typeof(JsonResult))
  87. //{
  88. // data = App.GetRequiredService<ISensitiveDetectionProvider>().ReplaceAsync(JSON.Serialize(data), '*').GetAwaiter().GetResult();
  89. //}
  90. return new AdminResult<object>
  91. {
  92. Code = statusCode,
  93. Message = errors is null or string ? (errors + "") : JSON.Serialize(errors),
  94. Result = data,
  95. Type = succeeded ? "success" : "error",
  96. Extras = UnifyContext.Take(),
  97. Time = DateTime.Now
  98. };
  99. }
  100. }
  101. /// <summary>
  102. /// 全局返回结果
  103. /// </summary>
  104. /// <typeparam name="T"></typeparam>
  105. public class AdminResult<T>
  106. {
  107. /// <summary>
  108. /// 状态码
  109. /// </summary>
  110. public int Code { get; set; }
  111. /// <summary>
  112. /// 类型success、warning、error
  113. /// </summary>
  114. public string Type { get; set; }
  115. /// <summary>
  116. /// 错误信息
  117. /// </summary>
  118. public string Message { get; set; }
  119. /// <summary>
  120. /// 数据
  121. /// </summary>
  122. public T Result { get; set; }
  123. /// <summary>
  124. /// 附加数据
  125. /// </summary>
  126. public object Extras { get; set; }
  127. /// <summary>
  128. /// 时间
  129. /// </summary>
  130. public DateTime Time { get; set; }
  131. }