Преглед изворни кода

1.站点访问权限控制;
2.友链权重排名;
3.草稿箱支持;
4.文章页顺序调整;
5.文章详情页优化;
6.搜索优化;
7.搜索页优化;
8.修正一些bug

懒得勤快 пре 6 година
родитељ
комит
737da8af84
25 измењених фајлова са 231 додато и 110 уклоњено
  1. 2 2
      src/Masuit.MyBlogs.Core/Common/ImagebedClient.cs
  2. 1 0
      src/Masuit.MyBlogs.Core/Configs/GitlabConfig.cs
  3. 1 1
      src/Masuit.MyBlogs.Core/Controllers/BaseController.cs
  4. 4 8
      src/Masuit.MyBlogs.Core/Controllers/LinksController.cs
  5. 13 27
      src/Masuit.MyBlogs.Core/Controllers/PostController.cs
  6. 12 0
      src/Masuit.MyBlogs.Core/Controllers/UploadController.cs
  7. 2 1
      src/Masuit.MyBlogs.Core/Extensions/FirewallMiddleware.cs
  8. 22 2
      src/Masuit.MyBlogs.Core/Extensions/Hangfire/HangfireBackJob.cs
  9. 6 0
      src/Masuit.MyBlogs.Core/Extensions/Hangfire/IHangfireBackJob.cs
  10. 23 0
      src/Masuit.MyBlogs.Core/Extensions/RequestInterceptMiddleware.cs
  11. 6 6
      src/Masuit.MyBlogs.Core/Masuit.MyBlogs.Core.csproj
  12. 26 11
      src/Masuit.MyBlogs.Core/Masuit.MyBlogs.Core.xml
  13. 5 0
      src/Masuit.MyBlogs.Core/Models/DTO/LinksOutputDto.cs
  14. 5 0
      src/Masuit.MyBlogs.Core/Models/Entity/Links.cs
  15. 74 3
      src/Masuit.MyBlogs.Core/Views/Error/AccessDeny.cshtml
  16. 1 1
      src/Masuit.MyBlogs.Core/Views/Home/Index.cshtml
  17. 1 1
      src/Masuit.MyBlogs.Core/Views/Post/Details.cshtml
  18. 1 1
      src/Masuit.MyBlogs.Core/Views/Post/HistoryVersion.cshtml
  19. 5 6
      src/Masuit.MyBlogs.Core/Views/Post/Publish.cshtml
  20. 4 2
      src/Masuit.MyBlogs.Core/appsettings.json
  21. 2 0
      src/Masuit.MyBlogs.Core/wwwroot/Scripts/global/article.js
  22. 11 27
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/links.js
  23. 0 3
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/post.js
  24. 4 2
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/views/links.html
  25. 0 6
      src/Masuit.MyBlogs.Core/wwwroot/ng-views/views/post/postlist.html

+ 2 - 2
src/Masuit.MyBlogs.Core/Common/ImagebedClient.cs

@@ -44,12 +44,12 @@ namespace Masuit.MyBlogs.Core.Common
         /// <returns></returns>
         public async Task<(string url, bool success)> UploadImage(Stream stream, string file)
         {
-            if (AppConfig.GiteeConfig.Enabled)
+            if (AppConfig.GiteeConfig.Enabled && stream.Length < AppConfig.GiteeConfig.FileLimitSize)
             {
                 return await UploadGitee(stream, file);
             }
 
-            if (AppConfig.GitlabConfig.Enabled)
+            if (AppConfig.GitlabConfig.Enabled && stream.Length < AppConfig.GitlabConfig.FileLimitSize)
             {
                 return await UploadGitlab(stream, file);
             }

+ 1 - 0
src/Masuit.MyBlogs.Core/Configs/GitlabConfig.cs

@@ -7,5 +7,6 @@
         public string RawUrl { get; set; }
         public string AccessToken { get; set; }
         public string Branch { get; set; }
+        public int FileLimitSize { get; set; }
     }
 }

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

@@ -143,7 +143,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             ViewBag.menus = MenuService.LoadEntitiesFromL2Cache<MenuOutputDto>(m => m.Status == Status.Available).OrderBy(m => m.Sort).ToList(); //菜单
             PageFootViewModel model = new PageFootViewModel //页脚
             {
-                Links = LinksService.LoadEntities(l => l.Status == Status.Available, l => l.Recommend, false).ThenBy(l => new Random().Next()).Take(40).ProjectTo<LinksOutputDto>().Cacheable().ToList()
+                Links = LinksService.LoadEntities(l => l.Status == Status.Available, l => l.Recommend, false).ThenByDescending(l => l.Weight).ThenByDescending(l => new Random().Next()).Take(40).ProjectTo<LinksOutputDto>().Cacheable().ToList()
             };
             ViewBag.Footer = model;
 

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

@@ -199,18 +199,14 @@ namespace Masuit.MyBlogs.Core.Controllers
         }
 
         /// <summary>
-        /// 分页数据
+        /// 所有的友情链接
         /// </summary>
-        /// <param name="page"></param>
-        /// <param name="size"></param>
         /// <returns></returns>
         [Authority]
-        public ActionResult GetPageData(int page = 1, int size = 10)
+        public ActionResult Get()
         {
-            List<Links> list = LinksService.GetAll().OrderBy(p => p.Status).ThenByDescending(p => p.Recommend).ThenByDescending(p => p.Id).Skip((page - 1) * size).Take(size).ToList();
-            var total = LinksService.GetAll().Count();
-            var pageCount = Math.Ceiling(total * 1.0 / size).ToInt32();
-            return PageResult(list, pageCount, total);
+            List<Links> list = LinksService.GetAll().OrderBy(p => p.Status).ThenByDescending(p => p.Recommend).ThenByDescending(p => p.Id).ToList();
+            return ResultData(list);
         }
 
         /// <summary>

+ 13 - 27
src/Masuit.MyBlogs.Core/Controllers/PostController.cs

@@ -393,24 +393,25 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <summary>
         /// 检查访问密码
         /// </summary>
+        /// <param name="email"></param>
         /// <param name="token"></param>
         /// <returns></returns>
         [HttpPost, ValidateAntiForgeryToken]
-        public ActionResult CheckViewToken(string token)
+        public ActionResult CheckViewToken(string email, string token)
         {
             if (string.IsNullOrEmpty(token))
             {
-                return ResultData(null, false, "请输入文章访问密码!");
+                return ResultData(null, false, "请输入访问密码!");
             }
 
-            var s = RedisHelper.Get("ArticleViewToken");
+            var s = RedisHelper.Get("token:" + email);
             if (token.Equals(s))
             {
-                HttpContext.Session.Set("ArticleViewToken", token);
+                HttpContext.Session.Set("AccessViewToken", token);
                 return ResultData(null);
             }
 
-            return ResultData(null, false, "文章访问密码不正确!");
+            return ResultData(null, false, "访问密码不正确!");
         }
 
         /// <summary>
@@ -418,10 +419,10 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <param name="email"></param>
         /// <returns></returns>
-        [HttpPost, ValidateAntiForgeryToken, ResponseCache(Duration = 120, VaryByQueryKeys = new[] { "email" })]
+        [HttpPost, ValidateAntiForgeryToken, ResponseCache(Duration = 7200, VaryByQueryKeys = new[] { "email" })]
         public ActionResult GetViewToken(string email)
         {
-            if (string.IsNullOrEmpty(email) && !email.MatchEmail())
+            if (!string.IsNullOrEmpty(email) && !email.MatchEmail())
             {
                 return ResultData(null, false, "请输入正确的邮箱!");
             }
@@ -434,13 +435,14 @@ namespace Masuit.MyBlogs.Core.Controllers
 
             if (BroadcastService.Any(b => b.Email.Equals(email) && b.SubscribeType == SubscribeType.ArticleToken))
             {
-                var s = RedisHelper.Get("ArticleViewToken");
-                CommonHelper.SendMail(CommonHelper.SystemSettings["Domain"] + "博客文章验证码", $"{CommonHelper.SystemSettings["Domain"]}博客文章验证码是:<span style='color:red'>{s}</span>,有效期为24h,请按时使用!", email);
-                RedisHelper.Set("code:" + email, s, 120);
+                string token = SnowFlake.GetInstance().GetUniqueShortId(6);
+                RedisHelper.Set("token:" + email, token, 86400);
+                CommonHelper.SendMail(CommonHelper.SystemSettings["Domain"] + "博客访问验证码", $"{CommonHelper.SystemSettings["Domain"]}本次验证码是:<span style='color:red'>{token}</span>,有效期为24h,请按时使用!", email);
+                RedisHelper.Set("code:" + email, token, 120);
                 return ResultData(null);
             }
 
-            return ResultData(null, false, "您目前没有权限访问这篇文章的加密部分,请联系站长开通这篇文章的访问权限!");
+            return ResultData(null, false, "您目前没有权限访问这个链接,请联系站长开通访问权限!");
         }
 
         #region 后端管理
@@ -1033,22 +1035,6 @@ namespace Masuit.MyBlogs.Core.Controllers
             return ResultData(null, b, b ? "历史版本文章删除成功!" : "历史版本文章删除失败!");
         }
 
-        /// <summary>
-        /// 获取文章访问密码
-        /// </summary>
-        /// <returns></returns>
-        [Authority, HttpPost]
-        public ActionResult ViewToken()
-        {
-            if (!RedisHelper.Exists("ArticleViewToken"))
-            {
-                RedisHelper.Set("ArticleViewToken", SnowFlake.GetInstance().GetUniqueShortId(6));
-            }
-
-            var token = RedisHelper.Get("ArticleViewToken");
-            return ResultData(token);
-        }
-
         /// <summary>
         /// 还原版本
         /// </summary>

+ 12 - 0
src/Masuit.MyBlogs.Core/Controllers/UploadController.cs

@@ -81,6 +81,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 {
                     return ResultData(null, false, "文件格式不支持,只能上传doc或者docx的文档!");
                 }
+
                 if (fileName != null)
                 {
                     string upload = _hostingEnvironment.WebRootPath + "/upload";
@@ -88,6 +89,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     {
                         Directory.CreateDirectory(upload);
                     }
+
                     string resourceName = string.Empty.CreateShortToken(9);
                     string ext = Path.GetExtension(fileName);
                     string docPath = Path.Combine(upload, resourceName + ext);
@@ -106,12 +108,14 @@ namespace Masuit.MyBlogs.Core.Controllers
                         System.IO.File.Delete(docPath);
                         return ResultData(null, false, "读取文件内容失败,请检查文件的完整性,建议另存后重新上传!");
                     }
+
                     if (html.Length > 1000000)
                     {
                         Directory.Delete(htmlDir, true);
                         System.IO.File.Delete(docPath);
                         return ResultData(null, false, "文档内容超长,服务器拒绝接收,请优化文档内容后再尝试重新上传!");
                     }
+
                     return ResultData(new
                     {
                         Title = Path.GetFileNameWithoutExtension(fileName),
@@ -120,6 +124,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     });
                 }
             }
+
             return ResultData(null, false, "请先选择您需要上传的文件!");
         }
 
@@ -140,6 +145,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             {
                 return this.ResumePhysicalFile(file, Path.GetFileName(file));
             }
+
             return Content("null");
         }
 
@@ -181,6 +187,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                     action = new CrawlerHandler(HttpContext);
                     break;
             }
+
             if (user.IsAdmin)
             {
                 switch (Request.Query["action"])//管理员用
@@ -234,16 +241,19 @@ namespace Masuit.MyBlogs.Core.Controllers
                     {
                         return ResultData(url);
                     }
+
                     path = Path.Combine(_hostingEnvironment.WebRootPath, "upload", "images", filename);
                     var dir = Path.GetDirectoryName(path);
                     if (!Directory.Exists(dir))
                     {
                         Directory.CreateDirectory(dir);
                     }
+
                     using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                     {
                         file.CopyTo(fs);
                     }
+
                     break;
                 case var _ when file.ContentType.StartsWith("audio") || file.ContentType.StartsWith("video"):
                     path = Path.Combine(_hostingEnvironment.WebRootPath, "upload", "media", filename);
@@ -262,10 +272,12 @@ namespace Masuit.MyBlogs.Core.Controllers
                 {
                     Directory.CreateDirectory(dir);
                 }
+
                 using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                 {
                     file.CopyTo(fs);
                 }
+
                 return ResultData(path.Substring(_hostingEnvironment.WebRootPath.Length).Replace("\\", "/"));
             }
             catch (Exception e)

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

@@ -2,6 +2,7 @@
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions.Hangfire;
 using Masuit.Tools;
+using Masuit.Tools.Core.Net;
 using Microsoft.AspNetCore.Http;
 using System;
 using System.Threading.Tasks;
@@ -51,7 +52,7 @@ namespace Masuit.MyBlogs.Core.Extensions
             }
 
             string ip = context.Connection.RemoteIpAddress.MapToIPv4().ToString();
-            if (ip.IsDenyIpAddress())
+            if (ip.IsDenyIpAddress() && string.IsNullOrEmpty(context.Session.Get<string>("AccessViewToken")))
             {
                 BackgroundJob.Enqueue(() => HangfireBackJob.InterceptLog(new IpIntercepter()
                 {

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

@@ -8,7 +8,6 @@ using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.Tools;
 using Masuit.Tools.Core.Net;
-using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Hosting;
 using System;
 using System.Collections.Generic;
@@ -153,7 +152,6 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         public void EverydayJob()
         {
             CommonHelper.IPErrorTimes.RemoveWhere(kv => kv.Value < 100); //将访客访问出错次数少于100的移开
-            RedisHelper.Set("ArticleViewToken", SnowFlake.GetInstance().GetUniqueShortId(6)); //更新加密文章的密码
             RedisHelper.IncrBy("Interview:RunningDays");
             DateTime time = DateTime.Now.AddMonths(-1);
             _searchDetailsService.DeleteEntitySaved(s => s.SearchTime < time);
@@ -179,6 +177,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
                         link.Status = Status.Unavailable;
                         return;
                     }
+
                     var res = await t;
                     if (res.IsSuccessStatusCode)
                     {
@@ -188,12 +187,33 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
                     {
                         link.Status = Status.Unavailable;
                     }
+
                     _linksService.UpdateEntity(link);
                 }).Wait();
             });
             _linksService.SaveChanges();
         }
 
+        /// <summary>
+        /// 更新友链权重
+        /// </summary>
+        /// <param name="referer"></param>
+        public void UpdateLinkWeight(string referer)
+        {
+            var uri = new Uri(referer);
+            var query = _linksService.LoadEntities(l => l.Url.Contains(uri.Host));
+            if (query.Any())
+            {
+                var list = query.ToList();
+                foreach (var link in list)
+                {
+                    link.Weight += 1;
+                }
+
+                _linksService.SaveChanges();
+            }
+        }
+
         /// <summary>
         /// 重建Lucene索引库
         /// </summary>

+ 6 - 0
src/Masuit.MyBlogs.Core/Extensions/Hangfire/IHangfireBackJob.cs

@@ -39,6 +39,12 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         /// </summary>
         void CheckLinks();
 
+        /// <summary>
+        /// 更新友链权重
+        /// </summary>
+        /// <param name="referer"></param>
+        void UpdateLinkWeight(string referer);
+
         /// <summary>
         /// 重建Lucene索引库
         /// </summary>

+ 23 - 0
src/Masuit.MyBlogs.Core/Extensions/RequestInterceptMiddleware.cs

@@ -1,6 +1,11 @@
 using Masuit.MyBlogs.Core.Common;
+using Masuit.MyBlogs.Core.Extensions.Hangfire;
+using Masuit.Tools;
 using Masuit.Tools.Core.Net;
 using Microsoft.AspNetCore.Http;
+using Microsoft.Net.Http.Headers;
+using System;
+using System.Text;
 using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Extensions
@@ -27,7 +32,25 @@ namespace Masuit.MyBlogs.Core.Extensions
             {
                 context.Session.Set("session", 0);
                 CommonHelper.InterviewCount++;
+                var referer = context.Request.Headers[HeaderNames.Referer].ToString();
+                if (!string.IsNullOrEmpty(referer))
+                {
+                    try
+                    {
+                        new Uri(referer);//判断是不是一个合法的referer
+                        if (!referer.Contains(context.Request.Host.Value) && !referer.Contains(new[] { "baidu.com", "google", "sogou", "so.com", "bing.com", "sm.cn" }))
+                        {
+                            HangfireHelper.CreateJob(typeof(IHangfireBackJob), nameof(IHangfireBackJob.UpdateLinkWeight), args: referer);
+                        }
+                    }
+                    catch
+                    {
+                        await context.Response.WriteAsync("您的浏览器不支持访问本站!", Encoding.UTF8);
+                        return;
+                    }
+                }
             }
+
             await _next.Invoke(context);
         }
     }

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

@@ -23,28 +23,28 @@
   <ItemGroup>
     <PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.9.1" />
     <PackageReference Include="Aspose.Words" Version="18.11.0" />
-    <PackageReference Include="Autofac" Version="4.9.2" />
+    <PackageReference Include="Autofac" Version="4.9.3" />
     <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.4.0" />
     <PackageReference Include="AutoMapper" Version="8.1.1" />
     <PackageReference Include="CacheManager.Microsoft.Extensions.Caching.Memory" Version="1.2.0" />
     <PackageReference Include="CacheManager.Serialization.Json" Version="1.2.0" />
-    <PackageReference Include="CSRedisCore" Version="3.0.62" />
+    <PackageReference Include="CSRedisCore" Version="3.0.66" />
     <PackageReference Include="EFSecondLevelCache.Core" Version="2.4.1" />
-    <PackageReference Include="Hangfire" Version="1.7.3" />
+    <PackageReference Include="Hangfire" Version="1.7.5" />
     <PackageReference Include="Hangfire.Autofac" Version="2.3.1" />
     <PackageReference Include="Hangfire.MemoryStorage" Version="1.6.1" />
     <PackageReference Include="Hangfire.Redis.StackExchange" Version="1.8.0" />
     <PackageReference Include="htmldiff.net-core" Version="1.3.6" />
     <PackageReference Include="IP2Region" Version="1.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.App" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="2.2.4" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="2.2.6" />
     <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.3" />
     <PackageReference Include="PanGu.HighLight" Version="1.0.0" />
     <PackageReference Include="Polly" Version="7.1.0" />
     <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.2.0" />
     <PackageReference Include="WilderMinds.RssSyndication" Version="1.5.0" />
-    <PackageReference Include="Z.EntityFramework.Extensions.EFCore" Version="2.6.1" />
-    <PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="2.0.3" />
+    <PackageReference Include="Z.EntityFramework.Extensions.EFCore" Version="2.6.10" />
+    <PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="2.0.7" />
     <PackageReference Include="Z.ExtensionMethods" Version="2.1.1" />
   </ItemGroup>
 

+ 26 - 11
src/Masuit.MyBlogs.Core/Masuit.MyBlogs.Core.xml

@@ -901,12 +901,10 @@
             <param name="model"></param>
             <returns></returns>
         </member>
-        <member name="M:Masuit.MyBlogs.Core.Controllers.LinksController.GetPageData(System.Int32,System.Int32)">
+        <member name="M:Masuit.MyBlogs.Core.Controllers.LinksController.Get">
             <summary>
-            分页数据
+            所有的友情链接
             </summary>
-            <param name="page"></param>
-            <param name="size"></param>
             <returns></returns>
         </member>
         <member name="M:Masuit.MyBlogs.Core.Controllers.LinksController.ToggleWhitelist(System.Int32,System.Boolean)">
@@ -1419,10 +1417,11 @@
             </summary>
             <returns></returns>
         </member>
-        <member name="M:Masuit.MyBlogs.Core.Controllers.PostController.CheckViewToken(System.String)">
+        <member name="M:Masuit.MyBlogs.Core.Controllers.PostController.CheckViewToken(System.String,System.String)">
             <summary>
             检查访问密码
             </summary>
+            <param name="email"></param>
             <param name="token"></param>
             <returns></returns>
         </member>
@@ -1544,12 +1543,6 @@
             <param name="id"></param>
             <returns></returns>
         </member>
-        <member name="M:Masuit.MyBlogs.Core.Controllers.PostController.ViewToken">
-            <summary>
-            获取文章访问密码
-            </summary>
-            <returns></returns>
-        </member>
         <member name="M:Masuit.MyBlogs.Core.Controllers.PostController.Revert(System.Int32)">
             <summary>
             还原版本
@@ -2195,6 +2188,12 @@
             检查友链
             </summary>
         </member>
+        <member name="M:Masuit.MyBlogs.Core.Extensions.Hangfire.HangfireBackJob.UpdateLinkWeight(System.String)">
+            <summary>
+            更新友链权重
+            </summary>
+            <param name="referer"></param>
+        </member>
         <member name="M:Masuit.MyBlogs.Core.Extensions.Hangfire.HangfireBackJob.CreateLuceneIndex">
             <summary>
             重建Lucene索引库
@@ -2240,6 +2239,12 @@
             友链检查
             </summary>
         </member>
+        <member name="M:Masuit.MyBlogs.Core.Extensions.Hangfire.IHangfireBackJob.UpdateLinkWeight(System.String)">
+            <summary>
+            更新友链权重
+            </summary>
+            <param name="referer"></param>
+        </member>
         <member name="M:Masuit.MyBlogs.Core.Extensions.Hangfire.IHangfireBackJob.CreateLuceneIndex">
             <summary>
             重建Lucene索引库
@@ -5311,6 +5316,11 @@
             是否是推荐站点
             </summary>
         </member>
+        <member name="P:Masuit.MyBlogs.Core.Models.DTO.LinksOutputDto.Weight">
+            <summary>
+            友链权重
+            </summary>
+        </member>
         <member name="T:Masuit.MyBlogs.Core.Models.DTO.LoginRecordOutputDto">
             <summary>
             用户登录记录输出模型
@@ -6176,6 +6186,11 @@
             是否是推荐站点
             </summary>
         </member>
+        <member name="P:Masuit.MyBlogs.Core.Models.Entity.Links.Weight">
+            <summary>
+            友链权重
+            </summary>
+        </member>
         <member name="T:Masuit.MyBlogs.Core.Models.Entity.LoginRecord">
             <summary>
             用户登陆记录

+ 5 - 0
src/Masuit.MyBlogs.Core/Models/DTO/LinksOutputDto.cs

@@ -24,5 +24,10 @@
         /// 是否是推荐站点
         /// </summary>
         public bool Recommend { get; set; }
+
+        /// <summary>
+        /// 友链权重
+        /// </summary>
+        public int Weight { get; set; }
     }
 }

+ 5 - 0
src/Masuit.MyBlogs.Core/Models/Entity/Links.cs

@@ -37,5 +37,10 @@ namespace Masuit.MyBlogs.Core.Models.Entity
         /// 是否是推荐站点
         /// </summary>
         public bool Recommend { get; set; }
+
+        /// <summary>
+        /// 友链权重
+        /// </summary>
+        public int Weight { get; set; }
     }
 }

+ 74 - 3
src/Masuit.MyBlogs.Core/Views/Error/AccessDeny.cshtml

@@ -40,11 +40,12 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
     <link href="https://cdn.staticfile.org/smooth-scrollbar/7.4.1/smooth-scrollbar.css" rel="stylesheet">
+    <link href="https://cdn.bootcss.com/limonte-sweetalert2/8.11.8/sweetalert2.min.css" rel="stylesheet">
     <link href="~/Content/bootstrap.min.css" rel="stylesheet" />
     <script src="https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
     <script src="https://cdn.staticfile.org/jquery.ripples/0.5.3/jquery.ripples.min.js"></script>
     <script src="https://cdn.staticfile.org/smooth-scrollbar/7.4.1/smooth-scrollbar.js"></script>
-
+    <script src="https://cdn.bootcss.com/limonte-sweetalert2/8.11.8/sweetalert2.min.js"></script>
 </head>
 <body id="main-scrollbar" data-scrollbar>
     <div class="container">
@@ -55,8 +56,26 @@
             <h3 class="margintop20">
                 <em>
                     <span class="STYLE1">Sorry!访问被拒绝&nbsp;</span>
-                </em>:您所在的地区暂时不允许访问本站,如有疑问,请联系站长!
+                </em>
             </h3>
+            <h4>您所在的地区暂时不允许访问本站,如有疑问,请联系站长!或者请联系站长开通本站的访问权限!</h4>
+            <form action="/" method="post" class="form-inline" id="code-token">
+                @Html.AntiForgeryToken()
+                <div class="input-group">
+                    <span class="input-group-addon">邮箱:</span>
+                    <input type="email" name="Email" id="email3" class="form-control" />
+                    <span class="input-group-btn">
+                        <button type="button" class="btn btn-info getcode">获取通行证</button>
+                    </span>
+                </div>
+                <div class="input-group">
+                    <span class="input-group-addon">验证码:</span>
+                    <input type="text" name="token" id="token" class="form-control" />
+                    <span class="input-group-btn">
+                        <button type="submit" class="btn btn-info">检查通行证</button>
+                    </span>
+                </div>
+            </form>
         </div>
     </div>
 </body>
@@ -80,7 +99,59 @@
         }
     });
 </script>
-<script src="~/Scripts/notify.min.js"></script>
+<script>
+    $("#code-token").on("submit", function (e) {
+        e.preventDefault();
+        $.post("/post/CheckViewToken", $(this).serialize(), function (data) {
+            if (data.Success) {
+                window.location.href = "/";
+            } else {
+                Swal.fire({
+                    type: 'error',
+                    title: data.Message,
+                    showConfirmButton: false,
+                    timer: 5000
+                });
+            }
+        });
+    });
+    $(".getcode").on("click", function (e) {
+        e.preventDefault();
+        $.post("/post/getviewtoken",
+            {
+                __RequestVerificationToken: $("[name=__RequestVerificationToken]").val(),
+                email: $("#email3").val()
+            }, function (data) {
+                if (data.Success) {
+                    Swal.fire({
+                        type: 'success',
+                        title: "验证码发送成功,请注意查收邮件,若未收到,请检查你的邮箱地址或邮件垃圾箱!",
+                        showConfirmButton: false,
+                        timer: 1500
+                    });
+                    window.localStorage.setItem("email", $("#email3").val());
+                    $(".getcode").attr('disabled', true);
+                    var count = 0;
+                    var timer = setInterval(function () {
+                        count++;
+                        $(".getcode").text('重新发送(' + (120 - count) + ')');
+                        if (count > 120) {
+                            clearInterval(timer);
+                            $(".getcode").attr('disabled', false);
+                            $(".getcode").text('重新发送');
+                        }
+                    }, 1000);
+                } else {
+                    Swal.fire({
+                        type: 'error',
+                        title: data.Message,
+                        showConfirmButton: true,
+                        confirmButtonText: "确定"
+                    });
+                }
+            });
+    });
+</script>
 @{
     if (Context.Request.Headers[HeaderNames.UserAgent].ToString().Contains(new[] { "IE", "InternetExplorer" }))
     {

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

@@ -84,7 +84,7 @@
     <div class="container padding-clear">
         <div class="panel panel-info">
             <div class="panel-heading">⚡快速分享🉐 投递/寻其他网站收费资源,可到 @Html.ActionLink("投稿", "Publish", "Post") 进行投稿。</div>
-            <div class="panel-body padding-clear" style="max-height: 200px;overflow-y: auto">
+            <div class="panel-body padding-clear">
                 <table class="table table-bordered margin-clear">
                     @for (int i = 1; i < shares.Count + 1; i += 2)
                     {

+ 1 - 1
src/Masuit.MyBlogs.Core/Views/Post/Details.cshtml

@@ -86,7 +86,7 @@
                             @if (!string.IsNullOrEmpty(Model.ProtectContent))
                             {
                                 <div class="row protected">
-                                    @if (string.IsNullOrEmpty(Context.Session.Get<string>("ArticleViewToken")))
+                                    @if (string.IsNullOrEmpty(Context.Session.Get<string>("AccessViewToken")))
                                     {
                                         <p class="text-red text-center size24 margin-bot10">↓↓↓恭喜你发现镇站之宝,请注意,前方高能!非战斗人员请及时撤离,这不是演习!↓↓↓</p>
                                         <div class="col-md-12">

+ 1 - 1
src/Masuit.MyBlogs.Core/Views/Post/HistoryVersion.cshtml

@@ -74,7 +74,7 @@
                             @if (!string.IsNullOrEmpty(Model.ProtectContent))
                             {
                                 <div class="row protected">
-                                    @if (string.IsNullOrEmpty(Context.Session.Get<string>("ArticleViewToken")))
+                                    @if (string.IsNullOrEmpty(Context.Session.Get<string>("AccessViewToken")))
                                     {
                                         <p class="text-red text-center size24 margin-bot10">↓↓↓恭喜你发现镇站之宝,请注意,前方高能!非战斗人员请及时撤离,这不是演习!↓↓↓</p>
                                         <div class="col-md-6">

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

@@ -1,25 +1,24 @@
 @model IEnumerable<string>
 @using Masuit.MyBlogs.Core.Models.Entity
-@using Masuit.Tools.Win32
 @{
     ViewBag.Title = "投稿";
     Layout = "~/Views/Shared/_Layout.cshtml";
-    string[] colors = {"success", "info", "warning", "danger", "default"};
+    string[] colors = { "success", "info", "warning", "danger", "default" };
     List<Category> cats = ViewBag.Category;
 }
 <link href="~/Assets/fileupload/filestyle.css" rel="stylesheet" />
 <link href="~/Assets/semantic/semantic.min.css" rel="stylesheet" />
 <div class="container">
     <ol class="cd-breadcrumb triangle">
-        <li>@Html.ActionLink("首页","Index","Home")</li>
+        <li>@Html.ActionLink("首页", "Index", "Home")</li>
         <li class="current"><em>@ViewBag.Title</em></li>
     </ol>
-    <hr/>
+    <hr />
     <form class="form-group" id="article-form" method="post" onsubmit="return false">
         @*文章表单*@
         @Html.AntiForgeryToken()
-        <input type="hidden" name="IsWordDocument" id="IsWordDocument" value="false"/>
-        <input type="hidden" name="ResourceName" id="ResourceName"/>
+        <input type="hidden" name="IsWordDocument" id="IsWordDocument" value="false" />
+        <input type="hidden" name="ResourceName" id="ResourceName" />
         <div class="input-group">
             <span class="input-group-addon size18"><label for="article">文章标题:</label></span>
             <input type="text" id="article" class="form-control input-lg" name="Title" required placeholder="请输入文章标题">

+ 4 - 2
src/Masuit.MyBlogs.Core/appsettings.json

@@ -28,14 +28,16 @@
             "ApiUrl": "https://gitee.com/api/v5/repos/<用户名>/<项目仓库名>/contents/", // 码云上传API地址
             "RawUrl": "https://gitee.com/<用户名>/<项目仓库名>/raw/master/",
             "AccessToken": "你的access_token", //access_token在码云个人中心获取,https://gitee.com/profile/personal_access_tokens
-            "Branch": "master"
+            "Branch": "master",
+            "FileLimitSize": 104857600
         },
         "Gitlab": {
             "Enabled": false,
             "ApiUrl": "https://gitlab.com/api/v4/projects/<你的项目id>/repository/files/", // /api/v4/projects/<项目id>/repository/files/,使用前请先获取private_token,然后根private_token据来获取项目id,/api/v4/projects?private_token=<你的private_token>&search=<项目仓库名>
             "RawUrl": "https://gitlab.com/masuit/imgbed/raw/master/",
             "AccessToken": "你的private_token",
-            "Branch": "master"
+            "Branch": "master",
+            "FileLimitSize": 104857600
         }
     }
 }

+ 2 - 0
src/Masuit.MyBlogs.Core/wwwroot/Scripts/global/article.js

@@ -49,6 +49,8 @@
 					$(".getcode").text('重新发送('+(120-count)+')');
 					if (count>120) {
 						clearInterval(timer);
+						$(".getcode").attr('disabled', false);
+                        $(".getcode").text('重新发送');
 					}
 				},1000);
 			} else {

+ 11 - 27
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/links.js

@@ -3,35 +3,19 @@
 	var self = this;
 	var source = [];
 	$scope.loading();
-	$scope.paginationConf = {
-		currentPage: $scope.currentPage ? $scope.currentPage : 1,
-		itemsPerPage: 10,
-		pagesLength: 25,
-		perPageOptions: [1, 5, 10, 15, 20, 30, 40, 50, 100, 200],
-		rememberPerPage: 'perPageItems',
-		onChange: function() {
-			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);
-		}
-	};
-	this.GetPageData = function(page, size) {
+	this.load = function() {
 		$scope.loading();
-		$http.post("/links/getpagedata", {
-			page,
-			size
-		}).then(function(res) {
-			$scope.paginationConf.currentPage = page;
-			$scope.paginationConf.totalItems = res.data.TotalCount;
-			$("div[ng-table-pagination]").remove();
-			self.tableParams = new NgTableParams({
-				count: 50000
-			}, {
+		$http.post("/links/get", null).then(function(res) {
+			self.tableParams = new NgTableParams({}, {
 				filterDelay: 0,
 				dataset: res.data.Data
-				});
-			source = angular.copy(res.data.Data);
+			});
+			source = res.data.Data;
 			$scope.loadingDone();
 		});
 	};
+	this.load();
+
 	self.del = function(row) {
 		swal({
 			title: "确认删除这条友情链接吗?",
@@ -127,7 +111,7 @@
 			if (result) {
 				if (result.Success) {
 					swal(result.Message, "", "success");
-					self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);
+					self.load();
 				} else {
 					swal(result.Message, "", "error");
 				}
@@ -154,7 +138,7 @@
 			id:row.Id,
 			state:row.Except
 		}, function (data) {
-			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);
+			self.load();
 		});
 	}
 	$scope.toggleState= function(row) {
@@ -162,7 +146,7 @@
 			id:row.Id,
 			state:row.Status==1
 		}, function (data) {
-			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);
+			self.load();
 		});
 	}
 
@@ -171,7 +155,7 @@
 			id:row.Id,
 			state:row.Recommend
 		}, function (data) {
-			self.GetPageData($scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);
+			self.load();
 		});
 	}
 }]);

+ 0 - 3
src/Masuit.MyBlogs.Core/wwwroot/ng-views/controllers/post.js

@@ -38,9 +38,6 @@
 			self.tableParams.reload();
 		}
 	});
-	$scope.request("/post/viewtoken",null, function(data) {
-		$scope.ViewToken=data.Data;
-	});
 	this.GetPageData = function (page, size) {
 		$scope.loading();
 		$http.post("/post/getpagedata", {

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

@@ -3,7 +3,7 @@
         <button class="btn btn-danger waves-effect" ng-click="add()">
             <span class="glyphicon glyphicon-plus"></span>
         </button>
-        <button class="btn btn-info waves-effect" ng-click="list.GetPageData(paginationConf.currentPage, paginationConf.itemsPerPage);">
+        <button class="btn btn-info waves-effect" ng-click="list.load();">
             <span class="glyphicon glyphicon-refresh"></span>
         </button>
     </div>
@@ -27,6 +27,9 @@
                     </div>
                 </div>
             </td>
+            <td title="'来源次数'" sortable="'Weight'">
+                {{row.Weight}}
+            </td>
             <td title="'白名单'">
                 <label class="el-switch">
                     <input type="checkbox" name="switch" ng-checked="row.Except">
@@ -66,5 +69,4 @@
             </td>
         </tr>
     </table>
-    <tm-pagination conf="paginationConf"></tm-pagination>
 </div>

+ 0 - 6
src/Masuit.MyBlogs.Core/wwwroot/ng-views/views/post/postlist.html

@@ -4,12 +4,6 @@
     }
 </style>
 <div>
-    <div class="pull-left">
-        <h4>
-            文章密码:
-            <span class="text-info">{{ViewToken}}</span>
-        </h4>
-    </div>
     <div class="form-inline pull-right">
         <button class="btn btn-info waves-effect" ng-click="list.GetPageData(paginationConf.currentPage, paginationConf.itemsPerPage);">
             <span class="glyphicon glyphicon-refresh"></span>