GoViewProService.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. // 大名科技(天津)有限公司 版权所有
  2. //
  3. // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
  4. //
  5. // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动
  6. //
  7. // 任何基于本项目二次开发而产生的一切法律纠纷和责任,均与作者无关
  8. namespace Admin.NET.Plugin.GoView.Service;
  9. /// <summary>
  10. /// 项目管理服务
  11. /// </summary>
  12. [UnifyProvider("GoView")]
  13. [ApiDescriptionSettings(GoViewConst.GroupName, Module = "goview", Name = "project", Order = 100)]
  14. public class GoViewProService : IDynamicApiController
  15. {
  16. private readonly SqlSugarRepository<GoViewPro> _goViewProRep;
  17. private readonly SqlSugarRepository<GoViewProData> _goViewProDataRep;
  18. public GoViewProService(SqlSugarRepository<GoViewPro> goViewProjectRep,
  19. SqlSugarRepository<GoViewProData> goViewProjectDataRep)
  20. {
  21. _goViewProRep = goViewProjectRep;
  22. _goViewProDataRep = goViewProjectDataRep;
  23. }
  24. /// <summary>
  25. /// 获取项目列表
  26. /// </summary>
  27. /// <param name="page"></param>
  28. /// <param name="limit"></param>
  29. /// <returns></returns>
  30. [DisplayName("获取项目列表")]
  31. public async Task<List<GoViewProItemOutput>> GetList([FromQuery] int page = 1, [FromQuery] int limit = 12)
  32. {
  33. var res = await _goViewProRep.AsQueryable()
  34. .Select(u => new GoViewProItemOutput(), true)
  35. .ToPagedListAsync(page, limit);
  36. return res.Items.ToList();
  37. }
  38. /// <summary>
  39. /// 新增项目
  40. /// </summary>
  41. /// <param name="input"></param>
  42. /// <returns></returns>
  43. [ApiDescriptionSettings(Name = "Create")]
  44. [DisplayName("新增项目")]
  45. public async Task<GoViewProCreateOutput> Create(GoViewProCreateInput input)
  46. {
  47. var project = await _goViewProRep.AsInsertable(input.Adapt<GoViewPro>()).ExecuteReturnEntityAsync();
  48. return new GoViewProCreateOutput
  49. {
  50. Id = project.Id
  51. };
  52. }
  53. /// <summary>
  54. /// 修改项目
  55. /// </summary>
  56. /// <param name="input"></param>
  57. /// <returns></returns>
  58. [DisplayName("修改项目")]
  59. public async Task Edit(GoViewProEditInput input)
  60. {
  61. await _goViewProRep.AsUpdateable(input.Adapt<GoViewPro>()).IgnoreColumns(true).ExecuteCommandAsync();
  62. }
  63. /// <summary>
  64. /// 删除项目
  65. /// </summary>
  66. [ApiDescriptionSettings(Name = "Delete")]
  67. [DisplayName("删除项目")]
  68. [UnitOfWork]
  69. public async Task Delete([FromQuery] string ids)
  70. {
  71. var idList = ids.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(u => Convert.ToInt64(u)).ToList();
  72. await _goViewProRep.AsDeleteable().Where(u => idList.Contains(u.Id)).ExecuteCommandAsync();
  73. await _goViewProDataRep.AsDeleteable().Where(u => idList.Contains(u.Id)).ExecuteCommandAsync();
  74. }
  75. /// <summary>
  76. /// 修改发布状态
  77. /// </summary>
  78. [HttpPut]
  79. [DisplayName("修改发布状态")]
  80. public async Task Publish(GoViewProPublishInput input)
  81. {
  82. await _goViewProRep.AsUpdateable()
  83. .SetColumns(u => new GoViewPro
  84. {
  85. State = input.State
  86. })
  87. .Where(u => u.Id == input.Id)
  88. .ExecuteCommandAsync();
  89. }
  90. /// <summary>
  91. /// 获取项目数据
  92. /// </summary>
  93. /// <param name="projectId"></param>
  94. /// <returns></returns>
  95. [AllowAnonymous]
  96. [ApiDescriptionSettings(Name = "GetData")]
  97. [DisplayName("获取项目数据")]
  98. public async Task<GoViewProDetailOutput> GetData([FromQuery] long projectId)
  99. {
  100. var projectData = await _goViewProDataRep.GetFirstAsync(u => u.Id == projectId);
  101. if (projectData == null) return null;
  102. var project = await _goViewProRep.GetFirstAsync(u => u.Id == projectId);
  103. var projectDetail = project.Adapt<GoViewProDetailOutput>();
  104. projectDetail.Content = projectData.Content;
  105. return projectDetail;
  106. }
  107. /// <summary>
  108. /// 保存项目数据
  109. /// </summary>
  110. [ApiDescriptionSettings(Name = "save/data")]
  111. [DisplayName("保存项目数据")]
  112. public async Task SaveData([FromForm] GoViewProSaveDataInput input)
  113. {
  114. if (await _goViewProDataRep.IsAnyAsync(u => u.Id == input.ProjectId))
  115. {
  116. await _goViewProDataRep.AsUpdateable()
  117. .SetColumns(u => new GoViewProData
  118. {
  119. Content = input.Content
  120. })
  121. .Where(u => u.Id == input.ProjectId)
  122. .ExecuteCommandAsync();
  123. }
  124. else
  125. {
  126. await _goViewProDataRep.InsertAsync(new GoViewProData
  127. {
  128. Id = input.ProjectId,
  129. Content = input.Content,
  130. });
  131. }
  132. }
  133. /// <summary>
  134. /// 上传预览图
  135. /// </summary>
  136. [DisplayName("上传预览图")]
  137. public async Task<GoViewProUploadOutput> Upload(IFormFile @object)
  138. {
  139. /*
  140. * 前端逻辑(useSync.hook.ts 的 dataSyncUpdate 方法):
  141. * 如果 FileUrl 不为空,使用 FileUrl
  142. * 否则使用 GetOssInfo 接口获取到的 BucketUrl 和 FileName 进行拼接
  143. */
  144. //文件名格式示例 13414795568325_index_preview.png
  145. var fileNameSplit = @object.FileName.Split('_');
  146. var idStr = fileNameSplit[0];
  147. if (!long.TryParse(idStr, out var id)) return new GoViewProUploadOutput();
  148. //将预览图转换成 Base64
  149. var ms = new MemoryStream();
  150. await @object.CopyToAsync(ms);
  151. var base64Image = Convert.ToBase64String(ms.ToArray());
  152. //保存
  153. if (await _goViewProDataRep.IsAnyAsync(u => u.Id == id))
  154. {
  155. await _goViewProDataRep.AsUpdateable()
  156. .SetColumns(u => new GoViewProData
  157. {
  158. IndexImageData = base64Image
  159. })
  160. .Where(u => u.Id == id)
  161. .ExecuteCommandAsync();
  162. }
  163. else
  164. {
  165. await _goViewProDataRep.InsertAsync(new GoViewProData
  166. {
  167. Id = id,
  168. IndexImageData = base64Image,
  169. });
  170. }
  171. var output = new GoViewProUploadOutput
  172. {
  173. Id = id,
  174. BucketName = null,
  175. CreateTime = null,
  176. CreateUserId = null,
  177. FileName = null,
  178. FileSize = 0,
  179. FileSuffix = "png",
  180. FileUrl = $"api/goview/project/getIndexImage/{id}",
  181. UpdateTime = null,
  182. UpdateUserId = null
  183. };
  184. #region 使用 SysFileService 方式(已注释)
  185. ////删除已存在的预览图
  186. //var uploadFileName = Path.GetFileNameWithoutExtension(@object.FileName);
  187. //var existFiles = await _fileRep.GetListAsync(u => u.FileName == uploadFileName);
  188. //foreach (var f in existFiles)
  189. // await _fileService.DeleteFile(new DeleteFileInput { Id = f.Id });
  190. ////保存预览图
  191. //var result = await _fileService.UploadFile(@object, "");
  192. //var file = await _fileRep.GetFirstAsync(u => u.Id == result.Id);
  193. //int.TryParse(file.SizeKb, out var size);
  194. ////本地存储,使用拼接的地址
  195. //var fileUrl = file.BucketName == "Local" ? $"{file.FilePath}/{file.Id}{file.Suffix}" : file.Url;
  196. //var output = new ProjectUploadOutput
  197. //{
  198. // Id = file.Id,
  199. // BucketName = file.BucketName,
  200. // CreateTime = file.CreateTime,
  201. // CreateUserId = file.CreateUserId,
  202. // FileName = $"{file.FileName}{file.Suffix}",
  203. // FileSize = size,
  204. // FileSuffix = file.Suffix?[1..],
  205. // FileUrl = fileUrl,
  206. // UpdateTime = null,
  207. // UpdateUserId = null
  208. //};
  209. #endregion 使用 SysFileService 方式(已注释)
  210. return output;
  211. }
  212. /// <summary>
  213. /// 获取预览图
  214. /// </summary>
  215. /// <returns></returns>
  216. [AllowAnonymous]
  217. [NonUnify]
  218. [ApiDescriptionSettings(Name = "GetIndexImage")]
  219. [DisplayName("获取预览图")]
  220. public async Task<IActionResult> GetIndexImage(long id)
  221. {
  222. var projectData = await _goViewProDataRep.AsQueryable().IgnoreColumns(u => u.Content).FirstAsync(u => u.Id == id);
  223. if (projectData?.IndexImageData == null)
  224. return new NoContentResult();
  225. var bytes = Convert.FromBase64String(projectData.IndexImageData);
  226. return new FileStreamResult(new MemoryStream(bytes), "image/png");
  227. }
  228. }