// ============================================================================ // 【文件说明】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; /// /// 产品信息实体类。 /// /// 【业务说明】 /// 产品信息用于官网展示,支持: /// 1. 层级结构:parent_id 关联父产品,形成树形结构 /// 2. 多种配置模式:config_modal 区分不同的展示方式 /// 3. 排序:product_info_order 控制展示顺序 /// /// [SugarTable("hw_product_info")] public class HwProductInfo : HwPortalBaseEntity { /// /// 产品主键ID。 /// [SugarColumn(ColumnName = "product_info_id", IsPrimaryKey = true, IsIdentity = true)] public long? ProductInfoId { get; set; } /// /// 配置类型ID。 /// /// 【业务说明】 /// 关联 hw_portal_config_type 表,用于分类产品。 /// 例如:硬件产品、软件产品、服务等。 /// /// [SugarColumn(ColumnName = "config_type_id")] public string ConfigTypeId { get; set; } /// /// 标签标记。 /// /// 【业务说明】 /// 用于标记产品的特殊属性,如"热门"、"新品"、"推荐"等。 /// /// [SugarColumn(ColumnName = "tab_flag")] public string TabFlag { get; set; } /// /// 配置模式。 /// /// 【业务说明】 /// 不同的配置模式决定产品的展示方式: /// - "1": 模式1(列表展示) /// - "2": 模式2(卡片展示) /// - "13": 树形展示(支持层级结构) /// /// 这个字段让前端可以根据模式选择不同的渲染组件。 /// /// [SugarColumn(ColumnName = "config_modal")] public string ConfigModal { get; set; } /// /// 产品英文标题。 /// [SugarColumn(ColumnName = "product_info_etitle")] public string ProductInfoEtitle { get; set; } /// /// 产品中文标题。 /// [SugarColumn(ColumnName = "product_info_ctitle")] public string ProductInfoCtitle { get; set; } /// /// 排序号。 /// /// 【业务说明】 /// 数值越小越靠前,用于控制产品在列表中的展示顺序。 /// /// [SugarColumn(ColumnName = "product_info_order")] public long? ProductInfoOrder { get; set; } /// /// 父产品ID。 /// /// 【树形结构说明】 /// - parent_id 为 null 或 0:顶级产品 /// - parent_id 有值:子产品,关联父产品 /// /// 这样可以形成层级结构: /// 产品A (parent_id = null) /// ├── 产品A-1 (parent_id = A的ID) /// └── 产品A-2 (parent_id = A的ID) /// /// 对比 Java 若依: /// 若依的菜单、部门等也是类似的树形结构设计。 /// /// [SugarColumn(ColumnName = "parent_id")] public long? ParentId { get; set; } /// /// 配置类型名称(冗余字段)。 /// /// 【冗余字段说明】 /// 这个字段存储 config_type_name,虽然可以通过 config_type_id 关联查询得到, /// 但直接存储可以减少 JOIN 查询,提高查询性能。 /// /// 这是"空间换时间"的设计权衡: /// - 优点:查询快,不需要 JOIN /// - 缺点:需要维护数据一致性 /// /// 对比 Java: /// Java 项目中也常见这种冗余字段设计,特别是在高并发场景。 /// /// [SugarColumn(ColumnName = "config_type_name")] public string ConfigTypeName { get; set; } /// /// 产品明细列表(导航属性)。 /// /// 【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 这里需要手动填充,更灵活但需要更多代码。 /// /// [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 HwProductInfoDetailList { get; set; } = new(); }