// Admin.NET 项目的版æƒã€å•†æ ‡ã€ä¸“利和其他相关æƒåˆ©å‡å—ç›¸åº”æ³•å¾‹æ³•è§„çš„ä¿æŠ¤ã€‚ä½¿ç”¨æœ¬é¡¹ç›®åº”éµå®ˆç›¸å…³æ³•律法规和许å¯è¯çš„è¦æ±‚。
//
// 本项目主è¦éµå¾ª MIT 许å¯è¯å’Œ Apache 许å¯è¯ï¼ˆç‰ˆæœ¬ 2.0)进行分å‘和使用。许å¯è¯ä½äºŽæºä»£ç æ ‘æ ¹ç›®å½•ä¸çš„ LICENSE-MIT å’Œ LICENSE-APACHE 文件。
//
// ä¸å¾—利用本项目从事å±å®³å›½å®¶å®‰å…¨ã€æ‰°ä¹±ç¤¾ä¼šç§©åºã€ä¾µçŠ¯ä»–äººåˆæ³•æƒç›Šç‰æ³•å¾‹æ³•è§„ç¦æ¢çš„æ´»åЍï¼ä»»ä½•基于本项目二次开å‘è€Œäº§ç”Ÿçš„ä¸€åˆ‡æ³•å¾‹çº çº·å’Œè´£ä»»ï¼Œæˆ‘ä»¬ä¸æ‰¿æ‹…任何责任ï¼
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;
public GoViewProService(SqlSugarRepository<GoViewPro> goViewProjectRep,
SqlSugarRepository<GoViewProData> goViewProjectDataRep)
{
_goViewProRep = goViewProjectRep;
_goViewProDataRep = goViewProjectDataRep;
}
/// <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");
}
/// <summary>
/// ä¸Šä¼ èƒŒæ™¯å›¾
/// </summary>
[DisplayName("ä¸Šä¼ èƒŒæ™¯å›¾")]
public async Task<GoViewProUploadOutput> UploadBackGround(IFormFile @object)
{
// æ–‡ä»¶åæ ¼å¼ç¤ºä¾‹ 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
{
BackGroundImageData = base64Image
})
.Where(u => u.Id == id)
.ExecuteCommandAsync();
}
else
{
await _goViewProDataRep.InsertAsync(new GoViewProData
{
Id = id,
BackGroundImageData = base64Image,
});
}
var output = new GoViewProUploadOutput
{
Id = id,
BucketName = null,
CreateTime = null,
CreateUserId = null,
FileName = null,
FileSize = 0,
FileSuffix = "png",
FileUrl = $"api/goview/project/getBackGroundImage/{id}",
UpdateTime = null,
UpdateUserId = null
};
return output;
}
/// <summary>
/// 获å–背景图
/// </summary>
/// <returns></returns>
[AllowAnonymous]
[NonUnify]
[ApiDescriptionSettings(Name = "GetBackGroundImage")]
[DisplayName("获å–背景图")]
public async Task<IActionResult> GetBackGroundImage(long id)
{
var projectData = await _goViewProDataRep.AsQueryable().IgnoreColumns(u => u.Content).FirstAsync(u => u.Id == id);
if (projectData?.BackGroundImageData == null)
return new NoContentResult();
var bytes = Convert.FromBase64String(projectData.BackGroundImageData);
return new FileStreamResult(new MemoryStream(bytes), "image/png");
}
}