Browse Source

一些优化

懒得勤快 4 years ago
parent
commit
6bf158bb48

+ 1 - 1
src/Masuit.MyBlogs.Core/Controllers/DonateController.cs

@@ -58,7 +58,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <returns></returns>
         public ActionResult Delete(int id)
         {
-            bool b = DonateService.DeleteById(id);
+            bool b = DonateService - id;
             return ResultData(null, b, b ? "删除成功!" : "删除失败!");
         }
     }

+ 4 - 3
src/Masuit.MyBlogs.Core/Controllers/ErrorController.cs

@@ -3,8 +3,8 @@ using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Configs;
 using Masuit.MyBlogs.Core.Extensions.Firewall;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
-using Masuit.Tools;
 using Masuit.Tools.AspNetCore.Mime;
+using Masuit.Tools.Core.Validator;
 using Masuit.Tools.Logging;
 using Masuit.Tools.Security;
 using Masuit.Tools.Strings;
@@ -179,9 +179,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         [HttpPost, ValidateAntiForgeryToken, AllowAccessFirewall, ResponseCache(Duration = 100, VaryByQueryKeys = new[] { "email" })]
         public ActionResult GetViewToken([FromServices] IUserInfoService userInfoService, string email)
         {
-            if (string.IsNullOrEmpty(email) || !email.MatchEmail().isMatch)
+            var validator = new IsEmailAttribute();
+            if (!validator.IsValid(email))
             {
-                return ResultData(null, false, "请输入正确的邮箱!");
+                return ResultData(null, false, validator.ErrorMessage);
             }
 
             if (RedisHelper.Exists("get:" + email))

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

@@ -113,7 +113,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="size"></param>
         /// <param name="orderBy"></param>
         /// <returns></returns>
-        [Route("tag/{tag}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "page", "size", "orderBy" }, VaryByHeader = "Cookie")]
+        [Route("tag/{tag}"), Route("tag", Order = 2), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "page", "size", "orderBy" }, VaryByHeader = "Cookie")]
         public async Task<ActionResult> Tag(string tag, [Optional] OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")] int page = 1, [Range(1, 50, ErrorMessage = "页大小必须在0到50之间")] int size = 15)
         {
             Expression<Func<Post, bool>> where = p => p.Status == Status.Published;
@@ -163,7 +163,6 @@ namespace Masuit.MyBlogs.Core.Controllers
 
             var viewModel = await GetIndexPageViewModel();
             ViewBag.Author = author;
-            ViewBag.Total = posts.TotalCount;
             viewModel.Posts = posts;
             viewModel.PageParams = new Pagination(page, size, posts.TotalCount, orderBy);
             viewModel.SidebarAds = AdsService.GetsByWeightedPrice(2, AdvertiseType.SideBar, Request.Location());

+ 10 - 34
src/Masuit.MyBlogs.Core/Controllers/LinksController.cs

@@ -11,7 +11,6 @@ using System;
 using System.IO;
 using System.Linq;
 using System.Net.Http;
-using System.Net.Http.Headers;
 using System.Threading;
 using System.Threading.Tasks;
 
@@ -51,13 +50,18 @@ namespace Masuit.MyBlogs.Core.Controllers
                 return ResultData(null, false, "添加失败!链接非法!");
             }
 
+            if (links.Url.Contains(new[] { "?", "&", "=" }))
+            {
+                return ResultData(null, false, "添加失败!请移除链接中的查询字符串后再试!如遇特殊情况,请联系站长进行处理。");
+            }
+
             var host = new Uri(links.Url).Host;
             if (LinksService.Any(l => l.Url.Contains(host)))
             {
                 return ResultData(null, false, "添加失败!检测到您的网站已经是本站的友情链接了!");
             }
 
-            HttpClient.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
+            HttpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.47");
             HttpClient.DefaultRequestHeaders.Referrer = new Uri(Request.Scheme + "://" + Request.Host);
             HttpClient.DefaultRequestHeaders.Add("X-Forwarded-For", "1.1.1.1");
             HttpClient.DefaultRequestHeaders.Add("X-Forwarded-Host", "1.1.1.1");
@@ -81,21 +85,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     return ResultData(null, false, $"添加失败!检测到您的网站上未将本站设置成友情链接,请先将本站主域名:{Request.Host}在您的网站设置为友情链接,并且能够展示后,再次尝试添加即可!");
                 }
 
-                var entry = await LinksService.GetAsync(l => l.Url.Equals(links.Url));
-                bool b;
-                if (entry is null)
-                {
-                    b = LinksService.AddEntitySaved(links) != null;
-                }
-                else
-                {
-                    entry.Url = links.Url;
-                    entry.Except = links.Except;
-                    entry.Name = links.Name;
-                    entry.Recommend = links.Recommend;
-                    b = await LinksService.SaveChangesAsync() > 0;
-                }
-
+                var b = LinksService.AddEntitySaved(links) != null;
                 return ResultData(null, b, b ? "添加成功!这可能有一定的延迟,如果没有看到您的链接,请稍等几分钟后刷新页面即可,如有疑问,请联系站长。" : "添加失败!这可能是由于网站服务器内部发生了错误,如有疑问,请联系站长。");
             });
         }
@@ -108,21 +98,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [MyAuthorize]
         public async Task<ActionResult> Add(Links links)
         {
-            var entry = await LinksService.GetByIdAsync(links.Id);
-            bool b;
-            if (entry is null)
-            {
-                b = await LinksService.AddEntitySavedAsync(links) > 0;
-            }
-            else
-            {
-                entry.Url = links.Url;
-                entry.Except = links.Except;
-                entry.Name = links.Name;
-                entry.Recommend = links.Recommend;
-                b = await LinksService.SaveChangesAsync() > 0;
-            }
-
+            bool b = await LinksService.AddOrUpdateSavedAsync(l => l.Id, links) > 0;
             return b ? ResultData(null, message: "添加成功!") : ResultData(null, false, "添加失败!");
         }
 
@@ -134,7 +110,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         [MyAuthorize]
         public async Task<ActionResult> Check(string link)
         {
-            HttpClient.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
+            HttpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.47");
             HttpClient.DefaultRequestHeaders.Add("X-Forwarded-For", "1.1.1.1");
             HttpClient.DefaultRequestHeaders.Add("X-Forwarded-Host", "1.1.1.1");
             HttpClient.DefaultRequestHeaders.Add("X-Real-IP", "1.1.1.1");
@@ -143,7 +119,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             {
                 if (t.IsFaulted || t.IsCanceled)
                 {
-                    return ResultData(null, false, link + " 似乎挂了!错误信息:" + t.Exception?.Message);
+                    return ResultData(null, false, link + " 似乎挂了!错误信息:" + t.Exception?.Flatten().InnerException?.Message);
                 }
 
                 using var res = t.Result;

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

@@ -20,6 +20,7 @@ using Masuit.MyBlogs.Core.Models.ViewModel;
 using Masuit.MyBlogs.Core.Views.Post;
 using Masuit.Tools;
 using Masuit.Tools.Core.Net;
+using Masuit.Tools.Core.Validator;
 using Masuit.Tools.Html;
 using Masuit.Tools.Linq;
 using Masuit.Tools.Logging;
@@ -346,9 +347,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         [HttpPost, ValidateAntiForgeryToken, AllowAccessFirewall]
         public ActionResult GetViewToken(string email)
         {
-            if (string.IsNullOrEmpty(email) || !email.MatchEmail().isMatch)
+            var validator = new IsEmailAttribute();
+            if (!validator.IsValid(email))
             {
-                return ResultData(null, false, "请输入正确的邮箱!");
+                return ResultData(null, false, validator.ErrorMessage);
             }
 
             if (RedisHelper.Exists("get:" + email))
@@ -721,6 +723,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             p.Modifier = p.Author;
             p.ModifierEmail = p.Email;
             p.IP = ClientIP;
+            p.Rss = p.LimitMode is null or RegionLimitMode.All;
             if (!string.IsNullOrEmpty(post.Seminars))
             {
                 var tmp = post.Seminars.Split(',').Distinct();

+ 7 - 1
src/Masuit.MyBlogs.Core/Controllers/ValidateController.cs

@@ -15,8 +15,14 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="email"></param>
         /// <returns></returns>
         [HttpPost, ValidateAntiForgeryToken, ResponseCache(Duration = 115, VaryByQueryKeys = new[] { "email" })]
-        public async Task<ActionResult> SendCode([IsEmail] string email)
+        public async Task<ActionResult> SendCode(string email)
         {
+            var validator = new IsEmailAttribute();
+            if (!validator.IsValid(email))
+            {
+                return ResultData(null, false, validator.ErrorMessage);
+            }
+
             if (await RedisHelper.ExistsAsync("get:" + email))
             {
                 await RedisHelper.ExpireAsync("get:" + email, 120);

+ 1 - 2
src/Masuit.MyBlogs.Core/Extensions/Hangfire/HangfireBackJob.cs

@@ -13,7 +13,6 @@ using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Net.Http;
-using System.Net.Http.Headers;
 using System.Threading;
 
 namespace Masuit.MyBlogs.Core.Extensions.Hangfire
@@ -171,7 +170,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         public void CheckLinks()
         {
             var client = _httpClientFactory.CreateClient();
-            client.DefaultRequestHeaders.UserAgent.Add(ProductInfoHeaderValue.Parse("Mozilla/5.0"));
+            client.DefaultRequestHeaders.UserAgent.TryParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.47");
             client.DefaultRequestHeaders.Add("X-Forwarded-For", "1.1.1.1");
             client.DefaultRequestHeaders.Add("X-Forwarded-Host", "1.1.1.1");
             client.DefaultRequestHeaders.Add("X-Real-IP", "1.1.1.1");

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

@@ -26,7 +26,7 @@
 
     <ItemGroup>
         <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.1.0" />
-        <PackageReference Include="AutoMapper.Extensions.ExpressionMapping" Version="4.1.1" />
+        <PackageReference Include="AutoMapper.Extensions.ExpressionMapping" Version="4.1.2" />
         <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.1.1" />
         <PackageReference Include="CacheManager.Microsoft.Extensions.Caching.Memory" Version="1.2.0" />
         <PackageReference Include="CacheManager.Serialization.Json" Version="1.2.0" />
@@ -42,11 +42,11 @@
         <PackageReference Include="IP2Region" Version="1.2.0" />
         <PackageReference Include="Karambolo.AspNetCore.Bundling.NUglify" Version="3.5.0" />
         <PackageReference Include="MaxMind.GeoIP2" Version="4.0.1" />
-        <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.9" />
-        <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.9" />
-        <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="5.0.9" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.10" />
+        <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.10" />
+        <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="5.0.10" />
         <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="5.0.1" />
-        <PackageReference Include="Microsoft.Graph" Version="4.4.0" />
+        <PackageReference Include="Microsoft.Graph" Version="4.5.0" />
         <PackageReference Include="Microsoft.Graph.Auth" Version="1.0.0-preview.6" />
         <PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.2.22" />
         <PackageReference Include="OpenXmlPowerTools-NetStandard" Version="4.4.21" />
@@ -57,7 +57,7 @@
         <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.12" />
         <PackageReference Include="TimeZoneConverter" Version="3.5.0" />
         <PackageReference Include="WilderMinds.RssSyndication" Version="1.7.0" />
-        <PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="5.2.9" />
+        <PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="5.2.10" />
     </ItemGroup>
     <ItemGroup>
         <Content Update="appsettings.json">

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

@@ -39,7 +39,7 @@
 <div class="bg-title">
     <div class="header-content text-center">
         <h1 class="size48">
-            @ViewBag.Author 参与编辑的文章(@ViewBag.Total 篇)
+            @ViewBag.Author 参与编辑的文章
         </h1>
         <div class="divider"></div>
     </div>

+ 6 - 2
src/Masuit.MyBlogs.Core/Views/Post/Publish.cshtml

@@ -15,8 +15,12 @@
         <li><a asp-controller="Home" asp-action="Index">首页</a></li>
         <li class="current"><em>@ViewBag.Title</em></li>
     </ol>
-    <p class="text-red size20">投稿须知:投稿前请先站内搜索同类文章进行编辑修改操作,本页的重复投稿将不会接受,作直接删除处理!</p>
-    <hr />
+    <p class="text-red size20">
+        投稿须知:投稿前请先站内搜索同类文章进行编辑修改操作,本页的重复投稿将不会接受,作直接删除处理!<br/>
+        投稿通过后若文章的内容有任何更新,请及时修改更新,若后期发现内容有更新而长期未更新的,作删除处理!<br/>
+        投稿通过后若文章的评论区有任何问题,长期未回复解释情况的,文章将作删除处理!
+    </p>
+    <hr/>
     <form class="form-group" id="article-form" method="post" onsubmit="return false">
         @*文章表单*@
         @Html.AntiForgeryToken()

+ 8 - 0
src/Masuit.MyBlogs.Core/Views/Shared/_Aside.cshtml

@@ -126,6 +126,14 @@
                         <a class="tagc-@(new Random().Next(100) % 10)">没有标签</a>
                     }
                 </div>
+                <form action="/tag" method="get">
+                    <div class="input-group">
+                        <input type="text" placeholder="支持多个标签,逗号分隔" name="tag" maxlength="48" class="form-control">
+                        <div class="input-group-btn">
+                            <button class="btn btn-primary">搜索</button>
+                        </div>
+                    </div>
+                </form>
             </div>
         </article>
     </section>

+ 14 - 0
src/Masuit.MyBlogs.Core/wwwroot/Scripts/global/scripts.js

@@ -224,6 +224,11 @@ function CopyrightProtect() {
                 hackClip();
                 return false;
             }
+
+            if (window.outerWidth - window.innerWidth > 160 || window.outerHeight - window.innerHeight > 160) {  
+                // 如果打开控制台,则刷新页面
+                window.location.reload();  
+            }
         } catch (ex) {
             console.error(ex);
         }
@@ -255,6 +260,11 @@ function CopyrightProtect4Editor() {
                 hackClip();
                 return false;
             }
+
+            if (window.outerWidth - window.innerWidth > 160 || window.outerHeight - window.innerHeight > 160) {  
+                // 如果打开控制台,则刷新页面
+                window.location.reload();  
+            }
         } catch (ex) {
             console.error(ex);
         }
@@ -300,6 +310,10 @@ function GlobalCopyrightProtect() {
                 hackClip();
                 return false;
             }
+            if (window.outerWidth - window.innerWidth > 160 || window.outerHeight - window.innerHeight > 160) {  
+                // 如果打开控制台,则刷新页面
+                window.location.reload();  
+            }
         } catch (ex) {
             console.error(ex);
         }

+ 10 - 12
src/Masuit.MyBlogs.Core/wwwroot/Scripts/publish/publish.js

@@ -40,27 +40,25 @@
             return;
         }
         if ($("#Author").val().trim().length <= 1 || $("#Author").val().trim().length > 24) {
-	        window.notie.alert({
-		        type: 3,
-                text: '昵称不能少于2个字符或超过36个字符!',
-		        time: 4
-	        });
+	        layer.tips('昵称不能少于2个字符或超过36个字符!', '#Author', {
+                tips: [1, '#d9534f'],
+                time: 5000
+            });
             loadingDone();
             return;
         }
         if (!/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test($("#Email").val().trim())) {
-	        window.notie.alert({
-		        type: 3,
-                text: '请输入正确的邮箱格式!',
-		        time: 4
-	        });
+	        layer.tips('请输入正确的邮箱格式!', '#Email', {
+                tips: [1, '#d9534f'],
+                time: 5000
+            });
             loadingDone();
             return;
         }
         if (ue.getContent().length < 20 || ue.getContent().length > 1000000) {
 	        window.notie.alert({
 		        type: 3,
-                text: '文章内容过短或者超长,请修改后再提交!',
+                text: '文章内容过短或者超长,请修改后再提交!',
 		        time: 4
 	        });
             loadingDone();
@@ -119,7 +117,7 @@
                 }, 1000);
             } else {
                 layer.tips(data.Message, '#getcode', {
-                  tips: [1, '#3595CC'],
+                  tips: [1, '#d9534f'],
                   time: 4000
                 });
                 $("#getcode").attr('disabled', false);

+ 5 - 10
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/links.js

@@ -116,17 +116,12 @@
 	}
 	self.check= function(link) {
 		$scope.request("/links/check", {
-			link
+			link:link.Url
 		}, function (data) {
-			if (data.Success) {
-				window.notie.alert({
-					type: 1,
-					text: data.Message,
-					time: 4
-				});
-			} else {
-				swal(data.Message, "", "error");
-			}
+			layer.tips(data.Message, '#link-'+link.Id, {
+                tips: [1, '#3595CC'],
+                time: 5000
+            });
 		});
 	}
 	$scope.toggleWhite= function(row) {

+ 1 - 1
src/Masuit.MyBlogs.Core/wwwroot/ng-views/views/links.html

@@ -65,7 +65,7 @@
                     <button class="btn btn-danger btn-sm waves-effect" ng-click="list.del(row)" ng-if="!row.isEditing">
                         <i class="icon-cross"></i>
                     </button>
-                    <button class="btn btn-info btn-sm waves-effect" ng-click="list.check(row.Url)" ng-if="!row.isEditing">
+                    <button class="btn btn-info btn-sm waves-effect" id="link-{{row.Id}}" ng-click="list.check(row)" ng-if="!row.isEditing">
                         <i class="icon-shuffle"></i>
                     </button>
                 </div>