LingAdmin/Backend/Services/Shared/LingAdmin.Shared/DTOs/ApiResponse.cs

107 lines
2.7 KiB
C#
Raw Normal View History

2026-04-16 18:13:06 +08:00
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;
}