网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using System.Xml.Serialization;
using Dpz.Core.Service.ObjectStorage.Services;
using Dpz.Core.Service.V4.Services;
using Dpz.Core.Web.Library.Hub;
using Hangfire;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.SignalR;
using IMumbleService = Dpz.Core.Service.V4.Services.IMumbleService;

/*
 * 生成站点地图
 * siteMapPushMessage 参数说明
 *     0:推送消息
 *     1:推送时间
 *     2:推送消息样式
 *
 */

namespace Dpz.Core.Web.Library.Activator;

public class SiteMapTaskActivator(
    LinkGenerator linkGenerator,
    IHubContext<Notification> hubContext,
    ILogger<SiteMapTaskActivator> logger,
    IArticleService service,
    IMumbleService mumbleService,
    IObjectStorageOperation objectStorageService,
    IConfiguration configuration
) : JobActivator
{
    /// <summary>
    /// 链接生成器
    /// </summary>
    private readonly LinkGenerator _linkGenerator = linkGenerator;

    /// <summary>
    /// SignalR hub
    /// </summary>
    private readonly IHubContext<Notification> _hubContext = hubContext;

    /// <summary>
    /// 日志记录
    /// </summary>
    private readonly ILogger<SiteMapTaskActivator> _logger = logger;

    /// <summary>
    /// 互斥信号
    /// </summary>
    private static readonly SemaphoreSlim SemaphoreSlim = new(1, 1);

    /// <summary>
    /// sitemap data
    /// </summary>
    private readonly DataSource _sitemap = new() { Source = [] };

    [ProlongExpirationTime]
    public async Task StartAsync()
    {
        if (!string.Equals(configuration["AgileConfig:env"], "PROD"))
        {
            _logger.LogInformation("非生产环境,跳过站点地图生成!");
            return;
        }

        await SemaphoreSlim.WaitAsync();
        try
        {
            await _hubContext.Clients.All.SendCoreAsync(
                "siteMapPushMessage",
                ["任务已开始!", DateTime.Now, "color:rgb(123, 213, 98)"]
            );

            await GenerateArticleLink();
            await GenerateTalkLink();
            // 源码
            _sitemap.Source.Add(
                new SiteData
                {
                    Url = _linkGenerator.GetPathByAction("Index", "Code", new { path = "" }),
                    Frequency = "weekly",
                    Priority = 0.5f,
                    UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
                }
            );

            // 音乐
            _sitemap.Source.Insert(
                0,
                new SiteData
                {
                    Url = _linkGenerator.GetPathByAction("Index", "Music"),
                    Frequency = "weekly",
                    Priority = 0.5f,
                    UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
                }
            );
            // 时间轴
            _sitemap.Source.Insert(
                0,
                new SiteData
                {
                    Url = _linkGenerator.GetPathByAction("Timeline", "Home"),
                    Frequency = "weekly",
                    Priority = 0.5f,
                    UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
                }
            );
            // steam
            _sitemap.Source.Insert(
                0,
                new SiteData
                {
                    Url = _linkGenerator.GetPathByAction("Index", "Steam"),
                    Frequency = "weekly",
                    Priority = 0.5f,
                    UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
                }
            );
            // 首页
            _sitemap.Source.Insert(
                0,
                new SiteData
                {
                    Url = _linkGenerator.GetPathByAction("Index", "Home"),
                    Frequency = "weekly",
                    Priority = 0.5f,
                    UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
                }
            );
            // 友链
            _sitemap.Source.Add(
                new SiteData
                {
                    Url = _linkGenerator.GetPathByAction("Friends", "Home"),
                    Frequency = "weekly",
                    Priority = 0.5f,
                    UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
                }
            );

            // 书签
            _sitemap.Source.Add(
                new SiteData
                {
                    Url = _linkGenerator.GetPathByAction("Index", "Bookmark"),
                    Frequency = "weekly",
                    Priority = 0.5f,
                    UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
                }
            );

            // markdown guide
            _sitemap.Source.Add(
                new SiteData
                {
                    Url = _linkGenerator.GetPathByAction("Markdown", "Home"),
                    Frequency = "weekly",
                    Priority = 0.5f,
                    UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
                }
            );
            
            _sitemap.Source.Add(
                new SiteData
                {
                    Url = _linkGenerator.GetPathByAction("GetAlbums", "Home"),
                    Frequency = "weekly",
                    Priority = 0.5f,
                    UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
                }
            );

            _sitemap.Source.ForEach(x => x.Url = "https://core.dpangzi.com" + x.Url);
            var serializer = new XmlSerializer(typeof(DataSource));
            using var stream = new MemoryStream();
            serializer.Serialize(stream, _sitemap);
            var bytes = stream.ToArray();

            var uploadPath =
#if DEBUG
                new[] { "Test", "sitemap" };
#else
                new[] { "sitemap" };
#endif

            await objectStorageService.UploadAsync(bytes, uploadPath, "sitemap.xml");

            _logger.LogInformation("站点地图生成成功!");
            await _hubContext.Clients.All.SendCoreAsync(
                "siteMapPushMessage",
                ["站点地图生成成功!", DateTime.Now, "color:rgb(123, 213, 98)"]
            );
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "sitemap生成失败");
            await _hubContext.Clients.All.SendCoreAsync(
                "siteMapPushMessage",
                ["sitemap生成失败", DateTime.Now, "color:red;font-weight:bold"]
            );
            throw;
        }
        finally
        {
            SemaphoreSlim.Release();
        }
    }

    /// <summary>
    /// 生成文章相关链接
    /// </summary>
    /// <returns></returns>
    private async Task GenerateArticleLink()
    {
        var articlePages = Enumerable
            .Range(1, 200)
            .Select(x => new SiteData
            {
                Url = _linkGenerator.GetPathByAction("Index", "Article", new { pageIndex = x }),
                Frequency = "weekly",
                Priority = 0.5f,
                UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
            })
            .ToList();
        _sitemap.Source.AddRange(articlePages);

        var tags = await service.GetAllTagsAsync();
        _sitemap.Source.AddRange(
            tags.Select(x => new SiteData
            {
                Url = _linkGenerator.GetPathByAction("Index", "Article", new { tag = x }),
                Frequency = "weekly",
                Priority = 0.5f,
                UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
            })
        );

        var publishArticles = await service.GetPublishArticlesAsync();
        _sitemap.Source.AddRange(
            publishArticles.Select(x => new SiteData
            {
                Url = _linkGenerator.GetPathByAction("Read", "Article", new { id = x.Id }),
                Frequency = "weekly",
                Priority = 0.5f,
                UpdateTime = x.CreateTime.ToString("yyyy-MM-dd"),
            })
        );
    }

    /// <summary>
    /// 生成talk相关链接
    /// </summary>
    /// <returns></returns>
    private async Task GenerateTalkLink()
    {
        await _hubContext.Clients.All.SendCoreAsync(
            "siteMapPushMessage",
            ["正在查询talk相关数据", DateTime.Now, "color:rgba(247,140,108,1)"]
        );
        var pager = await mumbleService.GetPagesAsync(1, 10);
        await _hubContext.Clients.All.SendCoreAsync(
            "siteMapPushMessage",
            [
                "正在生成 talk 分页相关链接",
                DateTime.Now,
                "color:rgba(247,140,108,1)"
            ]
        );
        var talkPage = Enumerable
            .Range(1, pager.TotalPageCount)
            .Select(x => new SiteData
            {
                Url = _linkGenerator.GetPathByAction("Index", "Talk", new { pageIndex = x }),
                Frequency = "weekly",
                Priority = 0.5f,
                UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
            });
        _sitemap.Source.AddRange(talkPage);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码是一个 ASP.NET Core 应用程序中的类 SiteMapTaskActivator,它的主要功能是生成网站地图(sitemap),并将其上传到对象存储服务。以下是代码的详细解释:

1. 类的构造函数

SiteMapTaskActivator 类的构造函数接受多个依赖项,包括:

  • LinkGenerator:用于生成 URL。
  • IHubContext<Notification>:用于与 SignalR 客户端进行通信,发送实时消息。
  • ILogger<SiteMapTaskActivator>:用于记录日志。
  • IArticleService:用于获取文章和标签数据。
  • IWebHostEnvironment:提供有关 web 应用程序托管环境的信息。
  • IMumbleService:用于获取与“talk”相关的数据。
  • IObjectStorageOperation:用于与对象存储服务交互。

2. 互斥信号

使用 SemaphoreSlim 来确保在同一时间只有一个任务实例在执行,以避免并发问题。

3. 站点地图数据结构

_sitemap 是一个 DataSource 对象,包含一个 Source 列表,用于存储网站地图中的所有链接。

4. StartAsync 方法

这是类的主要方法,负责生成网站地图的逻辑:

  • 首先,它会发送一个消息到所有连接的客户端,通知任务开始。
  • 然后,它调用 GenerateArticleLinkGenerateTalkLink 方法来生成文章和“talk”相关的链接。
  • 接着,它手动添加一些固定的链接(如首页、音乐、友链等)到 _sitemap.Source 列表中。
  • 所有链接的 URL 都会被前缀化为 https://core.dpangzi.com
  • 使用 XmlSerializer_sitemap 序列化为 XML 格式,并将其上传到对象存储服务。
  • 最后,发送成功或失败的消息到 SignalR 客户端。

5. 生成文章链接

GenerateArticleLink 方法:

  • 生成文章分页的链接(最多 200 页)。
  • 获取所有标签并为每个标签生成链接。
  • 获取已发布的文章并为每篇文章生成链接。

6. 生成“talk”链接

GenerateTalkLink 方法:

  • 发送消息通知正在查询“talk”相关数据。
  • 获取“talk”分页数据,并为每一页生成链接。

7. 错误处理

StartAsync 方法中,使用 try-catch 块来捕获可能发生的异常,并记录错误信息,同时向客户端发送失败消息。

总结

整体而言,这段代码的功能是定期生成网站的 sitemap,包含文章、标签、talk 等相关链接,并将其上传到对象存储服务,以便搜索引擎能够更好地索引网站内容。通过 SignalR 实时通知用户任务的进度和结果。

loading