GoViewProService.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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. private readonly SqlSugarRepository<SysFile> _sysFileRep;
  19. private readonly SysFileService _fileService;
  20. public GoViewProService(SqlSugarRepository<GoViewPro> goViewProjectRep,
  21. SqlSugarRepository<GoViewProData> goViewProjectDataRep,
  22. SqlSugarRepository<SysFile> fileRep,
  23. SysFileService fileService)
  24. {
  25. _goViewProRep = goViewProjectRep;
  26. _goViewProDataRep = goViewProjectDataRep;
  27. _sysFileRep = fileRep;
  28. _fileService = fileService;
  29. }
  30. /// <summary>
  31. /// 获取项目列表
  32. /// </summary>
  33. /// <param name="page"></param>
  34. /// <param name="limit"></param>
  35. /// <returns></returns>
  36. [DisplayName("获取项目列表")]
  37. public async Task<List<GoViewProItemOutput>> GetList([FromQuery] int page = 1, [FromQuery] int limit = 12)
  38. {
  39. var res = await _goViewProRep.AsQueryable()
  40. .Select(u => new GoViewProItemOutput(), true)
  41. .ToPagedListAsync(page, limit);
  42. return res.Items.ToList();
  43. }
  44. /// <summary>
  45. /// 新增项目
  46. /// </summary>
  47. /// <param name="input"></param>
  48. /// <returns></returns>
  49. [ApiDescriptionSettings(Name = "Create")]
  50. [DisplayName("新增项目")]
  51. public async Task<GoViewProCreateOutput> Create(GoViewProCreateInput input)
  52. {
  53. var project = await _goViewProRep.AsInsertable(input.Adapt<GoViewPro>()).ExecuteReturnEntityAsync();
  54. return new GoViewProCreateOutput
  55. {
  56. Id = project.Id
  57. };
  58. }
  59. /// <summary>
  60. /// 修改项目
  61. /// </summary>
  62. /// <param name="input"></param>
  63. /// <returns></returns>
  64. [DisplayName("修改项目")]
  65. public async Task Edit(GoViewProEditInput input)
  66. {
  67. await _goViewProRep.AsUpdateable(input.Adapt<GoViewPro>()).IgnoreColumns(true).ExecuteCommandAsync();
  68. }
  69. /// <summary>
  70. /// 删除项目
  71. /// </summary>
  72. [ApiDescriptionSettings(Name = "Delete")]
  73. [DisplayName("删除项目")]
  74. [UnitOfWork]
  75. public async Task Delete([FromQuery] string ids)
  76. {
  77. var idList = ids.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(u => Convert.ToInt64(u)).ToList();
  78. await _goViewProRep.AsDeleteable().Where(u => idList.Contains(u.Id)).ExecuteCommandAsync();
  79. await _goViewProDataRep.AsDeleteable().Where(u => idList.Contains(u.Id)).ExecuteCommandAsync();
  80. }
  81. /// <summary>
  82. /// 修改发布状态
  83. /// </summary>
  84. [HttpPut]
  85. [DisplayName("修改发布状态")]
  86. public async Task Publish(GoViewProPublishInput input)
  87. {
  88. await _goViewProRep.AsUpdateable()
  89. .SetColumns(u => new GoViewPro
  90. {
  91. State = input.State
  92. })
  93. .Where(u => u.Id == input.Id)
  94. .ExecuteCommandAsync();
  95. }
  96. /// <summary>
  97. /// 获取项目数据
  98. /// </summary>
  99. /// <param name="projectId"></param>
  100. /// <returns></returns>
  101. [AllowAnonymous]
  102. [ApiDescriptionSettings(Name = "GetData")]
  103. [DisplayName("获取项目数据")]
  104. public async Task<GoViewProDetailOutput> GetData([FromQuery] long projectId)
  105. {
  106. var projectData = await _goViewProDataRep.GetFirstAsync(u => u.Id == projectId);
  107. if (projectData == null) return null;
  108. var project = await _goViewProRep.GetFirstAsync(u => u.Id == projectId);
  109. var projectDetail = project.Adapt<GoViewProDetailOutput>();
  110. projectDetail.Content = projectData.Content;
  111. return projectDetail;
  112. }
  113. /// <summary>
  114. /// 保存项目数据
  115. /// </summary>
  116. [ApiDescriptionSettings(Name = "save/data")]
  117. [DisplayName("保存项目数据")]
  118. public async Task SaveData([FromForm] GoViewProSaveDataInput input)
  119. {
  120. if (await _goViewProDataRep.IsAnyAsync(u => u.Id == input.ProjectId))
  121. {
  122. await _goViewProDataRep.AsUpdateable()
  123. .SetColumns(u => new GoViewProData
  124. {
  125. Content = input.Content
  126. })
  127. .Where(u => u.Id == input.ProjectId)
  128. .ExecuteCommandAsync();
  129. }
  130. else
  131. {
  132. await _goViewProDataRep.InsertAsync(new GoViewProData
  133. {
  134. Id = input.ProjectId,
  135. Content = input.Content,
  136. });
  137. }
  138. }
  139. /// <summary>
  140. /// 上传预览图
  141. /// </summary>
  142. [DisplayName("上传预览图")]
  143. public async Task<GoViewProUploadOutput> Upload(IFormFile @object)
  144. {
  145. /*
  146. * 前端逻辑(useSync.hook.ts 的 dataSyncUpdate 方法):
  147. * 如果 FileUrl 不为空,使用 FileUrl
  148. * 否则使用 GetOssInfo 接口获取到的 BucketUrl 和 FileName 进行拼接
  149. */
  150. //文件名格式示例 13414795568325_index_preview.png
  151. var fileNameSplit = @object.FileName.Split('_');
  152. var idStr = fileNameSplit[0];
  153. if (!long.TryParse(idStr, out var id)) return new GoViewProUploadOutput();
  154. //将预览图转换成 Base64
  155. var ms = new MemoryStream();
  156. await @object.CopyToAsync(ms);
  157. var base64Image = Convert.ToBase64String(ms.ToArray());
  158. //保存
  159. if (await _goViewProDataRep.IsAnyAsync(u => u.Id == id))
  160. {
  161. await _goViewProDataRep.AsUpdateable()
  162. .SetColumns(u => new GoViewProData
  163. {
  164. IndexImageData = base64Image
  165. })
  166. .Where(u => u.Id == id)
  167. .ExecuteCommandAsync();
  168. }
  169. else
  170. {
  171. await _goViewProDataRep.InsertAsync(new GoViewProData
  172. {
  173. Id = id,
  174. IndexImageData = base64Image,
  175. });
  176. }
  177. var output = new GoViewProUploadOutput
  178. {
  179. Id = id,
  180. BucketName = null,
  181. CreateTime = null,
  182. CreateUserId = null,
  183. FileName = null,
  184. FileSize = 0,
  185. FileSuffix = "png",
  186. FileUrl = $"api/goview/project/getIndexImage/{id}",
  187. UpdateTime = null,
  188. UpdateUserId = null
  189. };
  190. #region 使用 SysFileService 方式(已注释)
  191. ////删除已存在的预览图
  192. //var uploadFileName = Path.GetFileNameWithoutExtension(@object.FileName);
  193. //var existFiles = await _fileRep.GetListAsync(u => u.FileName == uploadFileName);
  194. //foreach (var f in existFiles)
  195. // await _fileService.DeleteFile(new DeleteFileInput { Id = f.Id });
  196. ////保存预览图
  197. //var result = await _fileService.UploadFile(@object, "");
  198. //var file = await _fileRep.GetFirstAsync(u => u.Id == result.Id);
  199. //int.TryParse(file.SizeKb, out var size);
  200. ////本地存储,使用拼接的地址
  201. //var fileUrl = file.BucketName == "Local" ? $"{file.FilePath}/{file.Id}{file.Suffix}" : file.Url;
  202. //var output = new ProjectUploadOutput
  203. //{
  204. // Id = file.Id,
  205. // BucketName = file.BucketName,
  206. // CreateTime = file.CreateTime,
  207. // CreateUserId = file.CreateUserId,
  208. // FileName = $"{file.FileName}{file.Suffix}",
  209. // FileSize = size,
  210. // FileSuffix = file.Suffix?[1..],
  211. // FileUrl = fileUrl,
  212. // UpdateTime = null,
  213. // UpdateUserId = null
  214. //};
  215. #endregion 使用 SysFileService 方式(已注释)
  216. return output;
  217. }
  218. /// <summary>
  219. /// 获取预览图
  220. /// </summary>
  221. /// <returns></returns>
  222. [AllowAnonymous]
  223. [NonUnify]
  224. [ApiDescriptionSettings(Name = "GetIndexImage")]
  225. [DisplayName("获取预览图")]
  226. public async Task<IActionResult> GetIndexImage(long id)
  227. {
  228. var projectData = await _goViewProDataRep.AsQueryable().IgnoreColumns(u => u.Content).FirstAsync(u => u.Id == id);
  229. if (projectData?.IndexImageData == null)
  230. return new NoContentResult();
  231. var bytes = Convert.FromBase64String(projectData.IndexImageData);
  232. return new FileStreamResult(new MemoryStream(bytes), "image/png");
  233. }
  234. }