// ============================================================================ // 【文件说明】HwWeb.cs - 官网页面实体类 // ============================================================================ // 这个实体类对应数据库表 hw_web,用于存储官网页面配置信息。 // // 【数据库表结构】 // hw_web 表字段: // - web_id: 主键ID(自增) // - web_json: JSON格式的页面配置 // - web_json_string: JSON字符串格式 // - web_code: 页面编码(业务主键) // - is_delete: 逻辑删除标记 // - web_json_english: 英文版JSON配置 // - create_by, create_time, update_by, update_time, remark: 继承自基类 // ============================================================================ namespace Admin.NET.Plugin.HwPortal; /// /// 官网页面实体类。 /// /// 【C# 语法知识点 - 类继承】 /// public class HwWeb : HwPortalBaseEntity /// HwWeb 继承自 HwPortalBaseEntity,自动获得 CreateBy、CreateTime 等公共字段。 /// /// 对比 Java: /// Java 的继承语法完全一样: /// public class HwWeb extends HwPortalBaseEntity { ... } /// /// /// 【ORM 映射说明】 /// [SugarTable("hw_web")] 告诉 SqlSugar ORM:这个类映射到数据库的 hw_web 表。 /// /// 对比 Java MyBatis/JPA: /// JPA: @Table(name = "hw_web") /// MyBatis: 在 XML 中配置 <table tableName="hw_web"> /// /// [SugarTable("hw_web")] // 【C# 语法知识点 - 特性(Attribute)】 // [SugarTable("hw_web")] 是 SqlSugar ORM 的特性,用于指定数据库表名。 // 如果不写,SqlSugar 会默认用类名(HwWeb)作为表名。 // 但数据库表名通常是 snake_case(hw_web),所以需要显式指定。 public class HwWeb : HwPortalBaseEntity { /// /// 页面主键ID。 /// /// 【C# 语法知识点 - 可空值类型 long?】 /// long? 表示"可空的长整型",等价于 Nullable<long>。 /// /// 为什么用可空类型? /// 1. 新增记录时,ID 还没生成(数据库自增),此时是 null /// 2. 查询时,某些关联查询可能返回 null /// 3. 和前端交互时,空值更明确 /// /// 对比 Java: /// Java 的 Long 本身就是引用类型,可以为 null: /// private Long webId; /// /// C# 的 long 是值类型,不能为 null,所以用 long? 来支持 null。 /// /// [SugarColumn(ColumnName = "web_id", IsPrimaryKey = true, IsIdentity = true)] // 【SugarColumn 特性参数说明】 // ColumnName = "web_id":映射到数据库列 web_id // IsPrimaryKey = true:标记为主键 // IsIdentity = true:标记为自增列(数据库自动生成值) // // 对比 Java JPA: // @Id // @GeneratedValue(strategy = GenerationType.IDENTITY) // @Column(name = "web_id") // private Long webId; public long? WebId { get; set; } /// /// JSON格式的页面配置。 /// /// 【业务说明】 /// 这个字段存储页面配置的 JSON 数据,前端解析后渲染页面。 /// 例如:导航菜单、轮播图、内容区块等配置。 /// /// [SugarColumn(ColumnName = "web_json")] public string WebJson { get; set; } /// /// JSON字符串格式。 /// [SugarColumn(ColumnName = "web_json_string")] public string WebJsonString { get; set; } /// /// 页面编码(业务主键)。 /// /// 【业务主键 vs 技术主键】 /// - 技术主键:web_id,数据库自增,无业务含义 /// - 业务主键:web_code,有业务含义,如 "home_page"、"about_us" /// /// 为什么需要两个主键? /// 1. 技术主键保证数据库性能(自增整数比字符串索引快) /// 2. 业务主键方便开发和运维(看到 web_code 就知道是哪个页面) /// 3. 业务主键可以跨环境保持一致(开发/测试/生产) /// /// [SugarColumn(ColumnName = "web_code")] public long? WebCode { get; set; } /// /// 逻辑删除标记。 /// /// 【逻辑删除 vs 物理删除】 /// - 物理删除:DELETE FROM table WHERE id = ?,数据真的没了 /// - 逻辑删除:UPDATE table SET is_delete = '1' WHERE id = ?,数据还在,只是标记为删除 /// /// 为什么用逻辑删除? /// 1. 数据可恢复:误删后可以恢复 /// 2. 审计需求:保留删除记录 /// 3. 关联数据:其他表可能引用这条数据 /// /// 这里的值: /// - "0":正常 /// - "1":已删除 /// /// 对比 Java 若依: /// 若依框架也使用逻辑删除,字段通常是 del_flag。 /// /// [SugarColumn(ColumnName = "is_delete")] public string IsDelete { get; set; } /// /// 英文版JSON配置。 /// /// 【国际化支持】 /// 这个字段存储英文版页面配置,用于多语言网站。 /// 用户切换语言时,前端读取不同的 JSON 配置。 /// /// [SugarColumn(ColumnName = "web_json_english")] public string WebJsonEnglish { get; set; } }