You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
3.7 KiB
C#

// ============================================================================
// 【文件说明】HwPortalTableDataInfo.cs - 分页数据返回包装类
// ============================================================================
// 这个类用于统一返回"表格分页数据"的格式。
// 在 Java 若依RuoYi框架中有一个 TableDataInfo 类做同样的事情。
// 前端通常期望这样的 JSON 结构:
// {
// "code": 200,
// "msg": "查询成功",
// "total": 100, // 总记录数
// "rows": [...] // 当前页的数据列表
// }
// ============================================================================
namespace Admin.NET.Plugin.HwPortal;
/// <summary>
/// 分页数据返回包装类。
/// <para>
/// 【C# 语法知识点 - 泛型类 &lt;T&gt;】
/// public class HwPortalTableDataInfo&lt;T&gt; 中的 &lt;T&gt; 是泛型参数。
/// 泛型允许你编写"类型无关"的代码,使用时再指定具体类型。
///
/// 例如:
/// - HwPortalTableDataInfo&lt;HwWeb&gt; 表示"包含 HwWeb 列表的分页数据"
/// - HwPortalTableDataInfo&lt;HwProductInfo&gt; 表示"包含 HwProductInfo 列表的分页数据"
///
/// 对比 Java
/// Java 的泛型写法几乎一样public class TableDataInfo&lt;T&gt; { ... }
/// 但 Java 有"类型擦除",运行时 T 只是 Object。
/// C# 的泛型在运行时是真实类型,性能更好。
/// </para>
/// <para>
/// 【为什么需要这个类?】
/// 这是"统一响应格式"的最佳实践:
/// - 前端不需要猜测返回格式,所有接口都返回相同结构
/// - 前端分页组件可以直接读取 total 和 rows
/// - 错误处理统一code 不为 200 时显示 msg
/// </para>
/// </summary>
/// <typeparam name="T">数据行类型,例如 HwWeb、HwProductInfo 等</typeparam>
public class HwPortalTableDataInfo<T>
{
/// <summary>
/// 状态码200 表示成功。
/// <para>
/// 【C# 语法知识点 - 属性初始化器】
/// public int Code { get; set; } = 200;
/// 这里的 = 200 是"属性默认值"。
/// 如果创建对象时不赋值Code 就自动是 200。
///
/// 对比 Java
/// Java 需要在构造函数里赋默认值:
/// private int code = 200;
/// 或者:
/// public TableDataInfo() { this.code = 200; }
/// </para>
/// </summary>
public int Code { get; set; } = 200;
/// <summary>
/// 返回消息。
/// </summary>
public string Msg { get; set; } = "查询成功";
/// <summary>
/// 总记录数(用于前端分页计算)。
/// <para>
/// 前端分页组件需要知道总共有多少条记录,
/// 才能计算总页数 = Math.Ceiling(total / pageSize)。
/// </para>
/// </summary>
public long Total { get; set; }
/// <summary>
/// 当前页的数据列表。
/// <para>
/// 【C# 语法知识点 - IReadOnlyList&lt;T&gt;】
/// IReadOnlyList&lt;T&gt; 是"只读列表接口"。
/// 它比 List&lt;T&gt; 更安全,因为调用者不能修改列表内容(不能 Add/Remove
///
/// 对比 Java
/// Java 没有内置的只读列表接口,通常用 List&lt;T&gt; 或 Collections.unmodifiableList()。
/// C# 的 IReadOnlyList&lt;T&gt; 是接口级别的只读约束,更清晰。
/// </para>
/// <para>
/// 【C# 语法知识点 - Array.Empty&lt;T&gt;()】
/// = Array.Empty&lt;T&gt;() 是"空数组的单例"。
/// 每次调用都返回同一个实例,比 new T[0] 更节省内存。
///
/// 这是一个小优化点:避免每次 new 空数组产生垃圾对象。
/// </para>
/// </summary>
public IReadOnlyList<T> Rows { get; set; } = Array.Empty<T>();
}