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.

175 lines
6.2 KiB
C#

// ============================================================================
// 【文件说明】HwProductInfo.cs - 产品信息实体类
// ============================================================================
// 这个实体类对应数据库表 hw_product_info用于存储产品信息。
//
// 【业务场景】
// 产品信息是官网的核心数据之一,用于展示公司的产品/服务。
// 产品可以有层级关系(父子产品),支持多种配置模式。
//
// 【数据库表结构】
// hw_product_info 表字段:
// - product_info_id: 主键ID自增
// - config_type_id: 配置类型ID
// - tab_flag: 标签标记
// - config_modal: 配置模式
// - product_info_etitle: 英文标题
// - product_info_ctitle: 中文标题
// - product_info_order: 排序号
// - parent_id: 父产品ID支持层级
// - config_type_name: 配置类型名称
// + 继承自基类的公共字段
// ============================================================================
namespace Admin.NET.Plugin.HwPortal;
/// <summary>
/// 产品信息实体类。
/// <para>
/// 【业务说明】
/// 产品信息用于官网展示,支持:
/// 1. 层级结构parent_id 关联父产品,形成树形结构
/// 2. 多种配置模式config_modal 区分不同的展示方式
/// 3. 排序product_info_order 控制展示顺序
/// </para>
/// </summary>
[SugarTable("hw_product_info")]
public class HwProductInfo : HwPortalBaseEntity
{
/// <summary>
/// 产品主键ID。
/// </summary>
[SugarColumn(ColumnName = "product_info_id", IsPrimaryKey = true, IsIdentity = true)]
public long? ProductInfoId { get; set; }
/// <summary>
/// 配置类型ID。
/// <para>
/// 【业务说明】
/// 关联 hw_portal_config_type 表,用于分类产品。
/// 例如:硬件产品、软件产品、服务等。
/// </para>
/// </summary>
[SugarColumn(ColumnName = "config_type_id")]
public string ConfigTypeId { get; set; }
/// <summary>
/// 标签标记。
/// <para>
/// 【业务说明】
/// 用于标记产品的特殊属性,如"热门"、"新品"、"推荐"等。
/// </para>
/// </summary>
[SugarColumn(ColumnName = "tab_flag")]
public string TabFlag { get; set; }
/// <summary>
/// 配置模式。
/// <para>
/// 【业务说明】
/// 不同的配置模式决定产品的展示方式:
/// - "1": 模式1列表展示
/// - "2": 模式2卡片展示
/// - "13": 树形展示(支持层级结构)
///
/// 这个字段让前端可以根据模式选择不同的渲染组件。
/// </para>
/// </summary>
[SugarColumn(ColumnName = "config_modal")]
public string ConfigModal { get; set; }
/// <summary>
/// 产品英文标题。
/// </summary>
[SugarColumn(ColumnName = "product_info_etitle")]
public string ProductInfoEtitle { get; set; }
/// <summary>
/// 产品中文标题。
/// </summary>
[SugarColumn(ColumnName = "product_info_ctitle")]
public string ProductInfoCtitle { get; set; }
/// <summary>
/// 排序号。
/// <para>
/// 【业务说明】
/// 数值越小越靠前,用于控制产品在列表中的展示顺序。
/// </para>
/// </summary>
[SugarColumn(ColumnName = "product_info_order")]
public long? ProductInfoOrder { get; set; }
/// <summary>
/// 父产品ID。
/// <para>
/// 【树形结构说明】
/// - parent_id 为 null 或 0顶级产品
/// - parent_id 有值:子产品,关联父产品
///
/// 这样可以形成层级结构:
/// 产品A (parent_id = null)
/// ├── 产品A-1 (parent_id = A的ID)
/// └── 产品A-2 (parent_id = A的ID)
///
/// 对比 Java 若依:
/// 若依的菜单、部门等也是类似的树形结构设计。
/// </para>
/// </summary>
[SugarColumn(ColumnName = "parent_id")]
public long? ParentId { get; set; }
/// <summary>
/// 配置类型名称(冗余字段)。
/// <para>
/// 【冗余字段说明】
/// 这个字段存储 config_type_name虽然可以通过 config_type_id 关联查询得到,
/// 但直接存储可以减少 JOIN 查询,提高查询性能。
///
/// 这是"空间换时间"的设计权衡:
/// - 优点:查询快,不需要 JOIN
/// - 缺点:需要维护数据一致性
///
/// 对比 Java
/// Java 项目中也常见这种冗余字段设计,特别是在高并发场景。
/// </para>
/// </summary>
[SugarColumn(ColumnName = "config_type_name")]
public string ConfigTypeName { get; set; }
/// <summary>
/// 产品明细列表(导航属性)。
/// <para>
/// 【C# 语法知识点 - 导航属性】
/// 导航属性是 ORM 中的概念,用于表示实体之间的关联关系。
/// 这里的 HwProductInfoDetailList 表示"一个产品有多个明细"。
///
/// 【SugarColumn(IsIgnore = true) 说明】
/// IsIgnore = true 表示这个属性不映射到数据库列。
/// 它是一个"计算属性",由业务代码填充,而不是从数据库读取。
///
/// 对比 Java JPA
/// JPA 的导航属性:
/// @OneToMany(mappedBy = "productInfo", cascade = CascadeType.ALL)
/// private List&lt;HwProductInfoDetail&gt; details = new ArrayList&lt;&gt;();
///
/// JPA 会自动加载关联数据(懒加载或急加载),
/// 但 SqlSugar 这里需要手动填充,更灵活但需要更多代码。
/// </para>
/// </summary>
[SugarColumn(IsIgnore = true)]
// 【C# 语法知识点 - 集合初始化器】
// = new() 是 C# 9.0 的"目标类型 new"语法。
// 编译器会根据类型推断自动创建 List&lt;HwProductInfoDetail&gt;()。
//
// 对比 Java
// Java 需要写完整:
// private List&lt;HwProductInfoDetail&gt; details = new ArrayList&lt;&gt;();
//
// 为什么初始化为空列表而不是 null
// 1. 避免 NullReferenceException
// 2. 可以直接遍历foreach (var item in list) 不需要判空
// 3. 可以直接添加list.Add(item) 不需要先 new
public List<HwProductInfoDetail> HwProductInfoDetailList { get; set; } = new();
}