107 lines
2.7 KiB
C#
107 lines
2.7 KiB
C#
|
|
namespace LingAdmin.Shared.DTOs;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 统一 API 响应包装器
|
||
|
|
/// </summary>
|
||
|
|
/// <typeparam name="T">数据类型</typeparam>
|
||
|
|
public class ApiResponse<T>
|
||
|
|
{
|
||
|
|
public bool Success { get; set; }
|
||
|
|
public T? Data { get; set; }
|
||
|
|
public string? Message { get; set; }
|
||
|
|
public int Code { get; set; }
|
||
|
|
public List<string>? Errors { get; set; }
|
||
|
|
public DateTime Timestamp { get; set; } = DateTime.UtcNow;
|
||
|
|
public string? TraceId { get; set; }
|
||
|
|
|
||
|
|
public static ApiResponse<T> Ok(T data, string? message = null)
|
||
|
|
{
|
||
|
|
return new ApiResponse<T>
|
||
|
|
{
|
||
|
|
Success = true,
|
||
|
|
Data = data,
|
||
|
|
Message = message,
|
||
|
|
Code = 200
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ApiResponse<T> Created(T data, string? message = null)
|
||
|
|
{
|
||
|
|
return new ApiResponse<T>
|
||
|
|
{
|
||
|
|
Success = true,
|
||
|
|
Data = data,
|
||
|
|
Message = message ?? "Created successfully",
|
||
|
|
Code = 201
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ApiResponse<T> Error(string message, int code = 400, List<string>? errors = null)
|
||
|
|
{
|
||
|
|
return new ApiResponse<T>
|
||
|
|
{
|
||
|
|
Success = false,
|
||
|
|
Message = message,
|
||
|
|
Code = code,
|
||
|
|
Errors = errors
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ApiResponse<T> NotFound(string message = "Resource not found")
|
||
|
|
{
|
||
|
|
return new ApiResponse<T>
|
||
|
|
{
|
||
|
|
Success = false,
|
||
|
|
Message = message,
|
||
|
|
Code = 404
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ApiResponse<T> Unauthorized(string message = "Unauthorized")
|
||
|
|
{
|
||
|
|
return new ApiResponse<T>
|
||
|
|
{
|
||
|
|
Success = false,
|
||
|
|
Message = message,
|
||
|
|
Code = 401
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ApiResponse<T> Forbidden(string message = "Forbidden")
|
||
|
|
{
|
||
|
|
return new ApiResponse<T>
|
||
|
|
{
|
||
|
|
Success = false,
|
||
|
|
Message = message,
|
||
|
|
Code = 403
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 分页请求
|
||
|
|
/// </summary>
|
||
|
|
public class PaginationRequest
|
||
|
|
{
|
||
|
|
public int Page { get; set; } = 1;
|
||
|
|
public int PageSize { get; set; } = 10;
|
||
|
|
public string? SortBy { get; set; }
|
||
|
|
public bool SortDescending { get; set; } = false;
|
||
|
|
public string? Search { get; set; }
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 分页响应
|
||
|
|
/// </summary>
|
||
|
|
/// <typeparam name="T">数据类型</typeparam>
|
||
|
|
public class PaginatedResponse<T>
|
||
|
|
{
|
||
|
|
public List<T> Items { get; set; } = new();
|
||
|
|
public int TotalCount { get; set; }
|
||
|
|
public int Page { get; set; }
|
||
|
|
public int PageSize { get; set; }
|
||
|
|
public int TotalPages => (int)Math.Ceiling((double)TotalCount / PageSize);
|
||
|
|
public bool HasPrevious => Page > 1;
|
||
|
|
public bool HasNext => Page < TotalPages;
|
||
|
|
}
|