|
|
// ============================================================================
|
|
|
// 【文件说明】HwPortalTableDataInfo.cs - 分页数据返回包装类
|
|
|
// ============================================================================
|
|
|
// 这个类用于统一返回"表格分页数据"的格式。
|
|
|
// 在 Java 若依(RuoYi)框架中,有一个 TableDataInfo 类做同样的事情。
|
|
|
// 前端通常期望这样的 JSON 结构:
|
|
|
// {
|
|
|
// "code": 200,
|
|
|
// "msg": "查询成功",
|
|
|
// "total": 100, // 总记录数
|
|
|
// "rows": [...] // 当前页的数据列表
|
|
|
// }
|
|
|
// ============================================================================
|
|
|
|
|
|
namespace Admin.NET.Plugin.HwPortal;
|
|
|
|
|
|
/// <summary>
|
|
|
/// 分页数据返回包装类。
|
|
|
/// <para>
|
|
|
/// 【C# 语法知识点 - 泛型类 <T>】
|
|
|
/// public class HwPortalTableDataInfo<T> 中的 <T> 是泛型参数。
|
|
|
/// 泛型允许你编写"类型无关"的代码,使用时再指定具体类型。
|
|
|
///
|
|
|
/// 例如:
|
|
|
/// - HwPortalTableDataInfo<HwWeb> 表示"包含 HwWeb 列表的分页数据"
|
|
|
/// - HwPortalTableDataInfo<HwProductInfo> 表示"包含 HwProductInfo 列表的分页数据"
|
|
|
///
|
|
|
/// 对比 Java:
|
|
|
/// Java 的泛型写法几乎一样:public class TableDataInfo<T> { ... }
|
|
|
/// 但 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<T>】
|
|
|
/// IReadOnlyList<T> 是"只读列表接口"。
|
|
|
/// 它比 List<T> 更安全,因为调用者不能修改列表内容(不能 Add/Remove)。
|
|
|
///
|
|
|
/// 对比 Java:
|
|
|
/// Java 没有内置的只读列表接口,通常用 List<T> 或 Collections.unmodifiableList()。
|
|
|
/// C# 的 IReadOnlyList<T> 是接口级别的只读约束,更清晰。
|
|
|
/// </para>
|
|
|
/// <para>
|
|
|
/// 【C# 语法知识点 - Array.Empty<T>()】
|
|
|
/// = Array.Empty<T>() 是"空数组的单例"。
|
|
|
/// 每次调用都返回同一个实例,比 new T[0] 更节省内存。
|
|
|
///
|
|
|
/// 这是一个小优化点:避免每次 new 空数组产生垃圾对象。
|
|
|
/// </para>
|
|
|
/// </summary>
|
|
|
public IReadOnlyList<T> Rows { get; set; } = Array.Empty<T>();
|
|
|
}
|