GoViewProService.cs 11 KB

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