feat: 新增图片广场、发布及模型查询接口

- 图片任务列表区分为“我的任务”和“图片广场(已发布)”
- 新增图片发布到广场接口,支持分类
- 新增图片模型列表查询接口
- 注释掉图片 Base64 前缀字段,统一使用 URL
- 调整相关依赖注入,支持模型仓储查询
This commit is contained in:
ccnetcore
2026-01-03 00:00:17 +08:00
parent ba95d1798f
commit 343347ea11
2 changed files with 95 additions and 7 deletions

View File

@@ -30,7 +30,7 @@ public class ImageTaskOutput
/// <summary>
/// 生成图片PrefixBase64包含前缀
/// </summary>
public string? StorePrefixBase64 { get; set; }
// public string? StorePrefixBase64 { get; set; }
/// <summary>
/// 生成图片URL

View File

@@ -8,9 +8,11 @@ using Volo.Abp.Application.Services;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.Guids;
using Volo.Abp.Users;
using Yi.Framework.AiHub.Application.Contracts.Dtos;
using Yi.Framework.AiHub.Application.Contracts.Dtos.Chat;
using Yi.Framework.AiHub.Application.Jobs;
using Yi.Framework.AiHub.Domain.Entities.Chat;
using Yi.Framework.AiHub.Domain.Entities.Model;
using Yi.Framework.AiHub.Domain.Extensions;
using Yi.Framework.AiHub.Domain.Managers;
using Yi.Framework.AiHub.Domain.Shared.Consts;
@@ -33,6 +35,7 @@ public class AiImageService : ApplicationService
private readonly IGuidGenerator _guidGenerator;
private readonly IWebHostEnvironment _webHostEnvironment;
private readonly TokenManager _tokenManager;
private readonly ISqlSugarRepository<AiModelEntity> _aiModelRepository;
public AiImageService(
ISqlSugarRepository<ImageStoreTaskAggregateRoot> imageTaskRepository,
IBackgroundJobManager backgroundJobManager,
@@ -40,7 +43,7 @@ public class AiImageService : ApplicationService
PremiumPackageManager premiumPackageManager,
ModelManager modelManager,
IGuidGenerator guidGenerator,
IWebHostEnvironment webHostEnvironment, TokenManager tokenManager)
IWebHostEnvironment webHostEnvironment, TokenManager tokenManager, ISqlSugarRepository<AiModelEntity> aiModelRepository)
{
_imageTaskRepository = imageTaskRepository;
_backgroundJobManager = backgroundJobManager;
@@ -50,6 +53,7 @@ public class AiImageService : ApplicationService
_guidGenerator = guidGenerator;
_webHostEnvironment = webHostEnvironment;
_tokenManager = tokenManager;
_aiModelRepository = aiModelRepository;
}
/// <summary>
@@ -224,12 +228,10 @@ public class AiImageService : ApplicationService
}
/// <summary>
/// 分页查询任务列表
/// 分页查询我的任务列表
/// </summary>
/// <param name="input">分页查询参数</param>
/// <returns>任务列表</returns>
[HttpGet("ai-image/tasks")]
public async Task<PagedResult<ImageTaskOutput>> GetTaskPageAsync([FromQuery] ImageTaskPageInput input)
[HttpGet("ai-image/my-tasks")]
public async Task<PagedResult<ImageTaskOutput>> GetMyTaskPageAsync([FromQuery] ImageTaskPageInput input)
{
var userId = CurrentUser.GetId();
@@ -257,6 +259,92 @@ public class AiImageService : ApplicationService
return new PagedResult<ImageTaskOutput>(total, items);
}
/// <summary>
/// 分页查询图片广场(已发布的图片)
/// </summary>
[HttpGet("ai-image/plaza")]
[AllowAnonymous]
public async Task<PagedResult<ImageTaskOutput>> GetPlazaPageAsync([FromQuery] ImageTaskPageInput input)
{
var query = _imageTaskRepository._DbQueryable
.Where(x => x.PublishStatus == PublishStatusEnum.Published)
.Where(x => x.TaskStatus == TaskStatusEnum.Success)
.OrderByDescending(x => x.CreationTime);
var total = await query.CountAsync();
var items = await query
.Skip((input.PageIndex - 1) * input.PageSize)
.Take(input.PageSize)
.Select(x => new ImageTaskOutput
{
Id = x.Id,
Prompt = x.Prompt,
// ReferenceImagesPrefixBase64 = x.ReferenceImagesPrefixBase64,
// ReferenceImagesUrl = x.ReferenceImagesUrl,
StoreUrl = x.StoreUrl,
TaskStatus = x.TaskStatus,
PublishStatus = x.PublishStatus,
Categories = x.Categories,
CreationTime = x.CreationTime
})
.ToListAsync();
return new PagedResult<ImageTaskOutput>(total, items);
}
/// <summary>
/// 发布图片到广场
/// </summary>
[HttpPost("ai-image/publish")]
public async Task PublishAsync([FromBody] PublishImageInput input)
{
var userId = CurrentUser.GetId();
var task = await _imageTaskRepository.GetFirstAsync(x => x.Id == input.TaskId && x.UserId == userId);
if (task == null)
{
throw new UserFriendlyException("任务不存在或无权访问");
}
if (task.TaskStatus != TaskStatusEnum.Success)
{
throw new UserFriendlyException("只有已完成的任务才能发布");
}
if (task.PublishStatus == PublishStatusEnum.Published)
{
throw new UserFriendlyException("该任务已发布");
}
task.PublishStatus = PublishStatusEnum.Published;
task.Categories = input.Categories ?? new List<string>();
await _imageTaskRepository.UpdateAsync(task);
}
/// <summary>
/// 获取图片模型列表
/// </summary>
/// <returns></returns>
[HttpPost("ai-image/model")]
public async Task<List<ModelGetListOutput>> GetModelAsync()
{
var output = await _aiModelRepository._DbQueryable
.Where(x => x.ModelType == ModelTypeEnum.Image)
.Where(x => x.ModelApiType == ModelApiTypeEnum.OpenAi)
.OrderByDescending(x => x.OrderNum)
.Select(x => new ModelGetListOutput
{
Id = x.Id,
ModelId = x.ModelId,
ModelName = x.Name,
ModelDescribe = x.Description,
Remark = x.Description,
IsPremiumPackage = PremiumPackageConst.ModeIds.Contains(x.ModelId)
}).ToListAsync();
return output;
}
}
/// <summary>