网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using System.Collections.Specialized;
using System.Net.Http;
using System.Net.Http.Json;
using Dpz.Core.Public.ViewModel.V4;
using Dpz.Core.Service.V4.Services;
using Dpz.Core.Web.Models;
using ZiggyCreatures.Caching.Fusion;

namespace Dpz.Core.Web.Library.Api.Service;

public class HomeCacheService(
    IArticleService articleService,
    IPictureRecordService pictureRecordService,
    IHttpContextAccessor httpContextAccessor,
    IHttpClientFactory httpClientFactory,
    IFusionCache fusionCache,
    ILogger<HomeCacheService> logger
) : IHomeCacheService
{
    /// <summary>
    /// 过期时间
    /// </summary>
    private readonly TimeSpan _expired = TimeSpan.FromDays(1);

    private async Task<IList<VmPictureRecord>> GetBannersAsync()
    {
        var banner = await pictureRecordService.GetBannerAsync();
        return banner.ToList();
    }

    public async Task<HomeContainerModel> GetCacheDataAsync()
    {
        return await fusionCache.GetOrSetAsync<HomeContainerModel>(
            CacheKey.HomeContainerKey,
            async (_, _) =>
            {
                var model = new HomeContainerModel
                {
                    Blogs = await GetTopArticlesAsync(),
                    LikeArticle = await GetRandomArticlesAsync(),
                    News = await GetLatestArticlesAsync(),
                    Pictures = await GetBannersAsync(),
                    Tags = await GetArticleTagsAsync(),
                };
                return model;
            },
            options => options.SetDuration(_expired)
        );
    }

    public async Task<IList<string>> GetArticleTagsAsync()
    {
        return await articleService.GetAllTagsAsync();
    }

    public async Task<IList<VmArticleMini>> GetLatestArticlesAsync()
    {
        return await articleService.GetLatestAsync();
    }

    public async Task<IList<VmArticleMini>> GetRandomArticlesAsync()
    {
        return await articleService.GetRandomArticlesAsync();
    }

    public async Task<TodayNewsModel?> GetTodayNewsAsync()
    {
        var ipAddress = httpContextAccessor.HttpContext?.Request.GetIpAddress() ?? "";
        var todayNewsKey = $"home-news-{ipAddress}";
        return await fusionCache.GetOrSetAsync<TodayNewsModel?>(
            todayNewsKey,
            async (_, cancellationToke) =>
            {
                var httpClient = httpClientFactory.CreateClient("edge");

                try
                {
                    var parameters = new NameValueCollection { { "ip", ipAddress } };
                    var request = new HttpRequestMessage(
                        HttpMethod.Get,
                        "https://news.topurl.cn/api?" + parameters.ToQueryString()
                    );
                    var response = await httpClient.SendAsync(request, cancellationToke);
                    if (!response.IsSuccessStatusCode)
                    {
                        logger.LogWarning(
                            "get today news fail,status code:{Code}",
                            response.StatusCode
                        );
                        return null;
                    }
                    var data = await response.Content.ReadFromJsonAsync<NewsResponse>(
                        cancellationToken: cancellationToke
                    );
                    return data?.Data;
                }
                catch (Exception ex)
                {
                    logger.LogError(ex, "get today news fail");
                    return null;
                }
            },
            options => options.SetDuration(TimeSpan.FromHours(5))
        );
    }

    private async Task<List<VmArticleMini>> GetTopArticlesAsync()
    {
        var articleMinis = await articleService.GetTopArticlesAsync(-3);
        return articleMinis;
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个名为 HomeCacheService 的类,它实现了 IHomeCacheService 接口。这个类的主要功能是管理和缓存与首页相关的数据,包括文章、图片、标签等。以下是代码的主要功能和结构的详细解释:

1. 构造函数

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

  • IArticleService:用于获取文章相关数据的服务。
  • IHybridCachingProvider:用于缓存数据的服务。
  • IPictureRecordService:用于获取图片记录的服务。
  • IHttpContextAccessor:用于访问当前 HTTP 上下文。
  • IHttpClientFactory:用于创建 HTTP 客户端。
  • ILogger<HomeCacheService>:用于记录日志。

2. 缓存过期时间

_expired 变量定义了缓存的过期时间,这里设置为 3 小时。

3. 常量

HomeKey 是用于缓存首页数据的键。

4. 获取横幅图片

GetBannersAsync 方法用于获取横幅图片:

  • 首先尝试从缓存中获取横幅数据。
  • 如果缓存中没有数据,则调用 pictureRecordService.GetBannerAsync() 获取横幅数据,并将其存入缓存。

5. 获取首页数据

GetCacheDataAsync 方法用于获取首页的所有数据:

  • 尝试从缓存中获取 HomeContainerModel 对象。
  • 如果缓存中没有数据,则调用多个方法获取博客、随机文章、最新文章、横幅图片和标签,并将这些数据组合成 HomeContainerModel 对象,然后存入缓存。

6. 更新横幅

UpdateBannerAsync 方法用于更新横幅数据:

  • pictureRecordService 获取最新的横幅数据,并在每个横幅的 AccessUrl 后添加 !banner 字符串。
  • 将更新后的横幅数据存入缓存。

7. 获取文章标签

GetArticleTagsAsync 方法用于获取文章标签:

  • 尝试从缓存中获取标签列表。
  • 如果缓存中没有数据,则调用 articleService.GetAllTagsAsync() 获取标签,并将其存入缓存。

8. 获取最新文章

GetLatestArticlesAsync 方法用于获取最新的文章:

  • 尝试从缓存中获取最新文章列表。
  • 如果缓存中没有数据,则调用 articleService.GetLatestAsync() 获取最新文章,并将其存入缓存。

9. 更新最新文章

UpdateLatestArticlesAsync 方法用于更新最新文章的缓存。

10. 获取随机文章

GetRandomArticlesAsync 方法用于获取随机文章:

  • 尝试从缓存中获取随机文章列表。
  • 如果缓存中没有数据,则调用 articleService.GetRandomArticlesAsync() 获取随机文章,并将其存入缓存。

11. 获取今日新闻

GetTodayNewsAsync 方法用于获取今日新闻:

  • 根据用户的 IP 地址生成缓存键。
  • 尝试从缓存中获取今日新闻数据。
  • 如果缓存中没有数据,则通过 HTTP 请求获取今日新闻,并将其存入缓存。

12. 获取热门文章

GetTopArticlesAsync 方法用于获取热门文章:

  • 尝试从缓存中获取热门文章列表。
  • 如果缓存中没有数据,则调用 articleService.GetTopArticlesAsync() 获取热门文章,并将其存入缓存。

13. 更新热门文章

UpdateViewTopAsync 方法用于更新热门文章的缓存。

总结

HomeCacheService 类的主要功能是通过缓存机制提高首页数据的访问效率,减少对数据库和外部服务的频繁调用。它通过多个方法获取和更新不同类型的数据,并使用缓存来存储这些数据,以便在后续请求中快速访问。

loading