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#

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.

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