// 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"); } }