ArticleService.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using Datory;
  5. using GxPress.Common.Tools;
  6. using GxPress.Entity;
  7. using GxPress.Repository.Interface;
  8. using GxPress.Repository.Interface.Collection;
  9. using GxPress.Result.Article;
  10. using GxPress.Service.Interface.Article;
  11. using GxPress.Service.Interface.Analyze;
  12. using GxPress.Request.Analyze;
  13. using GxPress.Service.Interface.Visit;
  14. using GxPress.Request.Article;
  15. using GxPress.Service.Interface.ArticleLabel;
  16. namespace GxPress.Service.Implement.Article
  17. {
  18. /// <summary>
  19. /// 文章
  20. /// </summary>
  21. public class ArticleService : IArticleService
  22. {
  23. private readonly IUserRepository _userRepository;
  24. private readonly ICommentRepository _commentRepository;
  25. private readonly IArticleRepository _articleRepository;
  26. private readonly IArticleGroupRepository _articleGroupRepository;
  27. private readonly IMiddleRepository _middleRepository;
  28. private readonly ICollectionRepository _collectionRepository;
  29. private readonly IAnalyzeService _analyzeService;
  30. private readonly IVisitService _visitService;
  31. private readonly IArticleLabelService _articleLabelService;
  32. public ArticleService(IUserRepository userRepository,
  33. ICommentRepository commentRepository, IArticleRepository articleRepository, IArticleGroupRepository articleGroupRepository, ICollectionRepository collectionRepository, IMiddleRepository middleRepository, IAnalyzeService analyzeService, IVisitService visitService, IArticleLabelService articleLabelService)
  34. {
  35. _userRepository = userRepository;
  36. _commentRepository = commentRepository;
  37. _articleRepository = articleRepository;
  38. _articleGroupRepository = articleGroupRepository;
  39. _middleRepository = middleRepository;
  40. _collectionRepository = collectionRepository;
  41. _analyzeService = analyzeService;
  42. _visitService = visitService;
  43. _articleLabelService = articleLabelService;
  44. }
  45. /// <summary>
  46. /// 获取文章详情
  47. /// </summary>
  48. /// <param name="id"></param>
  49. /// <param name="userId"></param>
  50. /// <returns></returns>
  51. public async Task<ArticleResult> GetAsync(int id, int userId)
  52. {
  53. var article = await _articleRepository.GetAsync(id);
  54. if (article == null)
  55. return new ArticleResult();
  56. //增加阅读量
  57. //访问
  58. if (userId > 0)
  59. await _visitService.AddVisit(userId, 1, id);
  60. //获取文章类型名称
  61. var articleGroup = await _articleGroupRepository.GetAsync(article.GroupId);
  62. var groupName = articleGroup == null ? "" : articleGroup.Name;
  63. //获取文章的点赞数据
  64. var articleResult = new ArticleResult
  65. {
  66. Id = article.Id,
  67. Title = article.Title,
  68. GroupId = article.GroupId,
  69. ImageUrls = StringUtils.StringCollectionToStringList(article.ImageUrls),
  70. Summary = article.Summary,
  71. Author = article.Author,
  72. Source = article.Source,
  73. ArticleBlocks = StringUtils.JsonDeserialize<IEnumerable<Block>>(article.Blocks),
  74. IsChecked = article.IsChecked,
  75. AddDate = article.AddDate,
  76. Sort = article.Sort,
  77. GroupName = groupName,
  78. ReadCount = await _visitService.GetCountAsync(1, article.Id),
  79. IsTop = article.IsTop,
  80. CreatedDate = article.CreatedDate
  81. };
  82. //标签
  83. articleResult.ArticleInnerLabelsResult = await _articleLabelService.GetArticleLabelsAsync(id);
  84. //文章图片
  85. foreach (var block in articleResult.ArticleBlocks)
  86. {
  87. if (block.Type == "image")
  88. block.Data.File.Url = StringUtils.AddDomain(block.Data.File.Url);
  89. }
  90. var imageUrls = articleResult.ImageUrls.ToList();
  91. for (int i = 0; i < imageUrls.Count(); i++)
  92. imageUrls[i] = StringUtils.AddDomain(imageUrls[i]);
  93. articleResult.ImageUrls = imageUrls;
  94. var analyzeRequest = new Request.App.Analyze.AnalyzeRequest();
  95. analyzeRequest.TypeValue = 0;
  96. analyzeRequest.AnalyzeType = 1;
  97. analyzeRequest.SourceId = id;
  98. analyzeRequest.UserId = userId;
  99. //点赞数量
  100. articleResult.PraiseCount = await _analyzeService.CountAsync(analyzeRequest);
  101. //获取话题的评论数量
  102. var commentCount =
  103. await _commentRepository.CountAsync(Q.Where(nameof(Entity.Comment.ArticleId), id).Where(nameof(Entity.Comment.TypeValue), 0).Where(nameof(Entity.Comment.Pid), 0));
  104. articleResult.CommentCount = commentCount;
  105. //获取话题的转发数量
  106. analyzeRequest.AnalyzeType = 4;
  107. var retransmissionCount = await _analyzeService.CountAsync(analyzeRequest);
  108. articleResult.RetransmissionCount = retransmissionCount;
  109. articleResult.IsRetransmission = await _analyzeService.ExistsAsync(analyzeRequest);
  110. //获取话题的收藏数量
  111. analyzeRequest.AnalyzeType = 3;
  112. var collectCount = await _analyzeService.CountAsync(analyzeRequest);
  113. articleResult.CollectCount = collectCount;
  114. //是否收藏
  115. articleResult.IsCollect = await _analyzeService.ExistsAsync(analyzeRequest);
  116. //获取话题的点赞数量
  117. analyzeRequest.AnalyzeType = 1;
  118. var praiseCount = await _analyzeService.CountAsync(analyzeRequest);
  119. articleResult.PraiseCount = praiseCount;
  120. //是否点赞
  121. articleResult.IsPraise = await _analyzeService.ExistsAsync(analyzeRequest);
  122. var request = new PraisePageSearchRequest { SourceId = id, TypeValue = 0, Page = 1, PerPage = 3 };
  123. articleResult.ArticlePraisePagedList = await _analyzeService.GetPraisePageAsync(request);
  124. return articleResult;
  125. }
  126. /// <summary>
  127. /// 添加
  128. /// </summary>
  129. /// <param name="request"></param>
  130. /// <returns></returns>
  131. public async Task<ArticleResult> AddAsync(ArticleAddRequest request)
  132. {
  133. //文章图片
  134. var resultImageUrls = request.ImageUrls.ToList();
  135. for (int i = 0; i < resultImageUrls.Count; i++)
  136. resultImageUrls[i] = StringUtils.RemoveDomain(resultImageUrls[i]);
  137. request.ImageUrls = resultImageUrls;
  138. //文章内容图片
  139. foreach (var block in request.Blocks)
  140. {
  141. if (block.Type == "image")
  142. {
  143. block.Data.File.Url = StringUtils.RemoveDomain(block.Data.File.Url);
  144. }
  145. }
  146. var sort = request.Sort == 0 ? await _articleRepository.MaxAsync(nameof(Entity.Article.Sort)) : request.Sort;
  147. var article = new Entity.Article
  148. {
  149. Title = request.Title,
  150. GroupId = request.GroupId,
  151. ImageUrls = StringUtils.ObjectCollectionToString(request.ImageUrls),
  152. Summary = request.Summary,
  153. Author = request.Author,
  154. Source = request.Source,
  155. Blocks = StringUtils.JsonSerialize(request.Blocks),
  156. IsChecked = request.IsChecked,
  157. AddDate = request.AddDate,
  158. Sort = sort ?? 1,
  159. IsTop = request.IsTop
  160. };
  161. article.Id = await _articleRepository.InsertAsync(article);
  162. //添加文章标签
  163. await _articleLabelService.AddArticleInnerLabel(article.Id, request.ArticleLabelIds);
  164. var articleResult = new ArticleResult
  165. {
  166. Id = article.Id,
  167. Title = article.Title,
  168. GroupId = article.GroupId,
  169. ImageUrls = StringUtils.StringCollectionToStringList(article.ImageUrls),
  170. Summary = article.Summary,
  171. Author = article.Author,
  172. Source = article.Source,
  173. ArticleBlocks = StringUtils.JsonDeserialize<IEnumerable<Block>>(article.Blocks),
  174. IsChecked = article.IsChecked,
  175. AddDate = article.AddDate,
  176. Sort = article.Sort,
  177. IsTop = article.IsTop
  178. };
  179. //文章图片
  180. resultImageUrls = articleResult.ImageUrls.ToList();
  181. for (int i = 0; i < resultImageUrls.Count; i++)
  182. {
  183. resultImageUrls[i] = StringUtils.AddDomain(resultImageUrls[i]);
  184. }
  185. articleResult.ImageUrls = resultImageUrls;
  186. //文章内容图片
  187. foreach (var block in articleResult.ArticleBlocks)
  188. {
  189. if (block.Type == "image")
  190. {
  191. block.Data.File.Url = StringUtils.AddDomain(block.Data.File.Url);
  192. }
  193. }
  194. return articleResult;
  195. }
  196. public async Task<ArticleResult> EditAsync(ArticleEditRequest request)
  197. {
  198. //解析文章类容 图片地址
  199. foreach (var block in request.Blocks)
  200. {
  201. if (block.Type == "image")
  202. {
  203. block.Data.File.Url = StringUtils.RemoveDomain(block.Data.File.Url);
  204. }
  205. }
  206. //
  207. var imageUrls = request.ImageUrls.ToList();
  208. for (int i = 0; i < imageUrls.Count; i++)
  209. {
  210. imageUrls[i] = StringUtils.RemoveDomain(imageUrls[i]);
  211. }
  212. request.ImageUrls = imageUrls;
  213. var article = new Entity.Article
  214. {
  215. Id = request.Id,
  216. Title = request.Title,
  217. GroupId = request.GroupId,
  218. ImageUrls = StringUtils.ObjectCollectionToString(request.ImageUrls),
  219. Summary = request.Summary,
  220. Author = request.Author,
  221. Source = request.Source,
  222. Blocks = StringUtils.JsonSerialize(request.Blocks),
  223. IsChecked = request.IsChecked,
  224. AddDate = request.AddDate,
  225. Sort = request.Sort,
  226. IsTop = request.IsTop
  227. };
  228. await _articleRepository.UpdateAsync(article);
  229. //添加文章标签
  230. await _articleLabelService.AddArticleInnerLabel(article.Id, request.ArticleLabelIds);
  231. var articleResult = new ArticleResult
  232. {
  233. Id = article.Id,
  234. Title = article.Title,
  235. GroupId = article.GroupId,
  236. ImageUrls = StringUtils.StringCollectionToStringList(article.ImageUrls),
  237. Summary = article.Summary,
  238. Author = article.Author,
  239. Source = article.Source,
  240. ArticleBlocks = StringUtils.JsonDeserialize<IEnumerable<Block>>(article.Blocks),
  241. IsChecked = article.IsChecked,
  242. AddDate = article.AddDate,
  243. Sort = article.Sort,
  244. IsTop = request.IsTop
  245. };
  246. //文章图片
  247. var resultImageUrls = articleResult.ImageUrls.ToList();
  248. for (int i = 0; i < resultImageUrls.Count; i++)
  249. {
  250. resultImageUrls[i] = StringUtils.AddDomain(resultImageUrls[i]);
  251. }
  252. articleResult.ImageUrls = resultImageUrls;
  253. //文章内容图片
  254. foreach (var block in articleResult.ArticleBlocks)
  255. {
  256. if (block.Type == "image")
  257. {
  258. block.Data.File.Url = StringUtils.AddDomain(block.Data.File.Url);
  259. }
  260. }
  261. return articleResult;
  262. }
  263. }
  264. }