DashboardController.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using Masuit.Tools.AspNetCore.ModelBinder;
  2. using Masuit.Tools.Logging;
  3. using Polly;
  4. using System.Text;
  5. using Dispose.Scope;
  6. using Masuit.Tools.Mime;
  7. namespace Masuit.MyBlogs.Core.Controllers;
  8. /// <summary>
  9. /// 控制面板
  10. /// </summary>
  11. public sealed class DashboardController(IWebHostEnvironment env) : AdminController
  12. {
  13. /// <summary>
  14. /// 控制面板
  15. /// </summary>
  16. /// <returns></returns>
  17. [Route("dashboard"), Route("dashboard/{**route}", Order = 999), ResponseCache(Duration = 60, VaryByHeader = "Cookie")]
  18. public ActionResult Index()
  19. {
  20. Response.Cookies.Append("lang", "zh-cn", new CookieOptions()
  21. {
  22. Expires = DateTime.Now.AddYears(1),
  23. });
  24. var html = System.IO.File.ReadAllText(Path.Combine(env.WebRootPath, "dashboard", "index.html"));
  25. return Content(html, ContentType.Html);
  26. }
  27. [Route("counter")]
  28. public ActionResult Counter()
  29. {
  30. return View();
  31. }
  32. /// <summary>
  33. /// 获取站内消息
  34. /// </summary>
  35. /// <returns></returns>
  36. public async Task<ActionResult> GetMessages([FromServices] IPostService postService, [FromServices] ILeaveMessageService leaveMessageService, [FromServices] ICommentService commentService, CancellationToken cancellationToken)
  37. {
  38. Response.ContentType = "text/event-stream";
  39. Response.Headers.Append("X-Accel-Buffering", "no");
  40. Response.Headers.Append("Cache-Control", "no-cache");
  41. while (true)
  42. {
  43. try
  44. {
  45. if (cancellationToken.IsCancellationRequested)
  46. {
  47. break;
  48. }
  49. await Response.WriteAsync($"event: message\n", cancellationToken);
  50. var post = postService.GetQuery(p => p.Status == Status.Pending).Select(p => new
  51. {
  52. p.Id,
  53. p.Title,
  54. p.PostDate,
  55. p.Author
  56. }).ToPooledListScope();
  57. var msgs = leaveMessageService.GetQuery(m => m.Status == Status.Pending).Select(p => new
  58. {
  59. p.Id,
  60. p.PostDate,
  61. p.NickName
  62. }).ToPooledListScope();
  63. var comments = commentService.GetQuery(c => c.Status == Status.Pending).Select(p => new
  64. {
  65. p.Id,
  66. p.CommentDate,
  67. p.PostId,
  68. p.NickName
  69. }).ToPooledListScope();
  70. await Response.WriteAsync("data:" + new
  71. {
  72. post,
  73. msgs,
  74. comments
  75. }.ToJsonString() + "\r\r", cancellationToken: cancellationToken);
  76. await Response.Body.FlushAsync(cancellationToken);
  77. await Task.Delay(5000, cancellationToken);
  78. }
  79. catch (OperationCanceledException)
  80. {
  81. break;
  82. }
  83. }
  84. Response.Body.Close();
  85. return Ok();
  86. }
  87. /// <summary>
  88. /// 获取日志文件列表
  89. /// </summary>
  90. /// <returns></returns>
  91. public ActionResult GetLogfiles()
  92. {
  93. var files = Directory.GetFiles(LogManager.LogDirectory).OrderByDescending(s => s).Select(Path.GetFileName).ToPooledListScope();
  94. return ResultData(files);
  95. }
  96. /// <summary>
  97. /// 查看日志
  98. /// </summary>
  99. /// <param name="filename"></param>
  100. /// <returns></returns>
  101. public ActionResult Catlog([FromBodyOrDefault] string filename)
  102. {
  103. if (System.IO.File.Exists(Path.Combine(LogManager.LogDirectory, filename)))
  104. {
  105. string text = new FileInfo(Path.Combine(LogManager.LogDirectory, filename)).ShareReadWrite().ReadAllText(Encoding.UTF8);
  106. return ResultData(text);
  107. }
  108. return ResultData(null, false, "文件不存在!");
  109. }
  110. /// <summary>
  111. /// 删除文件
  112. /// </summary>
  113. /// <param name="filename"></param>
  114. /// <returns></returns>
  115. public ActionResult DeleteFile([FromBodyOrDefault] string filename)
  116. {
  117. Policy.Handle<IOException>().WaitAndRetry(5, i => TimeSpan.FromSeconds(1)).Execute(() => System.IO.File.Delete(Path.Combine(LogManager.LogDirectory, filename)));
  118. return ResultData(null, message: "文件删除成功!");
  119. }
  120. /// <summary>
  121. /// 资源管理器
  122. /// </summary>
  123. /// <returns></returns>
  124. [Route("filemanager"), ResponseCache(Duration = 60, VaryByHeader = "Cookie")]
  125. public ActionResult FileManager()
  126. {
  127. return View();
  128. }
  129. [HttpGet("refresh-memory")]
  130. public ActionResult RefreshMemory()
  131. {
  132. GC.RefreshMemoryLimit();
  133. return Ok();
  134. }
  135. [HttpGet("clear-memory")]
  136. public ActionResult ClearMemory()
  137. {
  138. Tools.Win32.Windows.ClearMemorySilent();
  139. return Ok();
  140. }
  141. }