AdminResultProvider.cs 5.1 KB

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