GoViewProService.cs 9.1 KB

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