256 lines
8.5 KiB
C#
256 lines
8.5 KiB
C#
// 大名科技(天津)有限公司版权所有 电话:18020030720 QQ:515096995
|
||
//
|
||
// 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
|
||
|
||
namespace Admin.NET.Plugin.GoView.Service;
|
||
|
||
/// <summary>
|
||
/// 项目管理服务
|
||
/// </summary>
|
||
[UnifyProvider("GoView")]
|
||
[ApiDescriptionSettings(GoViewConst.GroupName, Module = "goview", Name = "project", Order = 100)]
|
||
public class GoViewProService : IDynamicApiController
|
||
{
|
||
private readonly SqlSugarRepository<GoViewPro> _goViewProRep;
|
||
private readonly SqlSugarRepository<GoViewProData> _goViewProDataRep;
|
||
private readonly SqlSugarRepository<SysFile> _sysFileRep;
|
||
private readonly SysFileService _fileService;
|
||
|
||
public GoViewProService(SqlSugarRepository<GoViewPro> goViewProjectRep,
|
||
SqlSugarRepository<GoViewProData> goViewProjectDataRep,
|
||
SqlSugarRepository<SysFile> fileRep,
|
||
SysFileService fileService)
|
||
{
|
||
_goViewProRep = goViewProjectRep;
|
||
_goViewProDataRep = goViewProjectDataRep;
|
||
_sysFileRep = fileRep;
|
||
_fileService = fileService;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取项目列表
|
||
/// </summary>
|
||
/// <param name="page"></param>
|
||
/// <param name="limit"></param>
|
||
/// <returns></returns>
|
||
[DisplayName("获取项目列表")]
|
||
public async Task<List<GoViewProItemOutput>> GetList([FromQuery] int page = 1, [FromQuery] int limit = 12)
|
||
{
|
||
var res = await _goViewProRep.AsQueryable()
|
||
.Select(u => new GoViewProItemOutput(), true)
|
||
.ToPagedListAsync(page, limit);
|
||
return res.Items.ToList();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 新增项目
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
[ApiDescriptionSettings(Name = "Create")]
|
||
[DisplayName("新增项目")]
|
||
public async Task<GoViewProCreateOutput> Create(GoViewProCreateInput input)
|
||
{
|
||
var project = await _goViewProRep.AsInsertable(input.Adapt<GoViewPro>()).ExecuteReturnEntityAsync();
|
||
return new GoViewProCreateOutput
|
||
{
|
||
Id = project.Id
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// 修改项目
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
[DisplayName("修改项目")]
|
||
public async Task Edit(GoViewProEditInput input)
|
||
{
|
||
await _goViewProRep.AsUpdateable(input.Adapt<GoViewPro>()).IgnoreColumns(true).ExecuteCommandAsync();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 删除项目
|
||
/// </summary>
|
||
[ApiDescriptionSettings(Name = "Delete")]
|
||
[DisplayName("删除项目")]
|
||
[UnitOfWork]
|
||
public async Task Delete([FromQuery] string ids)
|
||
{
|
||
var idList = ids.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(u => Convert.ToInt64(u)).ToList();
|
||
await _goViewProRep.AsDeleteable().Where(u => idList.Contains(u.Id)).ExecuteCommandAsync();
|
||
await _goViewProDataRep.AsDeleteable().Where(u => idList.Contains(u.Id)).ExecuteCommandAsync();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 修改发布状态
|
||
/// </summary>
|
||
[HttpPut]
|
||
[DisplayName("修改发布状态")]
|
||
public async Task Publish(GoViewProPublishInput input)
|
||
{
|
||
await _goViewProRep.AsUpdateable()
|
||
.SetColumns(u => new GoViewPro
|
||
{
|
||
State = input.State
|
||
})
|
||
.Where(u => u.Id == input.Id)
|
||
.ExecuteCommandAsync();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取项目数据
|
||
/// </summary>
|
||
/// <param name="projectId"></param>
|
||
/// <returns></returns>
|
||
[AllowAnonymous]
|
||
[ApiDescriptionSettings(Name = "GetData")]
|
||
[DisplayName("获取项目数据")]
|
||
public async Task<GoViewProDetailOutput> GetData([FromQuery] long projectId)
|
||
{
|
||
var projectData = await _goViewProDataRep.GetFirstAsync(u => u.Id == projectId);
|
||
if (projectData == null) return null;
|
||
|
||
var project = await _goViewProRep.GetFirstAsync(u => u.Id == projectId);
|
||
var projectDetail = project.Adapt<GoViewProDetailOutput>();
|
||
projectDetail.Content = projectData.Content;
|
||
|
||
return projectDetail;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 保存项目数据
|
||
/// </summary>
|
||
[ApiDescriptionSettings(Name = "save/data")]
|
||
[DisplayName("保存项目数据")]
|
||
public async Task SaveData([FromForm] GoViewProSaveDataInput input)
|
||
{
|
||
if (await _goViewProDataRep.IsAnyAsync(u => u.Id == input.ProjectId))
|
||
{
|
||
await _goViewProDataRep.AsUpdateable()
|
||
.SetColumns(u => new GoViewProData
|
||
{
|
||
Content = input.Content
|
||
})
|
||
.Where(u => u.Id == input.ProjectId)
|
||
.ExecuteCommandAsync();
|
||
}
|
||
else
|
||
{
|
||
await _goViewProDataRep.InsertAsync(new GoViewProData
|
||
{
|
||
Id = input.ProjectId,
|
||
Content = input.Content,
|
||
});
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 上传预览图
|
||
/// </summary>
|
||
[DisplayName("上传预览图")]
|
||
public async Task<GoViewProUploadOutput> Upload(IFormFile @object)
|
||
{
|
||
/*
|
||
* 前端逻辑(useSync.hook.ts 的 dataSyncUpdate 方法):
|
||
* 如果 FileUrl 不为空,使用 FileUrl
|
||
* 否则使用 GetOssInfo 接口获取到的 BucketUrl 和 FileName 进行拼接
|
||
*/
|
||
|
||
//文件名格式示例 13414795568325_index_preview.png
|
||
var fileNameSplit = @object.FileName.Split('_');
|
||
var idStr = fileNameSplit[0];
|
||
if (!long.TryParse(idStr, out var id)) return new GoViewProUploadOutput();
|
||
|
||
//将预览图转换成 Base64
|
||
var ms = new MemoryStream();
|
||
await @object.CopyToAsync(ms);
|
||
var base64Image = Convert.ToBase64String(ms.ToArray());
|
||
|
||
//保存
|
||
if (await _goViewProDataRep.IsAnyAsync(u => u.Id == id))
|
||
{
|
||
await _goViewProDataRep.AsUpdateable()
|
||
.SetColumns(u => new GoViewProData
|
||
{
|
||
IndexImageData = base64Image
|
||
})
|
||
.Where(u => u.Id == id)
|
||
.ExecuteCommandAsync();
|
||
}
|
||
else
|
||
{
|
||
await _goViewProDataRep.InsertAsync(new GoViewProData
|
||
{
|
||
Id = id,
|
||
IndexImageData = base64Image,
|
||
});
|
||
}
|
||
|
||
var output = new GoViewProUploadOutput
|
||
{
|
||
Id = id,
|
||
BucketName = null,
|
||
CreateTime = null,
|
||
CreateUserId = null,
|
||
FileName = null,
|
||
FileSize = 0,
|
||
FileSuffix = "png",
|
||
FileUrl = $"api/goview/project/getIndexImage/{id}",
|
||
UpdateTime = null,
|
||
UpdateUserId = null
|
||
};
|
||
|
||
#region 使用 SysFileService 方式(已注释)
|
||
|
||
////删除已存在的预览图
|
||
//var uploadFileName = Path.GetFileNameWithoutExtension(@object.FileName);
|
||
//var existFiles = await _fileRep.GetListAsync(u => u.FileName == uploadFileName);
|
||
//foreach (var f in existFiles)
|
||
// await _fileService.DeleteFile(new DeleteFileInput { Id = f.Id });
|
||
|
||
////保存预览图
|
||
//var result = await _fileService.UploadFile(@object, "");
|
||
//var file = await _fileRep.GetFirstAsync(u => u.Id == result.Id);
|
||
//int.TryParse(file.SizeKb, out var size);
|
||
|
||
////本地存储,使用拼接的地址
|
||
//var fileUrl = file.BucketName == "Local" ? $"{file.FilePath}/{file.Id}{file.Suffix}" : file.Url;
|
||
|
||
//var output = new ProjectUploadOutput
|
||
//{
|
||
// Id = file.Id,
|
||
// BucketName = file.BucketName,
|
||
// CreateTime = file.CreateTime,
|
||
// CreateUserId = file.CreateUserId,
|
||
// FileName = $"{file.FileName}{file.Suffix}",
|
||
// FileSize = size,
|
||
// FileSuffix = file.Suffix?[1..],
|
||
// FileUrl = fileUrl,
|
||
// UpdateTime = null,
|
||
// UpdateUserId = null
|
||
//};
|
||
|
||
#endregion 使用 SysFileService 方式(已注释)
|
||
|
||
return output;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取预览图
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[AllowAnonymous]
|
||
[NonUnify]
|
||
[ApiDescriptionSettings(Name = "GetIndexImage")]
|
||
[DisplayName("获取预览图")]
|
||
public async Task<IActionResult> GetIndexImage(long id)
|
||
{
|
||
var projectData = await _goViewProDataRep.AsQueryable().IgnoreColumns(u => u.Content).FirstAsync(u => u.Id == id);
|
||
if (projectData?.IndexImageData == null)
|
||
return new NoContentResult();
|
||
|
||
var bytes = Convert.FromBase64String(projectData.IndexImageData);
|
||
return new FileStreamResult(new MemoryStream(bytes), "image/png");
|
||
}
|
||
} |