mirror of
				https://gitee.com/ThingsGateway/ThingsGateway.git
				synced 2025-10-31 23:53:58 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | ||
| //  此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
 | ||
| //  此代码版权(除特别声明外的代码)归作者本人Diego所有
 | ||
| //  源代码使用协议遵循本仓库的开源协议及附加协议
 | ||
| //  Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
 | ||
| //  Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
 | ||
| //  使用文档:https://thingsgateway.cn/
 | ||
| //  QQ群:605534569
 | ||
| //------------------------------------------------------------------------------
 | ||
| 
 | ||
| using Microsoft.AspNetCore.Http;
 | ||
| using Microsoft.AspNetCore.Mvc;
 | ||
| using Microsoft.AspNetCore.Mvc.Filters;
 | ||
| using Microsoft.Extensions.Localization;
 | ||
| 
 | ||
| using ThingsGateway.DataValidation;
 | ||
| using ThingsGateway.FriendlyException;
 | ||
| using ThingsGateway.Razor;
 | ||
| using ThingsGateway.UnifyResult;
 | ||
| 
 | ||
| namespace ThingsGateway.Admin.Application;
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// 规范化RESTful风格返回值
 | ||
| /// </summary>
 | ||
| [UnifyModel(typeof(UnifyResult<>))]
 | ||
| public class UnifyResultProvider : IUnifyResultProvider
 | ||
| {
 | ||
|     private static IStringLocalizer Localizer = App.CreateLocalizerByType(typeof(UnifyResultProvider))!;
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// 状态码响应拦截
 | ||
|     /// </summary>
 | ||
|     public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings = null)
 | ||
|     {
 | ||
|         switch (statusCode)
 | ||
|         {
 | ||
|             // 处理 401 状态码
 | ||
|             case StatusCodes.Status401Unauthorized:
 | ||
|                 await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, false, Localizer["TokenOver"].Value)).ConfigureAwait(false);
 | ||
|                 break;
 | ||
|             // 处理 403 状态码
 | ||
|             case StatusCodes.Status403Forbidden:
 | ||
|                 await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, false, default, Localizer["NoPermission"].Value)).ConfigureAwait(false);
 | ||
|                 break;
 | ||
| 
 | ||
|             default: break;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     /// <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));
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// 返回 RESTful 风格结果集
 | ||
|     /// </summary>
 | ||
|     /// <param name="statusCode">状态码</param>
 | ||
|     /// <param name="succeeded">是否成功</param>
 | ||
|     /// <param name="data">数据</param>
 | ||
|     /// <param name="errors">错误信息</param>
 | ||
|     /// <returns></returns>
 | ||
|     private static UnifyResult<object> RESTfulResult(int statusCode, bool succeeded = default, object? data = default, object? errors = default)
 | ||
|     {
 | ||
|         return new UnifyResult<object>
 | ||
|         {
 | ||
|             Code = statusCode,
 | ||
|             Msg = statusCode == StatusCodes.Status200OK ? "Success" : errors,
 | ||
|             Data = data,
 | ||
|             Time = DateTime.Now,
 | ||
|         };
 | ||
|     }
 | ||
| 
 | ||
|     public IActionResult OnAuthorizeException(DefaultHttpContext context, ExceptionMetadata metadata)
 | ||
|     {
 | ||
|         return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors ?? metadata.Exception?.Message)
 | ||
|                , UnifyContext.GetSerializerSettings(context));
 | ||
|     }
 | ||
| 
 | ||
|     public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
 | ||
|     {
 | ||
|         return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors ?? metadata.Exception?.Message)
 | ||
|                  , UnifyContext.GetSerializerSettings(context));
 | ||
|     }
 | ||
| 
 | ||
|     public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
 | ||
|     {
 | ||
|         return new JsonResult(RESTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, data: metadata.Data, errors: metadata.ValidationResult) // 如果需要只显示第一条错误,修改为:errors: metadata.FirstErrorMessage
 | ||
|                       , UnifyContext.GetSerializerSettings(context));
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
| }
 | 
