feat: 新增公告功能

This commit is contained in:
chenchun
2025-11-06 16:59:29 +08:00
parent 771ecd9d81
commit 690cabfd96
7 changed files with 197 additions and 3 deletions

View File

@@ -0,0 +1,81 @@
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
};
}
}