懒得勤快 4 年 前
コミット
5ab23ed95b

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


+ 0 - 10
src/Masuit.MyBlogs.Core/Common/CommonHelper.cs

@@ -178,16 +178,6 @@ namespace Masuit.MyBlogs.Core.Common
             });
         }
 
-        public static AsnResponse GetIPAsn(this string ip)
-        {
-            if (ip.IsPrivateIP())
-            {
-                return new AsnResponse();
-            }
-
-            return Policy<AsnResponse>.Handle<AddressNotFoundException>().Fallback(new AsnResponse()).Execute(() => MaxmindAsnReader.Asn(ip));
-        }
-
         public static AsnResponse GetIPAsn(this IPAddress ip)
         {
             if (ip.IsPrivateIP())

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

@@ -28,7 +28,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <param name="id">广告id</param>
         /// <returns></returns>
-        [HttpGet("{id:int}"), ResponseCache(Duration = 3600)]
+        [HttpGet("/p{id:int}"), HttpGet("{id:int}", Order = 1), ResponseCache(Duration = 3600)]
         public async Task<IActionResult> Redirect(int id)
         {
             var ad = await AdsService.GetByIdAsync(id) ?? throw new NotFoundException("推广链接不存在");

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

@@ -31,6 +31,7 @@ using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore;
+using Microsoft.Net.Http.Headers;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
@@ -95,7 +96,7 @@ namespace Masuit.MyBlogs.Core.Controllers
 
             if (!HttpContext.Request.IsRobot() && string.IsNullOrEmpty(HttpContext.Session.Get<string>("post" + id)))
             {
-                HangfireHelper.CreateJob(typeof(IHangfireBackJob), nameof(HangfireBackJob.RecordPostVisit), args: id);
+                HangfireHelper.CreateJob(typeof(IHangfireBackJob), nameof(HangfireBackJob.RecordPostVisit), args: new dynamic[] { id, ClientIP, Request.Headers[HeaderNames.Referer].ToString() });
                 HttpContext.Session.Set("post" + id, id.ToString());
             }
 

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

@@ -33,6 +33,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         private readonly ISearchEngine<DataContext> _searchEngine;
         private readonly IAdvertisementService _advertisementService;
         private readonly INoticeService _noticeService;
+        private readonly IPostVisitRecordService _recordService;
 
         /// <summary>
         /// hangfire后台任务
@@ -45,7 +46,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         /// <param name="httpClientFactory"></param>
         /// <param name="HostEnvironment"></param>
         /// <param name="searchEngine"></param>
-        public HangfireBackJob(IUserInfoService userInfoService, IPostService postService, ISystemSettingService settingService, ISearchDetailsService searchDetailsService, ILinksService linksService, IHttpClientFactory httpClientFactory, IWebHostEnvironment HostEnvironment, ISearchEngine<DataContext> searchEngine, IAdvertisementService advertisementService, INoticeService noticeService, ILinkLoopbackService loopbackService)
+        public HangfireBackJob(IUserInfoService userInfoService, IPostService postService, ISystemSettingService settingService, ISearchDetailsService searchDetailsService, ILinksService linksService, IHttpClientFactory httpClientFactory, IWebHostEnvironment HostEnvironment, ISearchEngine<DataContext> searchEngine, IAdvertisementService advertisementService, INoticeService noticeService, ILinkLoopbackService loopbackService, IPostVisitRecordService recordService)
         {
             _userInfoService = userInfoService;
             _postService = postService;
@@ -58,6 +59,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
             _advertisementService = advertisementService;
             _noticeService = noticeService;
             _loopbackService = loopbackService;
+            _recordService = recordService;
         }
 
         /// <summary>
@@ -113,7 +115,9 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         /// 文章访问记录
         /// </summary>
         /// <param name="pid"></param>
-        public void RecordPostVisit(int pid)
+        /// <param name="ip"></param>
+        /// <param name="refer"></param>
+        public void RecordPostVisit(int pid, string ip, string refer)
         {
             var post = _postService.GetById(pid);
             if (post == null)
@@ -123,7 +127,17 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
 
             post.TotalViewCount += 1;
             post.AverageViewCount = post.TotalViewCount / Math.Ceiling((DateTime.Now - post.PostDate).TotalDays);
+            _recordService.AddEntity(new PostVisitRecord()
+            {
+                IP = ip,
+                Referer = refer,
+                Location = ip.GetIPLocation(),
+                Time = DateTime.Now,
+                PostId = pid
+            });
             _postService.SaveChanges();
+            var time = DateTime.Now.AddMonths(-3);
+            _recordService.GetQuery(b => b.Time < time).DeleteFromQuery();
         }
 
         /// <summary>

+ 3 - 1
src/Masuit.MyBlogs.Core/Extensions/Hangfire/IHangfireBackJob.cs

@@ -27,7 +27,9 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         /// 文章访问记录
         /// </summary>
         /// <param name="pid"></param>
-        void RecordPostVisit(int pid);
+        /// <param name="ip"></param>
+        /// <param name="refer"></param>
+        void RecordPostVisit(int pid, string ip, string refer);
 
         /// <summary>
         /// 每日任务

+ 5 - 4
src/Masuit.MyBlogs.Core/Infrastructure/DataContext.cs

@@ -22,12 +22,13 @@ namespace Masuit.MyBlogs.Core.Infrastructure
         {
             base.OnModelCreating(modelBuilder);
             modelBuilder.Entity<Category>().HasMany(e => e.Post).WithOne(e => e.Category).OnDelete(DeleteBehavior.Cascade);
-            modelBuilder.Entity<Category>().HasMany(e => e.PostHistoryVersion).WithOne(e => e.Category).OnDelete(DeleteBehavior.Cascade);
+            modelBuilder.Entity<Category>().HasMany(e => e.PostHistoryVersion).WithOne(e => e.Category).HasForeignKey(r => r.CategoryId).OnDelete(DeleteBehavior.Cascade);
 
-            modelBuilder.Entity<Post>().HasMany(e => e.Comment).WithOne(e => e.Post).OnDelete(DeleteBehavior.Cascade);
-            modelBuilder.Entity<Post>().HasMany(e => e.PostHistoryVersion).WithOne(e => e.Post).OnDelete(DeleteBehavior.Cascade);
+            modelBuilder.Entity<Post>().HasMany(e => e.Comment).WithOne(e => e.Post).HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade);
+            modelBuilder.Entity<Post>().HasMany(e => e.PostHistoryVersion).WithOne(e => e.Post).HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade);
             modelBuilder.Entity<Post>().HasMany(e => e.Seminar).WithMany(s => s.Post).UsingEntity(builder => builder.ToTable("SeminarPost"));
-            modelBuilder.Entity<Post>().HasMany(e => e.PostMergeRequests).WithOne(s => s.Post).OnDelete(DeleteBehavior.Cascade);
+            modelBuilder.Entity<Post>().HasMany(e => e.PostMergeRequests).WithOne(s => s.Post).HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade);
+            modelBuilder.Entity<Post>().HasMany(e => e.PostVisitRecords).WithOne().HasForeignKey(r => r.PostId).OnDelete(DeleteBehavior.Cascade);
             modelBuilder.Entity<PostHistoryVersion>().HasMany(e => e.Seminar).WithMany(s => s.PostHistoryVersion).UsingEntity(builder => builder.ToTable("SeminarPostHistoryVersion"));
 
             modelBuilder.Entity<UserInfo>().HasMany(e => e.LoginRecord).WithOne(e => e.UserInfo).OnDelete(DeleteBehavior.Cascade);

+ 1 - 2
src/Masuit.MyBlogs.Core/Infrastructure/Repository/Interface/IBaseRepository.cs

@@ -682,9 +682,8 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
     public partial interface ISystemSettingRepository : IBaseRepository<SystemSetting> { }
 
     public partial interface IUserInfoRepository : IBaseRepository<UserInfo> { }
-    //public partial interface ISeminarPostRepository : IBaseRepository<SeminarPost> { }
-    //public partial interface ISeminarPostHistoryVersionRepository : IBaseRepository<SeminarPostHistoryVersion> { }
     public partial interface IPostMergeRequestRepository : IBaseRepository<PostMergeRequest> { }
     public partial interface IAdvertisementRepository : IBaseRepository<Advertisement> { }
     public partial interface IVariablesRepository : IBaseRepository<Variables> { }
+    public partial interface IPostVisitRecordRepository : IBaseRepository<PostVisitRecord> { }
 }

+ 15 - 0
src/Masuit.MyBlogs.Core/Infrastructure/Repository/Repositories.cs

@@ -239,6 +239,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return t;
         }
     }
+
     public partial class VariablesRepository : BaseRepository<Variables>, IVariablesRepository
     {
         /// <summary>
@@ -252,4 +253,18 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             return t;
         }
     }
+
+    public partial class PostVisitRecordRepository : BaseRepository<PostVisitRecord>, IPostVisitRecordRepository
+    {
+        /// <summary>
+        /// 添加实体
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override PostVisitRecord AddEntity(PostVisitRecord t)
+        {
+            DataContext.Add(t);
+            return t;
+        }
+    }
 }

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

@@ -22,9 +22,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
     public partial interface ISeminarService : IBaseService<Seminar> { }
 
     public partial interface ISystemSettingService : IBaseService<SystemSetting> { }
-
-    //public partial interface ISeminarPostService : IBaseService<SeminarPost> { }
-    //public partial interface ISeminarPostHistoryVersionService : IBaseService<SeminarPostHistoryVersion> { }
     public partial interface IPostMergeRequestService : IBaseService<PostMergeRequest> { }
     public partial interface IVariablesService : IBaseService<Variables> { }
+    public partial interface IPostVisitRecordService : IBaseService<PostVisitRecord> { }
 }

+ 6 - 13
src/Masuit.MyBlogs.Core/Infrastructure/Services/Services.cs

@@ -82,19 +82,6 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         }
     }
 
-    //public partial class SeminarPostService : BaseService<SeminarPost>, ISeminarPostService
-    //{
-    //    public SeminarPostService(IBaseRepository<SeminarPost> repository, ISearchEngine<DataContext> searchEngine, ILuceneIndexSearcher searcher) : base(repository, searchEngine, searcher)
-    //    {
-    //    }
-    //}
-
-    //public partial class SeminarPostHistoryVersionService : BaseService<SeminarPostHistoryVersion>, ISeminarPostHistoryVersionService
-    //{
-    //    public SeminarPostHistoryVersionService(IBaseRepository<SeminarPostHistoryVersion> repository, ISearchEngine<DataContext> searchEngine, ILuceneIndexSearcher searcher) : base(repository, searchEngine, searcher)
-    //    {
-    //    }
-    //}
     public partial class PostMergeRequestService : BaseService<PostMergeRequest>, IPostMergeRequestService
     {
         public PostMergeRequestService(IBaseRepository<PostMergeRequest> repository, ISearchEngine<DataContext> searchEngine, ILuceneIndexSearcher searcher) : base(repository, searchEngine, searcher)
@@ -107,4 +94,10 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         {
         }
     }
+    public partial class PostVisitRecordService : BaseService<PostVisitRecord>, IPostVisitRecordService
+    {
+        public PostVisitRecordService(IBaseRepository<PostVisitRecord> repository, ISearchEngine<DataContext> searchEngine, ILuceneIndexSearcher searcher) : base(repository, searchEngine, searcher)
+        {
+        }
+    }
 }

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

@@ -50,7 +50,7 @@
         <PackageReference Include="OpenXmlPowerTools-NetStandard" Version="4.4.21" />
         <PackageReference Include="MiniProfiler.EntityFrameworkCore" Version="4.2.22" />
         <PackageReference Include="PanGu.HighLight" Version="1.0.0" />
-        <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.1" />
+        <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.2" />
         <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" />

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

@@ -195,6 +195,11 @@ namespace Masuit.MyBlogs.Core.Models.Entity
         /// ÎÄÕÂÐÞ¸ÄÇëÇó
         /// </summary>
         public virtual ICollection<PostMergeRequest> PostMergeRequests { get; set; }
+
+        /// <summary>
+        /// ·ÃÎʼǼ
+        /// </summary>
+        public virtual ICollection<PostVisitRecord> PostVisitRecords { get; set; }
     }
 
     /// <summary>

+ 15 - 0
src/Masuit.MyBlogs.Core/Models/Entity/PostVisitRecord.cs

@@ -0,0 +1,15 @@
+using System;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Masuit.MyBlogs.Core.Models.Entity
+{
+    [Table("PostVisitRecord")]
+    public class PostVisitRecord : BaseEntity
+    {
+        public int PostId { get; set; }
+        public string IP { get; set; }
+        public string Location { get; set; }
+        public string Referer { get; set; }
+        public DateTime Time { get; set; }
+    }
+}

+ 1 - 1
src/Masuit.MyBlogs.Core/Program.cs

@@ -18,7 +18,7 @@ namespace Masuit.MyBlogs.Core
     {
         public static void Main(string[] args)
         {
-            if (!"114.114.114.114".GetIPLocation().Contains("南京"))
+            if (!"114.114.114.114".GetIPLocation().Contains("114DNS", StringComparison.CurrentCultureIgnoreCase))
             {
                 throw new Exception("IP地址库初始化失败,请重启应用!");
             }