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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// ============================================================================
// 【文件说明】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>();
}