using Hangfire; using Masuit.MyBlogs.Core.Common; using Masuit.MyBlogs.Core.Extensions; using Masuit.MyBlogs.Core.Infrastructure.Services.Interface; using Masuit.MyBlogs.Core.Models.DTO; using Masuit.MyBlogs.Core.Models.Entity; using Masuit.MyBlogs.Core.Models.Enum; using Masuit.MyBlogs.Core.Models.ViewModel; using Masuit.Tools.Core.Net; using Masuit.Tools.Html; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Net.Http.Headers; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; namespace Masuit.MyBlogs.Core.Controllers { /// /// 评论管理 /// public class CommentController : BaseController { private ICommentService CommentService { get; } private IPostService PostService { get; } private IInternalMessageService MessageService { get; } private readonly IHostingEnvironment _hostingEnvironment; /// /// 评论管理 /// /// /// /// /// public CommentController(ICommentService commentService, IPostService postService, IInternalMessageService messageService, IHostingEnvironment hostingEnvironment) { CommentService = commentService; PostService = postService; MessageService = messageService; _hostingEnvironment = hostingEnvironment; } /// /// 发表评论 /// /// /// [HttpPost, ValidateAntiForgeryToken] public ActionResult Put(CommentInputDto comment) { if (Regex.Match(comment.Content, CommonHelper.BanRegex).Length > 0) { return ResultData(null, false, "您提交的内容包含敏感词,被禁止发表,请注意改善您的言辞!"); } Post post = PostService.GetById(comment.PostId); if (post is null) { return ResultData(null, false, "评论失败,文章不存在!"); } UserInfoOutputDto user = HttpContext.Session.Get(SessionKey.UserInfo); comment.Content = comment.Content.Trim().Replace("


", string.Empty); if (comment.Content.RemoveHtmlTag().Trim().Equals(HttpContext.Session.Get("comment" + comment.PostId))) { return ResultData(null, false, "您刚才已经在这篇文章发表过一次评论了,换一篇文章吧,或者换一下评论内容吧!"); } if (Regex.Match(comment.Content, CommonHelper.ModRegex).Length <= 0) { comment.Status = Status.Pended; } if (user != null) { comment.NickName = user.NickName; comment.QQorWechat = user.QQorWechat; comment.Email = user.Email; if (user.IsAdmin) { comment.Status = Status.Pended; comment.IsMaster = true; } } comment.Content = comment.Content.HtmlSantinizerStandard().ClearImgAttributes(); comment.CommentDate = DateTime.Now; comment.Browser = comment.Browser ?? Request.Headers[HeaderNames.UserAgent]; comment.IP = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); Comment com = CommentService.AddEntitySaved(comment.Mapper()); if (com != null) { HttpContext.Session.Set("comment" + comment.PostId, comment.Content.RemoveHtmlTag().Trim()); var emails = new List(); var email = CommonHelper.SystemSettings["ReceiveEmail"]; //站长邮箱 emails.Add(email); string content = System.IO.File.ReadAllText(_hostingEnvironment.WebRootPath + "/template/notify.html").Replace("{{title}}", post.Title).Replace("{{time}}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")).Replace("{{nickname}}", com.NickName).Replace("{{content}}", com.Content); if (comment.Status == Status.Pended) { if (!com.IsMaster) { MessageService.AddEntitySaved(new InternalMessage() { Title = $"来自【{com.NickName}】的新文章评论", Content = com.Content, Link = Url.Action("Details", "Post", new { id = com.PostId, cid = com.Id }, Request.Scheme) + "#comment" }); } #if !DEBUG if (com.ParentId == 0) { emails.Add(PostService.GetById(com.PostId).Email); //新评论,只通知博主和楼主 foreach (var s in emails.Distinct()) { BackgroundJob.Enqueue(() => CommonHelper.SendMail(CommonHelper.SystemSettings["Domain"] + "|博客文章新评论:", content.Replace("{{link}}", Url.Action("Details", "Post", new { id = com.PostId, cid = com.Id }, Request.Scheme) + "#comment"), s)); } } else { //通知博主和上层所有关联的评论访客 var pid = CommentService.GetParentCommentIdByChildId(com.Id); emails = CommentService.GetSelfAndAllChildrenCommentsByParentId(pid).Select(c => c.Email).Except(new List { com.Email }).Distinct().ToList(); string link = Url.Action("Details", "Post", new { id = com.PostId, cid = com.Id }, Request.Scheme) + "#comment"; foreach (var s in emails) { BackgroundJob.Enqueue(() => CommonHelper.SendMail($"{CommonHelper.SystemSettings["Domain"]}{CommonHelper.SystemSettings["Title"]}文章评论回复:", content.Replace("{{link}}", link), s)); } } #endif return ResultData(null, true, "评论发表成功,服务器正在后台处理中,这会有一定的延迟,稍后将显示到评论列表中"); } foreach (var s in emails.Distinct()) { BackgroundJob.Enqueue(() => CommonHelper.SendMail(CommonHelper.SystemSettings["Domain"] + "|博客文章新评论(待审核):", content.Replace("{{link}}", Url.Action("Details", "Post", new { id = com.PostId, cid = com.Id }, Request.Scheme) + "#comment") + "

(待审核)

", s)); } return ResultData(null, true, "评论成功,待站长审核通过以后将显示"); } return ResultData(null, false, "评论失败"); } /// /// 评论投票 /// /// /// [HttpPost] public ActionResult CommentVote(int id) { Comment cm = CommentService.GetFirstEntity(c => c.Id == id && c.Status == Status.Pended); if (HttpContext.Session.Get("cm" + id) != null) { return ResultData(null, false, "您刚才已经投过票了,感谢您的参与!"); } if (cm != null) { cm.VoteCount++; CommentService.UpdateEntity(cm); HttpContext.Session.Set("cm" + id, id.GetBytes()); bool b = CommentService.SaveChanges() > 0; return ResultData(null, b, b ? "投票成功" : "投票失败"); } return ResultData(null, false, "非法操作"); } /// /// 获取评论 /// /// /// /// /// /// [HttpPost] public ActionResult GetComments(int? id, int page = 1, int size = 5, int cid = 0) { UserInfoOutputDto user = HttpContext.Session.Get(SessionKey.UserInfo) ?? new UserInfoOutputDto(); int total; //总条数,用于前台分页 if (cid != 0) { int pid = CommentService.GetParentCommentIdByChildId(cid); List single = CommentService.GetSelfAndAllChildrenCommentsByParentId(pid).ToList(); if (single.Any()) { total = 1; return ResultData(new { total, parentTotal = total, page, size, rows = single.Mapper>() }); } } IList parent = CommentService.LoadPageEntities(page, size, out total, c => c.PostId == id && c.ParentId == 0 && (c.Status == Status.Pended || user.IsAdmin), c => c.CommentDate, false).ToList(); if (!parent.Any()) { return ResultData(null, false, "没有评论"); } var list = new List(); parent.ForEach(c => CommentService.GetSelfAndAllChildrenCommentsByParentId(c.Id).ForEach(result => list.Add(result))); var qlist = list.Where(c => (c.Status == Status.Pended || user.IsAdmin)); if (total > 0) { return ResultData(new { total, parentTotal = total, page, size, rows = qlist.Mapper>() }); } return ResultData(null, false, "没有评论"); } /// /// 分页获取评论 /// /// /// /// /// [HttpPost] public ActionResult GetPageComments(int page = 1, int size = 5, int cid = 0) { UserInfoOutputDto user = HttpContext.Session.Get(SessionKey.UserInfo) ?? new UserInfoOutputDto(); int total; //总条数,用于前台分页 if (cid != 0) { int pid = CommentService.GetParentCommentIdByChildId(cid); List single = CommentService.GetSelfAndAllChildrenCommentsByParentId(pid).ToList(); if (single.Any()) { total = 1; return ResultData(new { total, parentTotal = total, page, size, rows = single.Mapper>() }); } } IList parent = CommentService.LoadPageEntities(page, size, out total, c => c.ParentId == 0 && (c.Status == Status.Pended || user.IsAdmin), c => c.CommentDate, false).ToList(); if (!parent.Any()) { return ResultData(null, false, "没有评论"); } var list = new List(); parent.ForEach(c => CommentService.GetSelfAndAllChildrenCommentsByParentId(c.Id).ForEach(result => list.Add(result))); var qlist = list.Where(c => (c.Status == Status.Pended || user.IsAdmin)); if (total > 0) { return ResultData(new { total, parentTotal = total, page, size, rows = qlist.Mapper>() }); } return ResultData(null, false, "没有评论"); } /// /// 审核评论 /// /// /// [Authority] public ActionResult Pass(int id) { Comment comment = CommentService.GetById(id); comment.Status = Status.Pended; Post post = PostService.GetById(comment.PostId); bool b = CommentService.UpdateEntitySaved(comment); var pid = comment.ParentId == 0 ? comment.Id : CommentService.GetParentCommentIdByChildId(id); #if !DEBUG string content = System.IO.File.ReadAllText(Path.Combine(_hostingEnvironment.WebRootPath, "template", "notify.html")).Replace("{{title}}", post.Title).Replace("{{time}}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")).Replace("{{nickname}}", comment.NickName).Replace("{{content}}", comment.Content); var emails = CommentService.GetSelfAndAllChildrenCommentsByParentId(pid).Select(c => c.Email).Distinct().Except(new List { comment.Email, CommonHelper.SystemSettings["ReceiveEmail"] }).ToList(); string link = Url.Action("Details", "Post", new { id = comment.PostId, cid = pid }, Request.Scheme) + "#comment"; foreach (var email in emails) { BackgroundJob.Enqueue(() => CommonHelper.SendMail($"{Request.Host}{CommonHelper.SystemSettings["Title"]}文章评论回复:", content.Replace("{{link}}", link), email)); } #endif return ResultData(null, b, b ? "审核通过!" : "审核失败!"); } /// /// 删除评论 /// /// /// [Authority] public ActionResult Delete(int id) { var b = CommentService.DeleteEntitiesSaved(CommentService.GetSelfAndAllChildrenCommentsByParentId(id).ToList()); return ResultData(null, b, b ? "删除成功!" : "删除失败!"); } /// /// 获取未审核的评论 /// /// [Authority] public ActionResult GetPendingComments(int page = 1, int size = 10) { List list = CommentService.LoadPageEntities(page, size, out int total, c => c.Status == Status.Pending, c => c.CommentDate, false).ToList(); var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32(); return PageResult(list, pageCount, total); } } }