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