BugController.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using Common;
  2. using Hangfire;
  3. using Masuit.MyBlogs.Core.Extensions;
  4. using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
  5. using Masuit.MyBlogs.Core.Models.DTO;
  6. using Masuit.MyBlogs.Core.Models.Entity;
  7. using Masuit.MyBlogs.Core.Models.Enum;
  8. using Masuit.MyBlogs.Core.Models.RequestModel;
  9. using Masuit.MyBlogs.Core.Models.ViewModel;
  10. using Masuit.Tools.Core.Net;
  11. using Masuit.Tools.Systems;
  12. using Microsoft.AspNetCore.Hosting;
  13. using Microsoft.AspNetCore.Mvc;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Text.RegularExpressions;
  18. namespace Masuit.MyBlogs.Core.Controllers
  19. {
  20. /// <summary>
  21. /// bug反馈
  22. /// </summary>
  23. public class BugController : BaseController
  24. {
  25. /// <summary>
  26. /// IssueService
  27. /// </summary>
  28. public IIssueService IssueService { get; set; }
  29. /// <summary>
  30. /// MessageService
  31. /// </summary>
  32. public IInternalMessageService MessageService { get; set; }
  33. private readonly IHostingEnvironment _hostingEnvironment;
  34. /// <summary>
  35. /// bug反馈
  36. /// </summary>
  37. /// <param name="issueService"></param>
  38. /// <param name="messageService"></param>
  39. /// <param name="hostingEnvironment"></param>
  40. public BugController(IIssueService issueService, IInternalMessageService messageService, IHostingEnvironment hostingEnvironment)
  41. {
  42. IssueService = issueService;
  43. MessageService = messageService;
  44. _hostingEnvironment = hostingEnvironment;
  45. }
  46. /// <summary>
  47. /// bug首页
  48. /// </summary>
  49. /// <returns></returns>
  50. [Route("bug")]
  51. public ActionResult Index()
  52. {
  53. return View();
  54. }
  55. /// <summary>
  56. /// 分页数据
  57. /// </summary>
  58. /// <param name="filter"></param>
  59. /// <returns></returns>
  60. [HttpPost]
  61. public ActionResult PageData([FromBody]PageFilter filter)
  62. {
  63. UserInfoOutputDto user = HttpContext.Session.GetByRedis<UserInfoOutputDto>(SessionKey.UserInfo) ?? new UserInfoOutputDto();
  64. List<Issue> list;
  65. int total;
  66. if (string.IsNullOrEmpty(filter.Kw))
  67. {
  68. list = IssueService.LoadPageEntitiesFromL2CacheNoTracking(filter.Page, filter.Size, out total, i => i.Status != Status.Handled || i.Level != BugLevel.Fatal || user.IsAdmin, i => i.SubmitTime, false).ToList();
  69. }
  70. else
  71. {
  72. var searchResult = IssueService.SearchPage(filter.Page, filter.Size, filter.Kw);
  73. total = searchResult.Total;
  74. list = searchResult.Results.Where(i => i.Status != Status.Handled || i.Level != BugLevel.Fatal || user.IsAdmin).ToList();
  75. }
  76. var pageCount = Math.Ceiling(total * 1.0 / filter.Size).ToInt32();
  77. return PageResult(list.Select(i => new
  78. {
  79. i.Id,
  80. i.Name,
  81. //i.Email,
  82. i.Title,
  83. i.Link,
  84. i.Description,
  85. i.SubmitTime,
  86. i.HandleTime,
  87. Status = i.Status.GetDisplay(),
  88. Level = i.Level.GetDisplay()
  89. }), pageCount, total);
  90. }
  91. /// <summary>
  92. /// 问题详情
  93. /// </summary>
  94. /// <param name="id"></param>
  95. /// <returns></returns>
  96. [Route("bug/{id:int}")]
  97. public ActionResult Datails(int id)
  98. {
  99. Issue issue = IssueService.GetById(id);
  100. if (issue is null)
  101. {
  102. return RedirectToAction("Index", "Error");
  103. }
  104. return View(issue);
  105. }
  106. /// <summary>
  107. /// 处理
  108. /// </summary>
  109. /// <param name="id">问题id</param>
  110. /// <param name="text">处理意见</param>
  111. /// <returns></returns>
  112. [Authority]
  113. public ActionResult Handle(int id, string text)
  114. {
  115. Issue issue = IssueService.GetById(id);
  116. issue.Status = Status.Handled;
  117. issue.HandleTime = DateTime.Now;
  118. issue.Msg = text;
  119. bool b = IssueService.UpdateEntitySaved(issue);
  120. string content = System.IO.File.ReadAllText(_hostingEnvironment.WebRootPath + "/template/bugfeed.html").Replace("{{title}}", issue.Title).Replace("{{link}}", issue.Link).Replace("{{text}}", text).Replace("{{date}}", issue.HandleTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));
  121. BackgroundJob.Enqueue(() => CommonHelper.SendMail("bug提交反馈通知", content, issue.Email));
  122. return ResultData(null, b, b ? "问题处理成功!" : "处理失败!");
  123. }
  124. /// <summary>
  125. /// 提交问题
  126. /// </summary>
  127. /// <param name="issue"></param>
  128. /// <returns></returns>
  129. [HttpPost]
  130. public ActionResult Submit(Issue issue)
  131. {
  132. issue.Description = CommonHelper.ReplaceImgSrc(Regex.Replace(issue.Description, @"<img\s+[^>]*\s*src\s*=\s*['""]?(\S+\.\w{3,4})['""]?[^/>]*/>", "<img src=\"$1\"/>")).Replace("/thumb150/", "/large/");
  133. issue.IPAddress = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
  134. Issue bug = IssueService.AddEntitySaved(issue);
  135. if (bug != null)
  136. {
  137. MessageService.AddEntitySaved(new InternalMessage()
  138. {
  139. Title = $"来自【{issue.Name}({issue.Email})】的bug问题反馈",
  140. Content = bug.Description,
  141. Link = Url.Action("Index")
  142. });
  143. string content = System.IO.File.ReadAllText(_hostingEnvironment.WebRootPath + "/template/bugreport.html").Replace("{{name}}", bug.Name).Replace("{{email}}", bug.Email).Replace("{{title}}", bug.Title).Replace("{{desc}}", bug.Description).Replace("{{link}}", bug.Link).Replace("{{date}}", bug.SubmitTime.ToString("yyyy-MM-dd HH:mm:ss"));
  144. BackgroundJob.Enqueue(() => CommonHelper.SendMail("bug提交通知", content, "[email protected]"));
  145. return ResultData(issue, true, "问题提交成功,感谢您的反馈!");
  146. }
  147. return ResultData(null, false, "提交失败!");
  148. }
  149. /// <summary>
  150. /// 删除问题
  151. /// </summary>
  152. /// <param name="id">问题id</param>
  153. /// <returns></returns>
  154. [Authority]
  155. public ActionResult Delete(int id)
  156. {
  157. bool b = IssueService.DeleteByIdSaved(id);
  158. return ResultData(null, b, b ? "删除成功!" : "删除失败!");
  159. }
  160. /// <summary>
  161. /// 获取问题级别
  162. /// </summary>
  163. /// <returns></returns>
  164. public ActionResult GetBugLevels()
  165. {
  166. List<object> list = new List<object>();
  167. foreach (Enum value in Enum.GetValues(typeof(BugLevel)))
  168. {
  169. list.Add(new
  170. {
  171. name = value.GetDisplay(),
  172. value
  173. });
  174. }
  175. return ResultData(list);
  176. }
  177. }
  178. }