api管理器
This commit is contained in:
parent
9662da3139
commit
498913bb25
221
Falcon.SugarApi/ApiManager/ApiControllerBase.cs
Normal file
221
Falcon.SugarApi/ApiManager/ApiControllerBase.cs
Normal file
|
@ -0,0 +1,221 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Caching.Distributed;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.Encodings.Web;
|
||||
using System.Text.Json;
|
||||
using System.Text.Unicode;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Falcon.SugarApi.ApiManager
|
||||
{
|
||||
/// <summary>
|
||||
/// api控制器基类
|
||||
/// </summary>
|
||||
[Area("api")]
|
||||
[ApiController]
|
||||
[Route("[Area]/[Controller]/[Action]")]
|
||||
public abstract class ApiControllerBase:ControllerBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 日志记录服务
|
||||
/// </summary>
|
||||
public ILogger Logger { get; set; }
|
||||
/// <summary>
|
||||
/// 服务集合
|
||||
/// </summary>
|
||||
public IServiceProvider Services { get; set; }
|
||||
/// <summary>
|
||||
/// 应用程序跟目录
|
||||
/// </summary>
|
||||
public string AppPath => AppDomain.CurrentDomain.BaseDirectory;
|
||||
|
||||
/// <summary>
|
||||
/// 请求的控制器名称
|
||||
/// </summary>
|
||||
public string? ControllerName => this.RouteData.Values["controller"]?.ToString();
|
||||
/// <summary>
|
||||
/// 请求的方法名称
|
||||
/// </summary>
|
||||
public string? ActionName => this.RouteData.Values["action"]?.ToString();
|
||||
|
||||
/// <summary>
|
||||
/// 构造控制器基类
|
||||
/// </summary>
|
||||
/// <param name="service"></param>
|
||||
protected ApiControllerBase(IServiceProvider service) {
|
||||
this.Services = service;
|
||||
this.Logger = service.GetService(typeof(ILogger<>).MakeGenericType(GetType())) as ILogger ?? throw new NullReferenceException("ILogger");
|
||||
}
|
||||
|
||||
#region 记录日志
|
||||
|
||||
/// <summary>
|
||||
/// 记录信息日志
|
||||
/// </summary>
|
||||
/// <param name="msg">信息文本</param>
|
||||
protected virtual void SaveLog(string msg) => this.Logger.LogInformation($"信息:{msg}");
|
||||
/// <summary>
|
||||
/// 记录错误日志
|
||||
/// </summary>
|
||||
/// <param name="err">错误信息</param>
|
||||
protected virtual void SaveLogError(string err) => this.Logger.LogError($"错误:{err}");
|
||||
|
||||
/// <summary>
|
||||
/// 记录异常日志
|
||||
/// </summary>
|
||||
/// <param name="ex">异常信息</param>
|
||||
protected virtual void SaveLogException(Exception ex) => this.Logger.LogCritical($"异常:{ex}");
|
||||
/// <summary>
|
||||
/// 保存log日志
|
||||
/// </summary>
|
||||
/// <param name="context">数据上下文</param>
|
||||
protected virtual void SaveLog(LoggerContext context) {
|
||||
if(context == null) {
|
||||
return;
|
||||
}
|
||||
var sb = new StringBuilder();
|
||||
sb.AppendLine($"接收到的数据:{context.Data}");
|
||||
sb.AppendLine($"返回结果:{context.Result}");
|
||||
sb.AppendLine($"异常:{context.Exception}");
|
||||
if(context.Exception == "") {
|
||||
this.Logger.LogInformation(sb.ToString());
|
||||
}
|
||||
else {
|
||||
this.Logger.LogError(sb.ToString());
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 保存请求日志
|
||||
/// </summary>
|
||||
/// <typeparam name="TData">请求数据类型</typeparam>
|
||||
/// <typeparam name="TResult">返回的数据类型</typeparam>
|
||||
/// <param name="data">请求的数据</param>
|
||||
/// <param name="result">返回的数据</param>
|
||||
/// <param name="exception">执行过程中异常</param>
|
||||
protected virtual void SaveLog<TData, TResult>(TData? data,TResult? result,Exception? exception = null) {
|
||||
var context = new LoggerContext();
|
||||
context.Data = data == null ? "" : this.JsonSerialize(data);
|
||||
context.Result = result == null ? "" : this.JsonSerialize(result);
|
||||
context.Exception = exception == null ? "" : exception.ToString();
|
||||
SaveLog(context);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 序列化
|
||||
/// <summary>
|
||||
/// 从对象序列化字符串
|
||||
/// </summary>
|
||||
/// <typeparam name="T">对象类型</typeparam>
|
||||
/// <param name="obj">要序列化的对象</param>
|
||||
/// <returns>字符串</returns>
|
||||
protected string JsonSerialize<T>(T obj) {
|
||||
return JsonSerializer.Serialize<T>(obj,new JsonSerializerOptions {
|
||||
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 从字符串反序列化对象
|
||||
/// </summary>
|
||||
/// <typeparam name="T">对象的类型</typeparam>
|
||||
/// <param name="json">json字符串</param>
|
||||
/// <returns>对象实例</returns>
|
||||
protected T? JsonDeserialize<T>(string json) where T : class {
|
||||
return JsonSerializer.Deserialize<T>(json);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 数据验证
|
||||
/// <summary>
|
||||
/// 验证对象的所有属性是否满足定义
|
||||
/// </summary>
|
||||
/// <param name="value">要验证的对象的值</param>
|
||||
/// <returns></returns>
|
||||
protected virtual (bool isValid, List<ValidationResult>? failProps) ModelValidation(object? value) {
|
||||
if(value == null) return (false, null);
|
||||
var context = new ValidationContext(value);
|
||||
var validations = new List<ValidationResult>();
|
||||
var r = Validator.TryValidateObject(value,context,validations,true);
|
||||
return (r, validations);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 返回结果
|
||||
|
||||
/// <summary>
|
||||
/// 同步返回成功的结果
|
||||
/// </summary>
|
||||
/// <typeparam name="T">data携带的数据类型</typeparam>
|
||||
/// <param name="resultBuilder">返回结果创建者</param>
|
||||
/// <returns>同步api结果</returns>
|
||||
protected virtual ApiResult<T> SuccessResult<T>(Action<ApiResult<T>>? resultBuilder) {
|
||||
var result = new ApiResult<T> {
|
||||
Code = 0,Msg = ""
|
||||
};
|
||||
resultBuilder?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
/// <summary>
|
||||
/// 同步返回成功的结果
|
||||
/// </summary>
|
||||
/// <typeparam name="T">data携带的数据类型</typeparam>
|
||||
/// <param name="result">携带数据</param>
|
||||
/// <returns>同步api结果</returns>
|
||||
protected virtual ApiResult<T> SuccessResult<T>(T result)
|
||||
=> SuccessResult<T>(b => b.Data = result);
|
||||
|
||||
/// <summary>
|
||||
/// 异步返回成功的结果
|
||||
/// </summary>
|
||||
/// <typeparam name="T">data携带的数据类型</typeparam>
|
||||
/// <param name="result">携带数据</param>
|
||||
/// <returns>异步api结果</returns>
|
||||
protected virtual async Task<ApiResult<T>> SuccessResultAsync<T>(T result)
|
||||
=> await Task.FromResult(SuccessResult(result));
|
||||
|
||||
/// <summary>
|
||||
/// 同步返回失败的结果
|
||||
/// </summary>
|
||||
/// <typeparam name="T">data携带的数据类型</typeparam>
|
||||
/// <param name="failResultBuilder">失败信息创建器</param>
|
||||
/// <returns>异步api结果</returns>
|
||||
protected virtual ApiResult<T> FailResult<T>(Action<ApiResult<T>>? failResultBuilder) {
|
||||
var result = new ApiResult<T> { Code = 1 };
|
||||
failResultBuilder?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 同步返回失败的结果
|
||||
/// </summary>
|
||||
/// <typeparam name="T">data携带的数据类型</typeparam>
|
||||
/// <param name="failMessage">失败信息</param>
|
||||
/// <returns>异步api结果</returns>
|
||||
protected virtual ApiResult<T> FailResult<T>(string failMessage)
|
||||
=> FailResult<T>(b => b.Msg = failMessage);
|
||||
|
||||
/// <summary>
|
||||
/// 同步返回失败的结果
|
||||
/// </summary>
|
||||
/// <typeparam name="T">data携带的数据类型</typeparam>
|
||||
/// <param name="exception">异常</param>
|
||||
/// <returns>异步api结果</returns>
|
||||
protected virtual ApiResult<T> FailResult<T>(Exception exception)
|
||||
=> FailResult<T>(b => {
|
||||
b.Msg = "运行发生异常";
|
||||
b.Exception = exception.ToString();
|
||||
});
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
9
Falcon.SugarApi/ApiManager/ApiRequest.cs
Normal file
9
Falcon.SugarApi/ApiManager/ApiRequest.cs
Normal file
|
@ -0,0 +1,9 @@
|
|||
namespace Falcon.SugarApi.ApiManager
|
||||
{
|
||||
/// <summary>
|
||||
/// Api请求
|
||||
/// </summary>
|
||||
public class ApiRequest
|
||||
{
|
||||
}
|
||||
}
|
35
Falcon.SugarApi/ApiManager/ApiResult.cs
Normal file
35
Falcon.SugarApi/ApiManager/ApiResult.cs
Normal file
|
@ -0,0 +1,35 @@
|
|||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Falcon.SugarApi.ApiManager
|
||||
{
|
||||
/// <summary>
|
||||
/// api返回结果
|
||||
/// </summary>
|
||||
/// <typeparam name="T">携带的数据类型</typeparam>
|
||||
public class ApiResult<T>
|
||||
{
|
||||
/// <summary>
|
||||
/// 结果代码 0成功 1失败
|
||||
/// </summary>
|
||||
[JsonPropertyName("code")]
|
||||
public int Code { get; set; }
|
||||
/// <summary>
|
||||
/// 失败信息
|
||||
/// </summary>
|
||||
[JsonPropertyName("msg")]
|
||||
public string Msg { get; set; }
|
||||
/// <summary>
|
||||
/// 程序发生的异常
|
||||
/// </summary>
|
||||
public string? Exception { get; set; }
|
||||
/// <summary>
|
||||
/// 分页结果。如果为null则为未分页
|
||||
/// </summary>
|
||||
public PageResult? Paging { get; set; }
|
||||
/// <summary>
|
||||
/// 携带数据
|
||||
/// </summary>
|
||||
[JsonPropertyName("data")]
|
||||
public T? Data { get; set; }
|
||||
}
|
||||
}
|
21
Falcon.SugarApi/ApiManager/LoggerContext.cs
Normal file
21
Falcon.SugarApi/ApiManager/LoggerContext.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
namespace Falcon.SugarApi.ApiManager
|
||||
{
|
||||
/// <summary>
|
||||
/// api日志上下文
|
||||
/// </summary>
|
||||
public class LoggerContext
|
||||
{
|
||||
/// <summary>
|
||||
/// 接收数据
|
||||
/// </summary>
|
||||
public string? Data { get; set; }
|
||||
/// <summary>
|
||||
/// 返回结果
|
||||
/// </summary>
|
||||
public string? Result { get; set; }
|
||||
/// <summary>
|
||||
/// 执行异常
|
||||
/// </summary>
|
||||
public string? Exception { get; set; }
|
||||
}
|
||||
}
|
23
Falcon.SugarApi/ApiManager/PageResult.cs
Normal file
23
Falcon.SugarApi/ApiManager/PageResult.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
|
||||
namespace Falcon.SugarApi.ApiManager
|
||||
{
|
||||
/// <summary>
|
||||
/// 数据分页结果
|
||||
/// </summary>
|
||||
public class PageResult
|
||||
{
|
||||
/// <summary>
|
||||
/// 页号码。从1开始
|
||||
/// </summary>
|
||||
public int Page { get; set; } = 1;
|
||||
/// <summary>
|
||||
/// 页大小
|
||||
/// </summary>
|
||||
public int PageSize { get; set; } = 50;
|
||||
/// <summary>
|
||||
/// 总数据数
|
||||
/// </summary>
|
||||
public int Count { get; set; } = 0;
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user