GoViewResultProvider.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // 大名科技(天津)有限公司 版权所有
  2. //
  3. // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
  4. //
  5. // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动
  6. //
  7. // 任何基于本项目二次开发而产生的一切法律纠纷和责任,均与作者无关
  8. namespace Admin.NET.Plugin.GoView;
  9. /// <summary>
  10. /// GoView 规范化结果
  11. /// </summary>
  12. [UnifyModel(typeof(GoViewResult<>))]
  13. public class GoViewResultProvider : 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));
  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));
  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));
  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. await context.Response.WriteAsJsonAsync(RESTfulResult(886, errors: "401 登录已过期,请重新登录"),
  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 GoViewResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default)
  80. {
  81. return new GoViewResult<object>
  82. {
  83. Code = statusCode,
  84. Msg = errors is null or string ? (errors + "") : JSON.Serialize(errors),
  85. Data = data,
  86. Count = data != null && data.GetType().IsGenericType && data.GetType().GetGenericTypeDefinition() == typeof(List<>) ? ((IList)data).Count : null
  87. };
  88. }
  89. }
  90. /// <summary>
  91. /// GoView 返回结果
  92. /// </summary>
  93. /// <typeparam name="T"></typeparam>
  94. public class GoViewResult<T>
  95. {
  96. /// <summary>
  97. /// 状态码
  98. /// </summary>
  99. public int Code { get; set; }
  100. /// <summary>
  101. /// 信息
  102. /// </summary>
  103. public string Msg { get; set; }
  104. /// <summary>
  105. /// 数据
  106. /// </summary>
  107. public T Data { get; set; }
  108. /// <summary>
  109. /// 总数
  110. /// </summary>
  111. public int? Count { get; set; }
  112. }