|
|
// ============================================================================
|
|
|
// 【文件说明】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<HwProductInfoDetail> details = new ArrayList<>();
|
|
|
///
|
|
|
/// JPA 会自动加载关联数据(懒加载或急加载),
|
|
|
/// 但 SqlSugar 这里需要手动填充,更灵活但需要更多代码。
|
|
|
/// </para>
|
|
|
/// </summary>
|
|
|
[SugarColumn(IsIgnore = true)]
|
|
|
// 【C# 语法知识点 - 集合初始化器】
|
|
|
// = new() 是 C# 9.0 的"目标类型 new"语法。
|
|
|
// 编译器会根据类型推断自动创建 List<HwProductInfoDetail>()。
|
|
|
//
|
|
|
// 对比 Java:
|
|
|
// Java 需要写完整:
|
|
|
// private List<HwProductInfoDetail> details = new ArrayList<>();
|
|
|
//
|
|
|
// 为什么初始化为空列表而不是 null?
|
|
|
// 1. 避免 NullReferenceException
|
|
|
// 2. 可以直接遍历:foreach (var item in list) 不需要判空
|
|
|
// 3. 可以直接添加:list.Add(item) 不需要先 new
|
|
|
public List<HwProductInfoDetail> HwProductInfoDetailList { get; set; } = new();
|
|
|
}
|