懒得勤快 4 years ago
parent
commit
a487343e0a

+ 21 - 3
src/Masuit.MyBlogs.Core/Controllers/AdvertisementController.cs

@@ -67,7 +67,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         }
 
         /// <summary>
-        /// 保存banner
+        /// 保存广告
         /// </summary>
         /// <param name="model"></param>
         /// <returns></returns>
@@ -96,7 +96,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         }
 
         /// <summary>
-        /// 删除banner
+        /// 删除广告
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
@@ -109,7 +109,7 @@ namespace Masuit.MyBlogs.Core.Controllers
 
 
         /// <summary>
-        /// 禁用或开启文章评论
+        /// 广告上下架
         /// </summary>
         /// <param name="id">文章id</param>
         /// <returns></returns>
@@ -120,5 +120,23 @@ namespace Masuit.MyBlogs.Core.Controllers
             ad.Status = ad.Status == Status.Available ? Status.Unavailable : Status.Available;
             return ResultData(null, await AdsService.SaveChangesAsync() > 0, ad.Status == Status.Available ? $"【{ad.Title}】已上架!" : $"【{ad.Title}】已下架!");
         }
+
+        /// <summary>
+        /// 随机前往一个广告
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("/partner-random")]
+        public async Task<ActionResult> RandomGo()
+        {
+            var ad = AdsService.GetByWeightedPrice((AdvertiseType)new Random().Next(1, 4), Request.Location());
+            if (!HttpContext.Request.IsRobot() && string.IsNullOrEmpty(HttpContext.Session.Get<string>("ads" + ad.Id)))
+            {
+                HttpContext.Session.Set("ads" + ad.Id, ad.Id.ToString());
+                ad.ViewCount++;
+                await AdsService.SaveChangesAsync();
+            }
+
+            return Redirect(ad.Url);
+        }
     }
 }

+ 14 - 4
src/Masuit.MyBlogs.Core/Controllers/FirewallController.cs

@@ -1,4 +1,5 @@
-using Masuit.Tools.AspNetCore.Mime;
+using Masuit.MyBlogs.Core.Extensions;
+using Masuit.Tools.AspNetCore.Mime;
 using Masuit.Tools.AspNetCore.ResumeFileResults.Extensions;
 using Masuit.Tools.Core.Net;
 using Masuit.Tools.Security;
@@ -19,10 +20,15 @@ namespace Masuit.MyBlogs.Core.Controllers
         [HttpPost("/challenge"), AutoValidateAntiforgeryToken]
         public ActionResult JsChallenge(string token)
         {
+            if (string.IsNullOrEmpty(token) || token.Length < 20)
+            {
+                return BadRequest("请求token无效");
+            }
+
             try
             {
-                var privateKey = HttpContext.Session.Get<string>("challenge-private-key");
-                var crypto = HttpContext.Session.Get<string>("challenge-value");
+                var privateKey = HttpContext.Session.Get<string>("challenge-private-key") ?? throw new NotFoundException("请求私钥无效");
+                var crypto = HttpContext.Session.Get<string>("challenge-value") ?? throw new NotFoundException("请求私钥无效");
                 if (token.RSADecrypt(privateKey) == crypto)
                 {
                     HttpContext.Session.Set("js-challenge", 1);
@@ -47,6 +53,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         [HttpPost("/captcha"), AutoValidateAntiforgeryToken]
         public ActionResult CaptchaChallenge(string code)
         {
+            if (string.IsNullOrEmpty(code) || code.Length < 4)
+            {
+                return BadRequest("验证码无效");
+            }
+
             if (code.Equals(HttpContext.Session.Get<string>("challenge-captcha"), StringComparison.CurrentCultureIgnoreCase))
             {
                 HttpContext.Session.Set("js-challenge", 1);
@@ -69,6 +80,5 @@ namespace Masuit.MyBlogs.Core.Controllers
             var buffer = HttpContext.CreateValidateGraphic(code);
             return this.ResumeFile(buffer, ContentType.Jpeg, "验证码.jpg");
         }
-
     }
 }

+ 8 - 4
src/Masuit.MyBlogs.Core/Controllers/HomeController.cs

@@ -92,9 +92,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var viewModel = await GetIndexPageViewModel();
             var postsQuery = PostService.GetQuery(PostBaseWhere().And(p => p.Status == Status.Published)); //准备文章的查询
+            var h24 = DateTime.Now.AddDays(-1);
             var posts = orderBy switch
             {
-                OrderBy.Trending => await postsQuery.Where(p => !p.IsFixedTop).OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= DateTime.Today)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+                OrderBy.Trending => await postsQuery.Where(p => !p.IsFixedTop).OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= h24)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
                 _ => await postsQuery.Where(p => !p.IsFixedTop).OrderBy((orderBy ?? OrderBy.ModifyDate).GetDisplay() + " desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
             };
             if (page == 1)
@@ -127,9 +128,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             Expression<Func<Post, bool>> where = PostBaseWhere().And(p => p.Status == Status.Published);
             var queryable = PostService.GetQuery(tag.Split(",", StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).Aggregate(@where, (current, s) => current.And(p => Regex.IsMatch(p.Label, s))));
+            var h24 = DateTime.Now.AddDays(-1);
             var posts = orderBy switch
             {
-                OrderBy.Trending => await queryable.OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= DateTime.Today)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+                OrderBy.Trending => await queryable.OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= h24)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
                 _ => await queryable.OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
             };
             var viewModel = await GetIndexPageViewModel();
@@ -159,9 +161,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             Expression<Func<Post, bool>> where = p => p.Author.Equals(author) || p.Modifier.Equals(author) || p.Email.Equals(author) || p.PostHistoryVersion.Any(v => v.Modifier.Equals(author) || v.ModifierEmail.Equals(author));
             where = where.And(p => p.Status == Status.Published).And(PostBaseWhere());
+            var h24 = DateTime.Now.AddDays(-1);
             var posts = orderBy switch
             {
-                OrderBy.Trending => await PostService.GetQuery(where).OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= DateTime.Today)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+                OrderBy.Trending => await PostService.GetQuery(where).OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= h24)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
                 _ => await PostService.GetQuery(where).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
             };
             var viewModel = await GetIndexPageViewModel();
@@ -190,9 +193,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Category(int id, [Optional] OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
             var cat = await CategoryService.GetByIdAsync(id) ?? throw new NotFoundException("文章分类未找到");
+            var h24 = DateTime.Now.AddDays(-1);
             var posts = orderBy switch
             {
-                OrderBy.Trending => await PostService.GetQuery(PostBaseWhere().And(p => p.CategoryId == cat.Id && p.Status == Status.Published)).OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= DateTime.Today)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+                OrderBy.Trending => await PostService.GetQuery(PostBaseWhere().And(p => p.CategoryId == cat.Id && p.Status == Status.Published)).OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= h24)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
                 _ => await PostService.GetQuery(PostBaseWhere().And(p => p.CategoryId == cat.Id && p.Status == Status.Published)).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
             };
             var viewModel = await GetIndexPageViewModel();

+ 3 - 2
src/Masuit.MyBlogs.Core/Controllers/PostController.cs

@@ -1015,11 +1015,12 @@ namespace Masuit.MyBlogs.Core.Controllers
                 Title = p.Title,
                 ViewCount = (int)p.AverageViewCount
             }).Cacheable().ToListAsync();
-            var trending = await postsQuery.OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= DateTime.Today)).Take(10).Select(p => new PostModelBase()
+            var h24 = DateTime.Now.AddDays(-1);
+            var trending = await postsQuery.OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= h24)).Take(10).Select(p => new PostModelBase()
             {
                 Id = p.Id,
                 Title = p.Title,
-                ViewCount = p.PostVisitRecords.Count(e => e.Time >= DateTime.Today)
+                ViewCount = p.PostVisitRecords.Count(e => e.Time >= h24)
             }).Cacheable().ToListAsync();
             return ResultData(new
             {

+ 2 - 1
src/Masuit.MyBlogs.Core/Controllers/SeminarController.cs

@@ -47,9 +47,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         public async Task<ActionResult> Index(int id, [Optional] OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
             var s = await SeminarService.GetByIdAsync(id) ?? throw new NotFoundException("专题未找到");
+            var h24 = DateTime.Now.AddDays(-1);
             var posts = orderBy switch
             {
-                OrderBy.Trending => await PostService.GetQuery(PostBaseWhere().And(p => p.Seminar.Any(x => x.Id == id) && p.Status == Status.Published)).OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= DateTime.Today)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
+                OrderBy.Trending => await PostService.GetQuery(PostBaseWhere().And(p => p.Seminar.Any(x => x.Id == id) && p.Status == Status.Published)).OrderByDescending(p => p.PostVisitRecords.Count(e => e.Time >= h24)).ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig),
                 _ => await PostService.GetQuery(PostBaseWhere().And(p => p.Seminar.Any(x => x.Id == id) && p.Status == Status.Published)).OrderBy($"{nameof(Post.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedListAsync<Post, PostDto>(page, size, MapperConfig)
             };
             ViewBag.Id = s.Id;

+ 3 - 1
src/Masuit.MyBlogs.Core/Infrastructure/Services/AdvertisementService.cs

@@ -17,6 +17,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
     public partial class AdvertisementService : BaseService<Advertisement>, IAdvertisementService
     {
         public ICacheManager<List<Advertisement>> CacheManager { get; set; }
+        public ICategoryRepository CategoryRepository { get; set; }
 
         public AdvertisementService(IBaseRepository<Advertisement> repository, ISearchEngine<DataContext> searchEngine, ILuceneIndexSearcher searcher) : base(repository, searchEngine, searcher)
         {
@@ -46,6 +47,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             {
                 var atype = type.ToString("D");
                 Expression<Func<Advertisement, bool>> where = a => a.Types.Contains(atype) && a.Status == Status.Available;
+                var catCount = CategoryRepository.Count(_ => true);
                 where = where.And(a => a.RegionMode == RegionLimitMode.All || (a.RegionMode == RegionLimitMode.AllowRegion ? Regex.IsMatch(location, a.Regions) : !Regex.IsMatch(location, a.Regions)));
                 if (cid.HasValue)
                 {
@@ -56,7 +58,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
                     }
                 }
 
-                var list = GetQuery(where).OrderBy(a => -Math.Log(DataContext.Random()) / ((double)a.Price / a.Types.Length) * (string.IsNullOrEmpty(a.CategoryIds) ? 5 : 1)).Take(count).ToList();
+                var list = GetQuery(where).OrderBy(a => -Math.Log(DataContext.Random()) / ((double)a.Price / a.Types.Length * catCount / (string.IsNullOrEmpty(a.CategoryIds) ? catCount : (a.CategoryIds.Length + 1)))).Take(count).ToList();
                 var ids = list.Select(a => a.Id).ToArray();
                 GetQuery(a => ids.Contains(a.Id)).UpdateFromQuery(a => new Advertisement()
                 {

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

@@ -1,4 +1,5 @@
 @using Masuit.MyBlogs.Core.Common
+@using System.Diagnostics
 
 @{
     Layout = null;
@@ -17,7 +18,7 @@
 </head>
 <body>
     <h3>继续访问请输入验证码:</h3>
-    <img src="/challenge-captcha.jpg" onclick="this.src='/challenge-captcha.jpg?'+new Date" />
+    <img src="/challenge-captcha.jpg[email protected]()" onclick="this.src='/challenge-captcha.jpg?'+new Date" />
     <form asp-action="CaptchaChallenge" asp-controller="Firewall" method="post">
         @Html.AntiForgeryToken()
         <input type="text" name="code" placeholder="验证码" required="" />

+ 42 - 20
src/Masuit.MyBlogs.Core/Views/Shared/JSChallenge.cshtml

@@ -21,34 +21,56 @@
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     <title>正在检测您的浏览器环境,请稍候......</title>
     <script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
-    <script src="https://cdn.staticfile.org/jsencrypt/3.0.0-rc.1/jsencrypt.min.js"></script>
 </head>
 <body>
+    <noscript>
+        <style>
+            h3 {
+                display: none !important;
+            }
+        </style>
+        <div style="position: absolute;top: 0;left: 0;right: 0;bottom: 0;">
+            <h2>检测到您的浏览器不支持javascript或已禁用javascript功能,当前页面无法正常显示!</h2>
+        </div>
+    </noscript>
     <form>
         @Html.AntiForgeryToken()
     </form>
-    正在检测您的浏览器环境,请稍候......
+    <h3>正在检测您的浏览器环境,请稍候,页面将自动刷新......</h3>
     @Html.Raw(CommonHelper.SystemSettings.GetOrAdd("Scripts", ""))
 </body>
 </html>
+<script src="https://cdn.staticfile.org/jsencrypt/3.0.0-rc.1/jsencrypt.min.js"></script>
 <script>
-    $(function () {
+    function getCookie(cname) {
+        var name = cname + "=";
+        var ca = document.cookie.split(';');
+        for (var i = 0; i < ca.length; i++) {
+            var c = ca[i].trim();
+            if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
+        }
+        return "";
+    }
+
+    setTimeout(function () {
         var encrypt = new JSEncrypt();
-        encrypt.setPublicKey($.cookie("challenge-key"));
-        setTimeout(function () {
-            var formData = new FormData();
-            formData.append("__RequestVerificationToken", $("[name='__RequestVerificationToken']").val());
-            formData.append("token", encrypt.encrypt("@value"));
-            window.fetch("/challenge", {
-                credentials: 'include',
-                method: 'POST',
-                mode: 'cors',
-                body: formData
-            }).then(function (response) {
-                if (response.ok) {
-                    location.reload();
-                }
-            });
-        }, 3000);
-    });
+        encrypt.setPublicKey(decodeURIComponent(getCookie("challenge-key")));
+        var formData = new FormData();
+        formData.append("__RequestVerificationToken", document.querySelector("[name='__RequestVerificationToken']").value);
+        formData.append("token", encrypt.encrypt("@value"));
+        window.fetch("/challenge", {
+            credentials: 'include',
+            method: 'POST',
+            mode: 'cors',
+            body: formData
+        }).then(function (response) {
+            if (response.ok) {
+                location.reload();
+            } else {
+                alert("页面加载失败,请关闭掉额外的浏览器插件扩展后刷新重试!");
+            }
+        }).catch(function (e) {
+            alert("页面加载失败,请关闭掉额外的浏览器插件扩展后刷新重试!");
+        });
+    }, 2000);
 </script>