82 lines
2.7 KiB
C#
82 lines
2.7 KiB
C#
using Microsoft.Extensions.Caching.Distributed;
|
||
using Microsoft.Extensions.Configuration;
|
||
using Volo.Abp.Application.Services;
|
||
using Volo.Abp.Caching;
|
||
using Yi.Framework.AiHub.Application.Contracts.Dtos.Announcement;
|
||
using Yi.Framework.AiHub.Application.Contracts.IServices;
|
||
using Yi.Framework.AiHub.Domain.Entities;
|
||
using Yi.Framework.SqlSugarCore.Abstractions;
|
||
|
||
namespace Yi.Framework.AiHub.Application.Services;
|
||
|
||
/// <summary>
|
||
/// 公告服务
|
||
/// </summary>
|
||
public class AnnouncementService : ApplicationService, IAnnouncementService
|
||
{
|
||
private readonly ISqlSugarRepository<AnnouncementLogAggregateRoot> _announcementRepository;
|
||
private readonly IConfiguration _configuration;
|
||
private readonly IDistributedCache<AnnouncementCacheDto> _announcementCache;
|
||
private const string AnnouncementCacheKey = "AiHub:Announcement";
|
||
|
||
public AnnouncementService(
|
||
ISqlSugarRepository<AnnouncementLogAggregateRoot> announcementRepository,
|
||
IConfiguration configuration,
|
||
IDistributedCache<AnnouncementCacheDto> announcementCache)
|
||
{
|
||
_announcementRepository = announcementRepository;
|
||
_configuration = configuration;
|
||
_announcementCache = announcementCache;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取公告信息
|
||
/// </summary>
|
||
public async Task<AnnouncementOutput> GetAsync()
|
||
{
|
||
// 使用 GetOrAddAsync 从缓存获取或添加数据,缓存1小时
|
||
var cacheData = await _announcementCache.GetOrAddAsync(
|
||
AnnouncementCacheKey,
|
||
async () => await LoadAnnouncementDataAsync(),
|
||
() => new DistributedCacheEntryOptions
|
||
{
|
||
AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)
|
||
}
|
||
);
|
||
|
||
return new AnnouncementOutput
|
||
{
|
||
Version = cacheData?.Version ?? "v1.0.0",
|
||
Logs = cacheData?.Logs ?? new List<AnnouncementLogDto>()
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// 从数据库加载公告数据
|
||
/// </summary>
|
||
private async Task<AnnouncementCacheDto> LoadAnnouncementDataAsync()
|
||
{
|
||
// 从配置文件读取版本号,如果没有配置则使用默认值
|
||
var version = _configuration["AiHubVersion"] ?? "v1.0.0";
|
||
|
||
// 查询所有公告日志,按日期降序排列
|
||
var logs = await _announcementRepository._DbQueryable
|
||
.OrderByDescending(x => x.Date)
|
||
.ToListAsync();
|
||
|
||
// 转换为 DTO
|
||
var logDtos = logs.Select(log => new AnnouncementLogDto
|
||
{
|
||
Date = log.Date.ToString("yyyy-MM-dd"),
|
||
Title = log.Title,
|
||
Content = log.Content
|
||
}).ToList();
|
||
|
||
return new AnnouncementCacheDto
|
||
{
|
||
Version = version,
|
||
Logs = logDtos
|
||
};
|
||
}
|
||
}
|