using System.Xml.Serialization;

namespace Dpz.Core.Web.Library.Activator;

#region Sitemap XML Models

[XmlRoot("urlset", Namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")]
public class SitemapUrlSet
{
    [XmlElement("url")]
    public List<SitemapUrl> Urls { get; set; } = [];
}

[Serializable]
[XmlRoot("url")]
public class SitemapUrl
{
    [XmlElement("loc")]
    public string? Location { get; set; }

    [XmlElement("lastmod")]
    public string LastModified { get; set; } = DateTime.Now.ToString("yyyy-MM-dd");

    [XmlElement("changefreq")]
    public string ChangeFrequency { get; set; } = "weekly";

    [XmlElement("priority")]
    public float Priority { get; set; }
}

[XmlRoot("sitemapindex", Namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")]
public class SitemapIndex
{
    [XmlElement("sitemap")]
    public List<SitemapEntry> Sitemaps { get; set; } = [];
}

[Serializable]
[XmlRoot("sitemap")]
public class SitemapEntry
{
    [XmlElement("loc")]
    public string? Location { get; set; }

    [XmlElement("lastmod")]
    public string LastModified { get; set; } = DateTime.Now.ToString("yyyy-MM-dd");
}

#endregion

#region SignalR Push Message

/// <summary>
/// 消息类型
/// </summary>
public enum MessageLevel
{
    /// <summary>
    /// 信息/成功
    /// </summary>
    Info = 0,

    /// <summary>
    /// 警告/进行中
    /// </summary>
    Warning = 1,

    /// <summary>
    /// 错误
    /// </summary>
    Error = 2
}

/// <summary>
/// 站点地图生成进度推送消息
/// </summary>
/// <param name="Message">推送消息内容</param>
/// <param name="Timestamp">推送时间</param>
/// <param name="Level">消息级别</param>
public record SitemapProgressMessage(string Message, DateTime Timestamp, MessageLevel Level)
{
    /// <summary>
    /// 创建信息消息
    /// </summary>
    public static SitemapProgressMessage Info(string message) =>
        new(message, DateTime.Now, MessageLevel.Info);

    /// <summary>
    /// 创建警告消息
    /// </summary>
    public static SitemapProgressMessage Warning(string message) =>
        new(message, DateTime.Now, MessageLevel.Warning);

    /// <summary>
    /// 创建错误消息
    /// </summary>
    public static SitemapProgressMessage Error(string message) =>
        new(message, DateTime.Now, MessageLevel.Error);
}

#endregion

#region Sitemap Configuration

/// <summary>
/// 站点地图配置
/// </summary>
public class SitemapConfiguration
{
    /// <summary>
    /// 网站基础 URL
    /// </summary>
    public string BaseUrl { get; set; } = "https://core.dpangzi.com";

    /// <summary>
    /// 单个 sitemap 最大 URL 数量 (协议限制 50000)
    /// </summary>
    public int MaxUrlsPerSitemap { get; set; } = 10000;

    /// <summary>
    /// 每批查询的数据量
    /// </summary>
    public int BatchSize { get; set; } = 500;
}

#endregion
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这个代码文件定义了用于生成和管理网站站点地图(Sitemap)的相关类和配置。让我详细解释每个部分:

1. Sitemap XML 模型 (第一个region)

这部分定义了符合 Sitemap 协议标准的 XML 数据模型:

SitemapUrlSet

  • 表示标准的 sitemap.xml 文件结构
  • 使用 XmlRoot 特性指定根元素为 "urlset",命名空间符合官方协议
  • 包含一个 URL 列表,每个 URL 都是 SitemapUrl 对象

SitemapUrl

  • 表示 sitemap 中的单个 URL 条目
  • 包含四个标准字段:
    • Location: URL 地址
    • LastModified: 最后修改时间(默认当前日期)
    • ChangeFrequency: 更新频率(默认每周)
    • Priority: 优先级权重

SitemapIndexSitemapEntry

  • 用于大型网站的 sitemap 索引文件
  • 当 URL 数量超过单个文件限制时,使用索引文件管理多个 sitemap 文件

2. SignalR 推送消息 (第二个region)

这部分定义了实时消息推送功能:

MessageLevel 枚举

  • 定义三种消息级别:信息、警告、错误
  • 用于在生成 sitemap 过程中向客户端推送不同类型的状态消息

SitemapProgressMessage 记录类型

  • 使用 C# 9+ 的 record 语法定义不可变消息对象
  • 包含消息内容、时间戳和级别
  • 提供三个静态工厂方法快速创建不同级别的消息

3. Sitemap 配置 (第三个region)

SitemapConfiguration

  • 定义 sitemap 生成的配置参数:
    • BaseUrl: 网站基础 URL
    • MaxUrlsPerSitemap: 单个 sitemap 文件最大 URL 数量(遵循协议限制)
    • BatchSize: 数据库批量查询大小,用于优化性能

整体设计特点

  1. 标准兼容: 严格遵循 Sitemaps 协议规范
  2. 可扩展性: 支持大型网站的多文件 sitemap 结构
  3. 实时反馈: 通过 SignalR 提供生成过程的实时状态更新
  4. 性能优化: 通过批处理和配置化参数优化大数据量处理
  5. 现代语法: 使用了 C# 的现代特性如 record、集合初始化器等

这个设计非常适合企业级 Web 应用的 SEO 优化需求。

评论加载中...