Browse Source

优化图片懒加载

懒得勤快 3 years ago
parent
commit
511926ab56

BIN
src/Masuit.MyBlogs.Core/App_Data/ip2region.db


+ 4 - 2
src/Masuit.MyBlogs.Core/Common/CommonHelper.cs

@@ -276,7 +276,7 @@ namespace Masuit.MyBlogs.Core.Common
         }
 
         /// <summary>
-        /// 将html的img标签的src属性名替换成data-original
+        /// 将html的img标签懒加载
         /// </summary>
         /// <param name="html"></param>
         /// <param name="title"></param>
@@ -292,7 +292,9 @@ namespace Masuit.MyBlogs.Core.Common
                 {
                     string src = node.Attributes["src"].Value;
                     node.RemoveAttribute("src");
-                    node.SetAttribute("data-original", src);
+                    node.SetAttribute("data-src", src);
+                    node.SetAttribute("class", node.Attributes["class"]?.Value + " lazyload");
+                    node.SetAttribute("loading", "lazy");
                     node.SetAttribute("alt", SystemSettings["Title"]);
                     node.SetAttribute("title", title);
                 }

+ 12 - 4
src/Masuit.MyBlogs.Core/Controllers/BaseController.cs

@@ -33,11 +33,17 @@ namespace Masuit.MyBlogs.Core.Controllers
     public class BaseController : Controller
     {
         public IUserInfoService UserInfoService { get; set; }
+
         public IMenuService MenuService { get; set; }
+
         public ILinksService LinksService { get; set; }
+
         public IAdvertisementService AdsService { get; set; }
+
         public IVariablesService VariablesService { get; set; }
+
         public IMapper Mapper { get; set; }
+
         public MapperConfiguration MapperConfig { get; set; }
 
         public UserInfoDto CurrentUser => HttpContext.Session.Get<UserInfoDto>(SessionKey.UserInfo) ?? new UserInfoDto();
@@ -143,7 +149,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             var errmsgs = ModelState.SelectMany(kv => kv.Value.Errors.Select(e => e.ErrorMessage)).Select((s, i) => $"{i + 1}. {s}").ToList();
             filterContext.Result = true switch
             {
-                _ when (Request.Headers[HeaderNames.Accept] + "").StartsWith("application/json") || Request.Method == HttpMethods.Post => ResultData(errmsgs, false, "数据校验失败,错误信息:" + errmsgs.Join(" | "), user != null, HttpStatusCode.BadRequest),
+                _ when Request.HasJsonContentType() || Request.Method == HttpMethods.Post => ResultData(errmsgs, false, "数据校验失败,错误信息:" + errmsgs.Join(" | "), user != null, HttpStatusCode.BadRequest),
                 _ => base.BadRequest("参数错误:" + errmsgs.Join(" | "))
             };
         }
@@ -244,8 +250,10 @@ namespace Masuit.MyBlogs.Core.Controllers
                 {
                     case RegionLimitMode.AllowRegion:
                         return !Regex.IsMatch(location, p.Regions);
+
                     case RegionLimitMode.ForbidRegion:
                         return Regex.IsMatch(location, p.Regions);
+
                     case RegionLimitMode.AllowRegionExceptForbidRegion:
                         if (Regex.IsMatch(location, p.ExceptRegions))
                         {
@@ -322,6 +330,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     }
 
                     break;
+
                 case RegionLimitMode.ForbidRegion:
                     if (Regex.IsMatch(location, post.Regions))
                     {
@@ -329,6 +338,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     }
 
                     break;
+
                 case RegionLimitMode.AllowRegionExceptForbidRegion:
                     if (Regex.IsMatch(location, post.ExceptRegions))
                     {
@@ -374,7 +384,5 @@ namespace Masuit.MyBlogs.Core.Controllers
             });
             throw new NotFoundException("文章未找到");
         }
-
-
     }
-}
+}

+ 11 - 7
src/Masuit.MyBlogs.Core/Controllers/ErrorController.cs

@@ -37,7 +37,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             return true switch
             {
                 _ when accept.StartsWith("image") => File("/Assets/images/404/4044.jpg", ContentType.Jpeg),
-                _ when accept.StartsWith("application/json") || Request.Method == HttpMethods.Post => Json(new
+                _ when Request.HasJsonContentType() || Request.Method == HttpMethods.Post => Json(new
                 {
                     StatusCode = 404,
                     Success = false,
@@ -66,10 +66,12 @@ namespace Masuit.MyBlogs.Core.Controllers
                         err = $"数据库并发更新异常,更新表:{ex.Entries.Select(e => e.Metadata.Name)},请求路径({Request.Method}):{Request.Scheme}://{Request.Host}{HttpUtility.UrlDecode(feature.Path)}{Request.QueryString},客户端用户代理:{Request.Headers[HeaderNames.UserAgent]},客户端IP:{ip}\t{ex.InnerException?.Message},请求参数:\n{await GetRequestBody(Request)}\n堆栈信息:";
                         LogManager.Error(err, ex);
                         break;
+
                     case DbUpdateException ex:
                         err = $"数据库更新时异常,更新表:{ex.Entries.Select(e => e.Metadata.Name)},请求路径({Request.Method}):{Request.Scheme}://{Request.Host}{HttpUtility.UrlDecode(feature.Path)}{Request.QueryString} ,客户端用户代理:{Request.Headers[HeaderNames.UserAgent]},客户端IP:{ip}\t{ex.InnerException?.Message},请求参数:\n{await GetRequestBody(Request)}\n堆栈信息:";
                         LogManager.Error(err, ex);
                         break;
+
                     case AggregateException ex:
                         LogManager.Debug("↓↓↓" + ex.Message + "↓↓↓");
                         ex.Flatten().Handle(e =>
@@ -83,20 +85,23 @@ namespace Masuit.MyBlogs.Core.Controllers
                             LogManager.Debug("↑↑↑请求参数:\n" + body);
                         }
                         break;
+
                     case AccessDenyException:
                         var entry = ip.GetIPLocation();
                         var tips = Template.Create(CommonHelper.SystemSettings.GetOrAdd("AccessDenyTips", @"<h4>遇到了什么问题?</h4>
                 <h4>基于主观因素考虑,您所在的地区暂时不允许访问本站,如有疑问,请联系站长!或者请联系站长开通本站的访问权限!</h4>")).Set("clientip", ip.ToString()).Set("location", entry.Address).Set("network", entry.Network).Render();
                         Response.StatusCode = 403;
                         return View("AccessDeny", tips);
+
                     case TempDenyException:
-                        Response.StatusCode = 403;
-                        return accept.StartsWith("application/json") || Request.Method == HttpMethods.Post ? Json(new
+                        Response.StatusCode = 429;
+                        return Request.HasJsonContentType() || Request.Method == HttpMethods.Post ? Json(new
                         {
-                            StatusCode = 404,
+                            StatusCode = 429,
                             Success = false,
                             Message = $"检测到您的IP({ip})访问过于频繁,已被本站暂时禁止访问,请稍后再试!"
                         }) : View("TempDeny");
+
                     default:
                         LogManager.Error($"异常源:{feature.Error.Source},异常类型:{feature.Error.GetType().Name},请求路径({Request.Method}):{Request.Scheme}://{Request.Host}{HttpUtility.UrlDecode(feature.Path)}{Request.QueryString} ,客户端用户代理:{Request.Headers[HeaderNames.UserAgent]},客户端IP:{ip},请求参数:\n{await GetRequestBody(Request)}\n堆栈信息:", feature.Error);
                         break;
@@ -104,7 +109,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             }
 
             Response.StatusCode = 503;
-            return accept.StartsWith("application/json") || Request.Method == HttpMethods.Post ? Json(new
+            return Request.HasJsonContentType() || Request.Method == HttpMethods.Post ? Json(new
             {
                 StatusCode = 503,
                 Success = false,
@@ -196,7 +201,6 @@ namespace Masuit.MyBlogs.Core.Controllers
             BackgroundJob.Enqueue(() => CommonHelper.SendMail(Request.Host + "博客访问验证码", $"{Request.Host}本次验证码是:<span style='color:red'>{token}</span>,有效期为24h,请按时使用!", email, HttpContext.Connection.RemoteIpAddress.ToString()));
             RedisHelper.Set("get:" + email, token, 120);
             return ResultData(null);
-
         }
 
         /// <summary>
@@ -216,4 +220,4 @@ namespace Masuit.MyBlogs.Core.Controllers
             });
         }
     }
-}
+}

+ 49 - 36
src/Masuit.MyBlogs.Core/Extensions/Firewall/FirewallAttribute.cs

@@ -19,14 +19,13 @@ using HeaderNames = Microsoft.Net.Http.Headers.HeaderNames;
 
 namespace Masuit.MyBlogs.Core.Extensions.Firewall
 {
-    public class FirewallAttribute : ActionFilterAttribute
+    public class FirewallAttribute : IAsyncActionFilter
     {
         public ICacheManager<int> CacheManager { get; set; }
 
         public IFirewallRepoter FirewallRepoter { get; set; }
 
-        /// <inheritdoc />
-        public override void OnActionExecuting(ActionExecutingContext context)
+        public Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
         {
             var request = context.HttpContext.Request;
             var ip = context.HttpContext.Connection.RemoteIpAddress.ToString();
@@ -37,13 +36,13 @@ namespace Masuit.MyBlogs.Core.Extensions.Firewall
             {
                 AccessDeny(ip, request, "黑名单IP地址");
                 context.Result = new BadRequestObjectResult("您当前所在的网络环境不支持访问本站!");
-                return;
+                return Task.CompletedTask;
             }
 
             //bypass
             if (CommonHelper.SystemSettings.GetOrAdd("FirewallEnabled", "true") == "false" || context.ActionDescriptor.EndpointMetadata.Any(o => o is MyAuthorizeAttribute or AllowAccessFirewallAttribute) || tokenValid)
             {
-                return;
+                return next();
             }
 
             //UserAgent
@@ -60,13 +59,13 @@ namespace Masuit.MyBlogs.Core.Extensions.Firewall
                     ContentType = ContentType.Html + "; charset=utf-8",
                     StatusCode = 403
                 };
-                return;
+                return Task.CompletedTask;
             }
 
             //搜索引擎
             if (Regex.IsMatch(request.Method, "OPTIONS|HEAD", RegexOptions.IgnoreCase) || request.IsRobot())
             {
-                return;
+                return next();
             }
 
             // 反爬虫
@@ -78,7 +77,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Firewall
                     StatusCode = 429,
                     Content = "检测到访问异常,请在10分钟后再试!"
                 };
-                return;
+                return Task.CompletedTask;
             }
 
             //安全模式
@@ -97,7 +96,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Firewall
             var allowedAreas = CommonHelper.SystemSettings.GetOrAdd("AllowedArea", "").Split(new[] { ',', ',' }, StringSplitOptions.RemoveEmptyEntries);
             if (allowedAreas.Any() && pos.Contains(allowedAreas))
             {
-                return;
+                return next();
             }
 
             //黑名单地区
@@ -111,34 +110,10 @@ namespace Masuit.MyBlogs.Core.Extensions.Firewall
                 }
             }
 
-            Challenge(context, request);//挑战模式
-            ThrottleLimit(ip, request);//限流
-        }
-
-        private void ThrottleLimit(string ip, HttpRequest request)
-        {
-            var times = CacheManager.AddOrUpdate("Frequency:" + ip, 1, i => i + 1, 5);
-            CacheManager.Expire("Frequency:" + ip, ExpirationMode.Absolute, TimeSpan.FromSeconds(CommonHelper.SystemSettings.GetOrAdd("LimitIPFrequency", "60").ToInt32()));
-            var limit = CommonHelper.SystemSettings.GetOrAdd("LimitIPRequestTimes", "90").ToInt32();
-            if (times <= limit)
-            {
-                return;
-            }
-
-            if (times > limit * 1.2)
-            {
-                CacheManager.Expire("Frequency:" + ip, TimeSpan.FromMinutes(CommonHelper.SystemSettings.GetOrAdd("BanIPTimespan", "10").ToInt32()));
-                AccessDeny(ip, request, "访问频次限制");
-            }
-
-            throw new TempDenyException("访问频次限制");
-        }
-
-        private static void Challenge(ActionExecutingContext context, HttpRequest request)
-        {
+            //挑战模式
             if (context.HttpContext.Session.TryGetValue("js-challenge", out _) || request.Path.ToUriComponent().Contains("."))
             {
-                return;
+                return next();
             }
 
             try
@@ -146,7 +121,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Firewall
                 if (request.Cookies.TryGetValue(SessionKey.ChallengeBypass, out var time) && time.AESDecrypt(AppConfig.BaiduAK).ToDateTime() > DateTime.Now)
                 {
                     context.HttpContext.Session.Set("js-challenge", 1);
-                    return;
+                    return next();
                 }
             }
             catch
@@ -154,6 +129,17 @@ namespace Masuit.MyBlogs.Core.Extensions.Firewall
                 context.HttpContext.Response.Cookies.Delete(SessionKey.ChallengeBypass);
             }
 
+            if (Challenge(context, out var completedTask))
+            {
+                return completedTask;
+            }
+
+            //限流
+            return ThrottleLimit(ip, request, next);
+        }
+
+        private static bool Challenge(ActionExecutingContext context, out Task completedTask)
+        {
             var mode = CommonHelper.SystemSettings.GetOrAdd(SessionKey.ChallengeMode, "");
             if (mode == SessionKey.JSChallenge)
             {
@@ -161,6 +147,8 @@ namespace Masuit.MyBlogs.Core.Extensions.Firewall
                 {
                     ViewName = "/Views/Shared/JSChallenge.cshtml"
                 };
+                completedTask = Task.CompletedTask;
+                return true;
             }
 
             if (mode == SessionKey.CaptchaChallenge)
@@ -169,7 +157,32 @@ namespace Masuit.MyBlogs.Core.Extensions.Firewall
                 {
                     ViewName = "/Views/Shared/CaptchaChallenge.cshtml"
                 };
+                completedTask = Task.CompletedTask;
+                return true;
             }
+
+            completedTask = Task.CompletedTask;
+            return false;
+        }
+
+        private Task ThrottleLimit(string ip, HttpRequest request, ActionExecutionDelegate next)
+        {
+            var times = CacheManager.AddOrUpdate("Frequency:" + ip, 1, i => i + 1, 5);
+            CacheManager.Expire("Frequency:" + ip, ExpirationMode.Absolute, TimeSpan.FromSeconds(CommonHelper.SystemSettings.GetOrAdd("LimitIPFrequency", "60").ToInt32()));
+            var limit = CommonHelper.SystemSettings.GetOrAdd("LimitIPRequestTimes", "90").ToInt32();
+            if (times <= limit)
+            {
+                return next();
+            }
+
+            if (times > limit * 1.2)
+            {
+                CacheManager.Expire("Frequency:" + ip, TimeSpan.FromMinutes(CommonHelper.SystemSettings.GetOrAdd("BanIPTimespan", "10").ToInt32()));
+                AccessDeny(ip, request, "访问频次限制");
+                throw new TempDenyException("访问频次限制");
+            }
+
+            return next();
         }
 
         private async void AccessDeny(string ip, HttpRequest request, string remark)

+ 60 - 55
src/Masuit.MyBlogs.Core/Extensions/Hangfire/HangfireBackJob.cs

@@ -7,27 +7,18 @@ using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.Tools;
 using Masuit.Tools.Strings;
+using Masuit.Tools.Systems;
 
 namespace Masuit.MyBlogs.Core.Extensions.Hangfire
 {
     /// <summary>
     /// hangfire后台任务
     /// </summary>
-    public class HangfireBackJob : IHangfireBackJob
+    public class HangfireBackJob : Disposable, IHangfireBackJob
     {
-        private readonly IUserInfoService _userInfoService;
-        private readonly IPostService _postService;
-        private readonly ISystemSettingService _settingService;
-        private readonly ISearchDetailsService _searchDetailsService;
-        private readonly ILinksService _linksService;
-        private readonly ILinkLoopbackService _loopbackService;
         private readonly IHttpClientFactory _httpClientFactory;
         private readonly IWebHostEnvironment _hostEnvironment;
-        private readonly ISearchEngine<DataContext> _searchEngine;
-        private readonly IAdvertisementService _advertisementService;
-        private readonly INoticeService _noticeService;
-        private readonly IPostVisitRecordService _recordService;
-        private readonly IPostVisitRecordStatsService _recordStatsService;
+        private readonly IServiceScope _serviceScope;
 
         /// <summary>
         /// hangfire后台任务
@@ -36,18 +27,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         {
             _httpClientFactory = httpClientFactory;
             _hostEnvironment = hostEnvironment;
-            var scope = serviceProvider.CreateScope();
-            _userInfoService = scope.ServiceProvider.GetRequiredService<IUserInfoService>();
-            _postService = scope.ServiceProvider.GetRequiredService<IPostService>();
-            _settingService = scope.ServiceProvider.GetRequiredService<ISystemSettingService>();
-            _searchDetailsService = scope.ServiceProvider.GetRequiredService<ISearchDetailsService>();
-            _linksService = scope.ServiceProvider.GetRequiredService<ILinksService>();
-            _searchEngine = scope.ServiceProvider.GetRequiredService<ISearchEngine<DataContext>>();
-            _advertisementService = scope.ServiceProvider.GetRequiredService<IAdvertisementService>();
-            _noticeService = scope.ServiceProvider.GetRequiredService<INoticeService>();
-            _loopbackService = scope.ServiceProvider.GetRequiredService<ILinkLoopbackService>();
-            _recordService = scope.ServiceProvider.GetRequiredService<IPostVisitRecordService>();
-            _recordStatsService = scope.ServiceProvider.GetRequiredService<IPostVisitRecordStatsService>();
+            _serviceScope = serviceProvider.CreateScope();
         }
 
         /// <summary>
@@ -65,15 +45,17 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
                 LoginType = type,
                 PhysicAddress = ip.GetIPLocation()
             };
-            var u = _userInfoService.GetByUsername(userInfo.Username);
+            var userInfoService = _serviceScope.ServiceProvider.GetRequiredService<IUserInfoService>();
+            var settingService = _serviceScope.ServiceProvider.GetRequiredService<ISystemSettingService>();
+            var u = userInfoService.GetByUsername(userInfo.Username);
             u.LoginRecord.Add(record);
-            _userInfoService.SaveChanges();
+            userInfoService.SaveChanges();
             var content = new Template(File.ReadAllText(Path.Combine(_hostEnvironment.WebRootPath, "template", "login.html")))
                 .Set("name", u.Username)
                 .Set("time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
                 .Set("ip", record.IP)
                 .Set("address", record.PhysicAddress).Render();
-            CommonHelper.SendMail(_settingService.Get(s => s.Name.Equals("Title")).Value + "账号登录通知", content, _settingService.Get(s => s.Name.Equals("ReceiveEmail")).Value, "127.0.0.1");
+            CommonHelper.SendMail(settingService.Get(s => s.Name.Equals("Title")).Value + "账号登录通知", content, settingService.Get(s => s.Name.Equals("ReceiveEmail")).Value, "127.0.0.1");
         }
 
         /// <summary>
@@ -85,17 +67,18 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
             p.Status = Status.Published;
             p.PostDate = DateTime.Now;
             p.ModifyDate = DateTime.Now;
-            var post = _postService.GetById(p.Id);
+            var postService = _serviceScope.ServiceProvider.GetRequiredService<IPostService>();
+            var post = postService.GetById(p.Id);
             if (post is null)
             {
-                _postService.AddEntitySaved(p);
+                postService.AddEntitySaved(p);
             }
             else
             {
                 post.Status = Status.Published;
                 post.PostDate = DateTime.Now;
                 post.ModifyDate = DateTime.Now;
-                _postService.SaveChanges();
+                postService.SaveChanges();
             }
         }
 
@@ -110,17 +93,20 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         {
             var lastQuarter = DateTime.Now.AddMonths(-3);
             var lastYear = DateTime.Now.AddYears(-1);
-            _recordService.GetQuery(b => b.Time < lastQuarter).DeleteFromQuery();
-            _recordStatsService.GetQuery(b => b.Date < lastYear).DeleteFromQuery();
-            var post = _postService.GetById(pid);
+            var recordService = _serviceScope.ServiceProvider.GetRequiredService<IPostVisitRecordService>();
+            var recordStatsService = _serviceScope.ServiceProvider.GetRequiredService<IPostVisitRecordStatsService>();
+            var postService = _serviceScope.ServiceProvider.GetRequiredService<IPostService>();
+            recordService.GetQuery(b => b.Time < lastQuarter).DeleteFromQuery();
+            recordStatsService.GetQuery(b => b.Date < lastYear).DeleteFromQuery();
+            var post = postService.GetById(pid);
             if (post == null)
             {
                 return;
             }
 
             post.TotalViewCount += 1;
-            post.AverageViewCount = _recordService.GetQuery(e => e.PostId == pid).GroupBy(r => r.Time.Date).Select(g => g.Count()).DefaultIfEmpty().Average();
-            _recordService.AddEntity(new PostVisitRecord()
+            post.AverageViewCount = recordService.GetQuery(e => e.PostId == pid).GroupBy(r => r.Time.Date).Select(g => g.Count()).DefaultIfEmpty().Average();
+            recordService.AddEntity(new PostVisitRecord()
             {
                 IP = ip,
                 Referer = refer,
@@ -129,14 +115,14 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
                 RequestUrl = url,
                 PostId = pid
             });
-            var stats = _recordStatsService.Get(e => e.PostId == pid && e.Date >= DateTime.Today);
+            var stats = recordStatsService.Get(e => e.PostId == pid && e.Date >= DateTime.Today);
             if (stats != null)
             {
                 stats.Count++;
             }
             else
             {
-                _recordStatsService.AddEntity(new PostVisitRecordStats()
+                recordStatsService.AddEntity(new PostVisitRecordStats()
                 {
                     Count = 1,
                     Date = DateTime.Today,
@@ -144,7 +130,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
                 });
             }
 
-            _postService.SaveChanges();
+            postService.SaveChanges();
         }
 
         /// <summary>
@@ -154,19 +140,22 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         {
             CommonHelper.IPErrorTimes.RemoveWhere(kv => kv.Value < 100); //将访客访问出错次数少于100的移开
             DateTime time = DateTime.Now.AddMonths(-1);
-            _searchDetailsService.DeleteEntitySaved(s => s.SearchTime < time);
+            var searchDetailsService = _serviceScope.ServiceProvider.GetRequiredService<ISearchDetailsService>();
+            var advertisementService = _serviceScope.ServiceProvider.GetRequiredService<IAdvertisementService>();
+            var noticeService = _serviceScope.ServiceProvider.GetRequiredService<INoticeService>();
+            searchDetailsService.DeleteEntitySaved(s => s.SearchTime < time);
             TrackData.DumpLog();
-            _advertisementService.GetQuery(a => DateTime.Now >= a.ExpireTime).UpdateFromQuery(a => new Advertisement()
+            advertisementService.GetQuery(a => DateTime.Now >= a.ExpireTime).UpdateFromQuery(a => new Advertisement()
             {
                 Status = Status.Unavailable
             });
-            _noticeService.GetQuery(n => n.NoticeStatus == NoticeStatus.UnStart && n.StartTime < DateTime.Now).UpdateFromQuery(n => new Notice()
+            noticeService.GetQuery(n => n.NoticeStatus == NoticeStatus.UnStart && n.StartTime < DateTime.Now).UpdateFromQuery(n => new Notice()
             {
                 NoticeStatus = NoticeStatus.Normal,
                 PostDate = DateTime.Now,
                 ModifyDate = DateTime.Now
             });
-            _noticeService.GetQuery(n => n.NoticeStatus == NoticeStatus.Normal && n.EndTime < DateTime.Now).UpdateFromQuery(n => new Notice()
+            noticeService.GetQuery(n => n.NoticeStatus == NoticeStatus.Normal && n.EndTime < DateTime.Now).UpdateFromQuery(n => new Notice()
             {
                 NoticeStatus = NoticeStatus.Expired,
                 ModifyDate = DateTime.Now
@@ -178,7 +167,8 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         /// </summary>
         public void EverymonthJob()
         {
-            _advertisementService.GetAll().UpdateFromQuery(a => new Advertisement()
+            var advertisementService = _serviceScope.ServiceProvider.GetRequiredService<IAdvertisementService>();
+            advertisementService.GetAll().UpdateFromQuery(a => new Advertisement()
             {
                 DisplayCount = 0
             });
@@ -196,7 +186,8 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
             client.DefaultRequestHeaders.Add("X-Real-IP", "1.1.1.1");
             client.DefaultRequestHeaders.Referrer = new Uri("https://google.com");
             client.Timeout = TimeSpan.FromSeconds(10);
-            _linksService.GetQuery(l => !l.Except).AsParallel().ForAll(link =>
+            var linksService = _serviceScope.ServiceProvider.GetRequiredService<ILinksService>();
+            linksService.GetQuery(l => !l.Except).AsParallel().ForAll(link =>
             {
                 var prev = link.Status;
                 client.GetStringAsync(link.Url, new CancellationTokenSource(client.Timeout).Token).ContinueWith(t =>
@@ -216,7 +207,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
                     }
                 }).Wait();
             });
-            _linksService.SaveChanges();
+            linksService.SaveChanges();
         }
 
         /// <summary>
@@ -226,7 +217,9 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         /// <param name="ip"></param>
         public void UpdateLinkWeight(string referer, string ip)
         {
-            var list = _linksService.GetQuery(l => referer.Contains(l.UrlBase)).ToList();
+            var linksService = _serviceScope.ServiceProvider.GetRequiredService<ILinksService>();
+            var loopbackService = _serviceScope.ServiceProvider.GetRequiredService<ILinkLoopbackService>();
+            var list = linksService.GetQuery(l => referer.Contains(l.UrlBase)).ToList();
             foreach (var link in list)
             {
                 link.Loopbacks.Add(new LinkLoopback()
@@ -237,8 +230,8 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
                 });
             }
             var time = DateTime.Now.AddMonths(-1);
-            _loopbackService.GetQuery(b => b.Time < time).DeleteFromQuery();
-            _linksService.SaveChanges();
+            loopbackService.GetQuery(b => b.Time < time).DeleteFromQuery();
+            linksService.SaveChanges();
         }
 
         /// <summary>
@@ -246,13 +239,15 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         /// </summary>
         public void CreateLuceneIndex()
         {
-            _searchEngine.LuceneIndexer.DeleteAll();
-            _searchEngine.CreateIndex(new List<string>()
+            var searchEngine = _serviceScope.ServiceProvider.GetRequiredService<ISearchEngine<DataContext>>();
+            var postService = _serviceScope.ServiceProvider.GetRequiredService<IPostService>();
+            searchEngine.LuceneIndexer.DeleteAll();
+            searchEngine.CreateIndex(new List<string>()
             {
                 nameof(DataContext.Post),
             });
-            var list = _postService.GetQuery(i => i.Status != Status.Published).ToList();
-            _searchEngine.LuceneIndexer.Delete(list);
+            var list = postService.GetQuery(i => i.Status != Status.Published).ToList();
+            searchEngine.LuceneIndexer.Delete(list);
         }
 
         /// <summary>
@@ -260,9 +255,19 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         /// </summary>
         public void StatisticsSearchKeywords()
         {
-            RedisHelper.Set("SearchRank:Month", _searchDetailsService.GetRanks(DateTime.Today.AddMonths(-1)));
-            RedisHelper.Set("SearchRank:Week", _searchDetailsService.GetRanks(DateTime.Today.AddDays(-7)));
-            RedisHelper.Set("SearchRank:Today", _searchDetailsService.GetRanks(DateTime.Today));
+            var searchDetailsService = _serviceScope.ServiceProvider.GetRequiredService<ISearchDetailsService>();
+            RedisHelper.Set("SearchRank:Month", searchDetailsService.GetRanks(DateTime.Today.AddMonths(-1)));
+            RedisHelper.Set("SearchRank:Week", searchDetailsService.GetRanks(DateTime.Today.AddDays(-7)));
+            RedisHelper.Set("SearchRank:Today", searchDetailsService.GetRanks(DateTime.Today));
+        }
+
+        /// <summary>
+        /// 释放
+        /// </summary>
+        /// <param name="disposing"></param>
+        public override void Dispose(bool disposing)
+        {
+            _serviceScope.Dispose();
         }
     }
 }

+ 2 - 2
src/Masuit.MyBlogs.Core/Extensions/MiddlewareExtension.cs

@@ -178,7 +178,7 @@ namespace Masuit.MyBlogs.Core.Extensions
         }
     }
 
-    public class ExceptionFilter : IExceptionFilter, IFilterMetadata
+    public class ExceptionFilter : IExceptionFilter
     {
         public void OnException(ExceptionContext context)
         {
@@ -189,7 +189,7 @@ namespace Masuit.MyBlogs.Core.Extensions
                 context.Result = true switch
                 {
                     _ when accept.StartsWith("image") => new VirtualFileResult("/Assets/images/404/4044.jpg", ContentType.Jpeg),
-                    _ when accept.StartsWith("application/json") || context.HttpContext.Request.Method == HttpMethods.Post => new JsonResult(new
+                    _ when context.HttpContext.Request.HasJsonContentType() || context.HttpContext.Request.Method == HttpMethods.Post => new JsonResult(new
                     {
                         StatusCode = 404,
                         Success = false,

+ 1 - 1
src/Masuit.MyBlogs.Core/Masuit.MyBlogs.Core.csproj

@@ -66,7 +66,7 @@
         <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.15" />
         <PackageReference Include="TimeZoneConverter" Version="5.0.0" />
         <PackageReference Include="WilderMinds.RssSyndication" Version="1.7.0" />
-        <PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="6.13.9" />
+        <PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="6.13.10" />
     </ItemGroup>
     <ItemGroup>
         <Content Update="appsettings.json">

+ 0 - 1
src/Masuit.MyBlogs.Core/Startup.cs

@@ -21,7 +21,6 @@ using Masuit.Tools.Config;
 using Masuit.Tools.Core.AspNetCore;
 using Masuit.Tools.Core.Net;
 using Microsoft.EntityFrameworkCore;
-using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Primitives;
 using Polly;
 using System.Net;

+ 1 - 1
src/Masuit.MyBlogs.Core/Views/Home/Index.cshtml

@@ -61,7 +61,7 @@
         <a asp-controller="Notice" asp-action="Details" asp-route-id="@(Model.Notices.FirstOrDefault()?.Id)">
             <h3 class="size18 text-red text-center">网站最新公告</h3>
         </a>
-        @Html.Raw(Model.Notices[0].Content.Replace("img src=", $"img title='{CommonHelper.SystemSettings["Title"]}' alt='{CommonHelper.SystemSettings["Title"]}' data-original="))
+        @Html.Raw(Model.Notices[0].Content.Replace("img src=", $"img class='lazyload' title='{CommonHelper.SystemSettings["Title"]}' alt='{CommonHelper.SystemSettings["Title"]}' loading='lazy' data-src="))
     </div>
 }
 @if (shares.Any())

+ 1 - 1
src/Masuit.MyBlogs.Core/Views/Shared/_ArticleListItem.cshtml

@@ -31,7 +31,7 @@
                 if (!string.IsNullOrEmpty(imgSrc))
                 {
                     <div class="col-md-2 paddingright-clear hidden-xs">
-                        <img class="img-thumbnail img-responsive thumb" data-original="@imgSrc" alt="@CommonHelper.SystemSettings["Title"]" title="@CommonHelper.SystemSettings["Title"] ">
+                        <img class="img-thumbnail img-responsive thumb lazyload" loading="lazy" data-src="@imgSrc" alt="@CommonHelper.SystemSettings["Title"]" title="@CommonHelper.SystemSettings["Title"] ">
                     </div>
                 }
             }

+ 1 - 1
src/Masuit.MyBlogs.Core/Views/Shared/_ArticleListItem_Admin.cshtml

@@ -32,7 +32,7 @@
                 if (!string.IsNullOrEmpty(imgSrc))
                 {
                     <div class="col-sm-2 paddingright-clear hidden-xs">
-                        <img class="img-thumbnail img-responsive thumb" data-original="@imgSrc" alt="@Model.Title">
+                        <img class="img-thumbnail img-responsive thumb lazyload" loading="lazy" data-src="@imgSrc" alt="@Model.Title">
                     </div>
                 }
             }

+ 1 - 1
src/Masuit.MyBlogs.Core/Views/Shared/_Layout.cshtml

@@ -53,9 +53,9 @@
     <script src="https://cdn.staticfile.org/jquery.form/4.2.2/jquery.form.min.js" async defer></script>
     <script src="https://cdn.staticfile.org/jqueryui/1.9.2/jquery.ui.widget.min.js"></script>
     <script src="https://cdn.staticfile.org/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
+    <script src="https://cdn.staticfile.org/lazysizes/5.3.2/lazysizes.min.js" async></script>
     <script src="~/Scripts/layer/layer.js"></script>
     <script src="~/Assets/layui/layui.js"></script>
-    <script src="~/Assets/lazyload.min.js"></script>
     <environment names="Development">
         <script src="~/Scripts/jquery.query.js"></script>
         <script src="~/Scripts/jquery.paging.js"></script>

File diff suppressed because it is too large
+ 0 - 7
src/Masuit.MyBlogs.Core/wwwroot/Assets/lazyload.min.js


+ 2 - 8
src/Masuit.MyBlogs.Core/wwwroot/Scripts/global/scripts.js

@@ -15,6 +15,7 @@
 		return o;
 	}
 })(jQuery);
+
 $(function() {
 	$('.header').css({
 	   'filter': 'unset',
@@ -25,14 +26,7 @@ $(function() {
 	   "transition": "all 1s ease-in-out"
 	});
 	loadingDone();
-
-	$("img").lazyload({
-		effect: "fadeIn", //渐现,show(直接显示),fadeIn(淡入),slideDown(下拉)
-		threshold: 2700, //预加载,在图片距离屏幕180px时提前载入
-		//event: 'click',  // 事件触发时才加载,click(点击),mouseover(鼠标划过),sporty(运动的),默认为scroll(滑动)
-		//container: $("#container"), // 指定对某容器中的图片实现效果
-		failure_limit: 10 //加载2张可见区域外的图片,lazyload默认在找到第一张不在可见区域里的图片时则不再继续加载,但当HTML容器混乱的时候可能出现可见区域内图片并没加载出来的情况
-	});
+	
 	$(".notices").bootstrapNews({
 		newsPerPage: 4,
 		autoplay: true,

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/template/about.html

@@ -1,6 +1,6 @@
 <div class="row" style="font-size: 18px;line-height: 24px;">
     <div class="col-md-2">
-        <img data-original="https://git.imweb.io/ldqk/imgbed/raw/master/20190606/5dc7fc1266bfd8109d1ef5e0e7630f2c_2_3_art.png" alt="懒得勤快" class="img-responsive img-thumbnail" style="width: 100%" />
+        <img src="https://git.imweb.io/ldqk/imgbed/raw/master/20190606/5dc7fc1266bfd8109d1ef5e0e7630f2c_2_3_art.png" alt="懒得勤快" class="img-responsive img-thumbnail" style="width: 100%" />
     </div>
     <div class="col-md-10">
         <table class="table-responsive table-condensed">

Some files were not shown because too many files changed in this diff