懒得勤快 преди 5 години
родител
ревизия
cd23e2c0bc

+ 5 - 8
src/Masuit.MyBlogs.Core/Controllers/AdvertisementController.cs

@@ -1,8 +1,8 @@
 using AngleSharp.Text;
-using AutoMapper.QueryableExtensions;
 using Masuit.LuceneEFCore.SearchEngine.Linq;
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
+using Masuit.MyBlogs.Core.Infrastructure.Repository;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.DTO;
 using Masuit.MyBlogs.Core.Models.Entity;
@@ -10,7 +10,6 @@ using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.MyBlogs.Core.Models.ViewModel;
 using Masuit.Tools;
 using Masuit.Tools.Core.Net;
-using Masuit.Tools.Models;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore.Internal;
 using System;
@@ -58,17 +57,15 @@ namespace Masuit.MyBlogs.Core.Controllers
                 where = where.And(p => p.Title.Contains(kw) || p.Description.Contains(kw));
             }
 
-            var query = AdsService.GetQuery(where);
-            var total = query.Count();
-            var list = query.OrderByDescending(p => p.Price).ThenByDescending(a => a.Weight).Skip((page - 1) * size).Take(size).ProjectTo<AdvertisementViewModel>(MapperConfig).ToList();
-            var cids = list.Where(m => !string.IsNullOrEmpty(m.CategoryIds)).SelectMany(m => m.CategoryIds.Split(",", StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)).Distinct().ToArray();
+            var list = AdsService.GetQuery(where).OrderByDescending(p => p.Price).ThenByDescending(a => a.Weight).ToCachedPagedList<Advertisement, AdvertisementViewModel>(page, size, MapperConfig);
+            var cids = list.Data.Where(m => !string.IsNullOrEmpty(m.CategoryIds)).SelectMany(m => m.CategoryIds.Split(",", StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)).Distinct().ToArray();
             var dic = CategoryService.GetQuery(c => cids.Contains(c.Id)).ToDictionary(c => c.Id + "", c => c.Name);
-            foreach (var ad in list.Where(ad => !string.IsNullOrEmpty(ad.CategoryIds)))
+            foreach (var ad in list.Data.Where(ad => !string.IsNullOrEmpty(ad.CategoryIds)))
             {
                 ad.CategoryNames = ad.CategoryIds.Split(",").Select(c => dic[c]).Join(",");
             }
 
-            return Ok(new PagedList<AdvertisementViewModel>(list, page, size, total));
+            return Ok(list);
         }
 
         /// <summary>

+ 15 - 17
src/Masuit.MyBlogs.Core/Controllers/HomeController.cs

@@ -1,6 +1,7 @@
 using EFSecondLevelCache.Core;
 using Masuit.LuceneEFCore.SearchEngine.Linq;
 using Masuit.MyBlogs.Core.Extensions;
+using Masuit.MyBlogs.Core.Infrastructure.Repository;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models;
 using Masuit.MyBlogs.Core.Models.DTO;
@@ -52,16 +53,16 @@ namespace Masuit.MyBlogs.Core.Controllers
         [HttpGet, ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "orderBy" }, VaryByHeader = "Cookie")]
         public ActionResult Index()
         {
-            var total = PostService.Count(p => p.Status == Status.Pended || CurrentUser.IsAdmin);
             var banners = AdsService.GetsByWeightedPrice(8, AdvertiseType.Banner).OrderBy(a => Guid.NewGuid()).ToList();
             var fastShares = FastShareService.GetAllFromCache(s => s.Sort).ToList();
             var postsQuery = PostService.GetQuery<PostDto>(p => (p.Status == Status.Pended || CurrentUser.IsAdmin)); //准备文章的查询
-            var posts = postsQuery.Where(p => !p.IsFixedTop).OrderBy(OrderBy.ModifyDate.GetDisplay() + " desc").Take(15).Cacheable().ToList();
+            var posts = postsQuery.Where(p => !p.IsFixedTop).OrderBy(OrderBy.ModifyDate.GetDisplay() + " desc").ToCachedPagedList(1, 15);
+            posts.Data.InsertRange(0, postsQuery.Where(p => p.IsFixedTop).OrderByDescending(p => p.ModifyDate).ToList());
             var viewModel = GetIndexPageViewModel();
             viewModel.Banner = banners;
-            viewModel.Posts = Enumerable.AsEnumerable(postsQuery.Where(p => p.IsFixedTop).OrderByDescending(p => p.ModifyDate)).Union(posts).ToList();
+            viewModel.Posts = posts;
             ViewBag.FastShare = fastShares;
-            ViewData["page"] = new Pagination(1, 15, total, OrderBy.ModifyDate);
+            viewModel.PageParams = new Pagination(1, 15, posts.TotalCount, OrderBy.ModifyDate);
             return View(viewModel);
         }
 
@@ -75,17 +76,16 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("p"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "page", "size", "orderBy" }, VaryByHeader = "Cookie")]
         public ActionResult Post([Optional]OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, int.MaxValue, ErrorMessage = "页大小必须大于0")]int size = 15)
         {
-            var total = PostService.Count(p => p.Status == Status.Pended || CurrentUser.IsAdmin && !p.IsFixedTop);
             var viewModel = GetIndexPageViewModel();
             var postsQuery = PostService.GetQuery<PostDto>(p => (p.Status == Status.Pended || CurrentUser.IsAdmin)); //准备文章的查询
-            var posts = postsQuery.Where(p => !p.IsFixedTop).OrderBy((orderBy ?? OrderBy.ModifyDate).GetDisplay() + " desc").Skip(size * (page - 1)).Take(size).Cacheable().ToList();
+            var posts = postsQuery.Where(p => !p.IsFixedTop).OrderBy((orderBy ?? OrderBy.ModifyDate).GetDisplay() + " desc").ToCachedPagedList(page, size);
             if (page == 1)
             {
-                posts = Enumerable.AsEnumerable(postsQuery.Where(p => p.IsFixedTop).OrderByDescending(p => p.ModifyDate)).Union(posts).ToList();
+                posts.Data.InsertRange(0, postsQuery.Where(p => p.IsFixedTop).OrderByDescending(p => p.ModifyDate).ToList());
             }
 
             viewModel.Posts = posts;
-            ViewData["page"] = new Pagination(page, size, total, orderBy);
+            viewModel.PageParams = new Pagination(1, 15, posts.TotalCount, OrderBy.ModifyDate);
             return View(viewModel);
         }
 
@@ -100,12 +100,11 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("tag/{id}/{page:int?}/{size:int?}/{orderBy:int?}"), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "id", "page", "size", "orderBy" }, VaryByHeader = "Cookie")]
         public ActionResult Tag(string id, [Optional]OrderBy? orderBy, [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]int page = 1, [Range(1, int.MaxValue, ErrorMessage = "页大小必须大于0")]int size = 15)
         {
-            var temp = PostService.GetQuery<PostDto>(p => p.Label.Contains(id) && (p.Status == Status.Pended || CurrentUser.IsAdmin));
-            var posts = temp.OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").Skip(size * (page - 1)).Take(size).Cacheable().ToList();
+            var posts = PostService.GetQuery<PostDto>(p => p.Label.Contains(id) && (p.Status == Status.Pended || CurrentUser.IsAdmin)).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedList(page, size);
             var viewModel = GetIndexPageViewModel();
             ViewBag.Tag = id;
             viewModel.Posts = posts;
-            ViewData["page"] = new Pagination(page, size, temp.Count(), orderBy);
+            viewModel.PageParams = new Pagination(1, 15, posts.TotalCount, OrderBy.ModifyDate);
             return View(viewModel);
         }
 
@@ -122,12 +121,11 @@ 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.Pended || CurrentUser.IsAdmin);
-            var temp = PostService.GetQuery<PostDto>(where);
-            var posts = temp.OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").Skip(size * (page - 1)).Take(size).Cacheable().ToList();
+            var posts = PostService.GetQuery<PostDto>(where).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedList(page, size);
             var viewModel = GetIndexPageViewModel();
             ViewBag.Author = author;
             viewModel.Posts = posts;
-            ViewData["page"] = new Pagination(page, size, temp.Count(), orderBy);
+            viewModel.PageParams = new Pagination(1, 15, posts.TotalCount, OrderBy.ModifyDate);
             return View(viewModel);
         }
 
@@ -144,11 +142,11 @@ 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, int.MaxValue, ErrorMessage = "页大小必须大于0")]int size = 15)
         {
             var cat = await CategoryService.GetByIdAsync(id) ?? throw new NotFoundException("文章分类未找到");
-            var posts = PostService.GetQuery<PostDto>(p => p.CategoryId == cat.Id && (p.Status == Status.Pended || CurrentUser.IsAdmin));
+            var posts = PostService.GetQuery<PostDto>(p => p.CategoryId == cat.Id && (p.Status == Status.Pended || CurrentUser.IsAdmin)).OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToCachedPagedList(page, size);
             var viewModel = GetIndexPageViewModel();
-            viewModel.Posts = posts.OrderBy($"{nameof(PostDto.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").Skip(size * (page - 1)).Take(size).Cacheable().ToList();
+            viewModel.Posts = posts;
             ViewBag.Category = cat;
-            ViewData["page"] = new Pagination(page, size, posts.Count(), orderBy);
+            viewModel.PageParams = new Pagination(1, 15, posts.TotalCount, OrderBy.ModifyDate);
             return View(viewModel);
         }
 

+ 3 - 6
src/Masuit.MyBlogs.Core/Controllers/MergeController.cs

@@ -1,16 +1,14 @@
 using AutoMapper;
-using AutoMapper.QueryableExtensions;
 using Hangfire;
 using Masuit.LuceneEFCore.SearchEngine.Linq;
 using Masuit.MyBlogs.Core.Common;
 using Masuit.MyBlogs.Core.Extensions;
+using Masuit.MyBlogs.Core.Infrastructure.Repository;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.Command;
 using Masuit.MyBlogs.Core.Models.DTO;
 using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
-using Masuit.Tools;
-using Masuit.Tools.Models;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Mvc;
 using System;
@@ -54,9 +52,8 @@ namespace Masuit.MyBlogs.Core.Controllers
                 where = where.And(r => r.Title.Contains(kw) || r.Content.Contains(kw) || r.Modifier.Contains(kw) || r.ModifierEmail.Contains(kw));
             }
 
-            var list = PostMergeRequestService.GetQuery(where).OrderByDescending(d => d.MergeState == MergeStatus.Pending).ThenByDescending(r => r.Id).Skip((page - 1) * size).Take(size).ProjectTo<PostMergeRequestDtoBase>(MapperConfig).ToList();
-            var count = PostMergeRequestService.Count(where);
-            return Ok(new PagedList<PostMergeRequestDtoBase>(list, page, size, count));
+            var list = PostMergeRequestService.GetQuery(where).OrderByDescending(d => d.MergeState == MergeStatus.Pending).ThenByDescending(r => r.Id).ToCachedPagedList<PostMergeRequest, PostMergeRequestDtoBase>(page, size, MapperConfig);
+            return Ok(list);
         }
 
         /// <summary>

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

@@ -1,5 +1,4 @@
-using AutoMapper.QueryableExtensions;
-using EFSecondLevelCache.Core;
+using EFSecondLevelCache.Core;
 using Hangfire;
 using Masuit.LuceneEFCore.SearchEngine.Extensions;
 using Masuit.LuceneEFCore.SearchEngine.Interfaces;
@@ -20,7 +19,6 @@ using Masuit.Tools;
 using Masuit.Tools.Core.Net;
 using Masuit.Tools.DateTimeExt;
 using Masuit.Tools.Html;
-using Masuit.Tools.Models;
 using Masuit.Tools.Security;
 using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Hosting;
@@ -616,10 +614,8 @@ namespace Masuit.MyBlogs.Core.Controllers
                 where = where.And(p => p.Title.Contains(kw) || p.Author.Contains(kw) || p.Email.Contains(kw) || p.Label.Contains(kw) || p.Content.Contains(kw));
             }
 
-            var query = PostService.GetQuery(where);
-            var total = query.Count();
-            var list = query.OrderBy($"{nameof(Post.Status)} desc,{nameof(Post.IsFixedTop)} desc,{orderby.GetDisplay()} desc").Skip((page - 1) * size).Take(size).ProjectTo<PostDataModel>(MapperConfig).ToList();
-            return Ok(new PagedList<PostDataModel>(list, page, size, total));
+            var list = PostService.GetQuery(where).OrderBy($"{nameof(Post.Status)} desc,{nameof(Post.IsFixedTop)} desc,{orderby.GetDisplay()} desc").ToCachedPagedList<Post, PostDataModel>(page, size, MapperConfig);
+            return Ok(list);
         }
 
         /// <summary>

+ 3 - 3
src/Masuit.MyBlogs.Core/Controllers/SeminarController.cs

@@ -6,6 +6,7 @@ using Masuit.MyBlogs.Core.Models.DTO;
 using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.Tools;
+using Masuit.Tools.Models;
 using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Mvc;
 using System;
@@ -45,13 +46,12 @@ namespace Masuit.MyBlogs.Core.Controllers
         public ActionResult Index(int id, [Optional]OrderBy? orderBy, int page = 1, int size = 15)
         {
             var s = SeminarService.GetById(id) ?? throw new NotFoundException("文章未找到");
-            var temp = PostService.GetQuery<PostDto>(p => p.Seminar.Any(x => x.SeminarId == id) && (p.Status == Status.Pended || CurrentUser.IsAdmin));
-            var posts = temp.OrderBy($"{nameof(Post.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").Skip(size * (page - 1)).Take(size).ToList();
+            var posts = PostService.GetQuery<PostDto>(p => p.Seminar.Any(x => x.SeminarId == id) && (p.Status == Status.Pended || CurrentUser.IsAdmin)).OrderBy($"{nameof(Post.IsFixedTop)} desc,{(orderBy ?? OrderBy.ModifyDate).GetDisplay()} desc").ToPagedList(page, size);
             ViewBag.Title = s.Title;
             ViewBag.Desc = s.Description;
             ViewBag.SubTitle = s.SubTitle;
             ViewBag.Ads = AdsService.GetByWeightedPrice(AdvertiseType.PostList);
-            ViewData["page"] = new Pagination(page, size, temp.Count(), orderBy);
+            ViewData["page"] = new Pagination(page, size, posts.TotalCount, orderBy);
             return View(posts);
         }
 

+ 7 - 1
src/Masuit.MyBlogs.Core/Models/ViewModel/HomePageViewModel.cs

@@ -1,5 +1,6 @@
 using Masuit.MyBlogs.Core.Models.DTO;
 using Masuit.MyBlogs.Core.Models.Entity;
+using Masuit.Tools.Models;
 using System.Collections.Generic;
 using System.Linq;
 
@@ -13,7 +14,7 @@ namespace Masuit.MyBlogs.Core.Models.ViewModel
         /// <summary>
         /// 文章列表
         /// </summary>
-        public IList<PostDto> Posts { get; set; }
+        public PagedList<PostDto> Posts { get; set; }
 
         /// <summary>
         /// 网站公告列表
@@ -59,5 +60,10 @@ namespace Masuit.MyBlogs.Core.Models.ViewModel
         /// 列表内广告
         /// </summary>
         public Advertisement ListAdvertisement { get; set; }
+
+        /// <summary>
+        /// 分页参数
+        /// </summary>
+        public Pagination PageParams { get; set; }
     }
 }

+ 5 - 5
src/Masuit.MyBlogs.Core/Views/Seminar/Index.cshtml

@@ -2,7 +2,7 @@
 @using Masuit.MyBlogs.Core.Models.Entity
 @using Masuit.MyBlogs.Core.Models.ViewModel
 @using Masuit.Tools.Core.Net
-@model IList<Masuit.MyBlogs.Core.Models.DTO.PostDto>
+@model Masuit.Tools.Models.PagedList<Masuit.MyBlogs.Core.Models.DTO.PostDto>
 @{
     Layout = "~/Views/Shared/_Layout.cshtml";
     Random r = new Random();
@@ -63,7 +63,7 @@
         </div>
     </div>
     <div class="wrapper-content  animated bounceInUp blog">
-        @if (Model.Any())
+        @if (Model.Data.Any())
         {
             <div class="orderby">
                 <div class="row">
@@ -95,15 +95,15 @@
                     </div>
                 </div>
             </div>
-            var rnd = new Random().Next(2, Model.Count);
-            for (var i = 0; i < Model.Count; i++)
+            var rnd = new Random().Next(2, Model.CurrentCount);
+            for (var i = 0; i < Model.CurrentCount; i++)
             {
                 if (rnd == i && ad != null)
                 {
                     await Html.RenderPartialAsync("_ArticleListAdvertisement", ad);
                 }
 
-                var post = Model[i];
+                var post = Model.Data[i];
                 await Html.RenderPartialAsync(user.IsAdmin ? "_ArticleListItem_Admin" : "_ArticleListItem", post);
             }
         }

+ 6 - 6
src/Masuit.MyBlogs.Core/Views/Shared/_ArticleListPartial.cshtml

@@ -2,12 +2,12 @@
 @model Masuit.MyBlogs.Core.Models.ViewModel.HomePageViewModel
 <div class="col-md-9 box-left">
     <div class="wrapper-content  animated fadeIn blog">
-        @if (Model.Posts.Any())
+        @if (Model.Posts.Data.Any())
         {
             <div class="orderby">
                 <div class="row">
                     <div class="col-md-10 text-center">
-                        @{ await Html.RenderPartialAsync("_Pagination", ViewData["page"]); }
+                        @{ await Html.RenderPartialAsync("_Pagination", Model.PageParams); }
                     </div>
                     <div class="col-md-2">
                         <div class="btn-group pull-right">
@@ -40,15 +40,15 @@
                 </div>
             </div>
 
-            var rnd = new Random().Next(Model.Posts.Count > 2 ? 2 : 0, Model.Posts.Count);
-            for (var index = 0; index < Model.Posts.Count; index++)
+            var rnd = new Random().Next(Model.Posts.CurrentCount > 2 ? 2 : 0, Model.Posts.CurrentCount);
+            for (var index = 0; index < Model.Posts.CurrentCount; index++)
             {
                 if (rnd == index && Model.ListAdvertisement != null)
                 {
                     await Html.RenderPartialAsync("_ArticleListAdvertisement", Model.ListAdvertisement);
                 }
 
-                var post = Model.Posts[index];
+                var post = Model.Posts.Data[index];
                 await Html.RenderPartialAsync("_ArticleListItem", post);
             }
         }
@@ -67,7 +67,7 @@
             }
         }
         <div class="col-md-12 text-center">
-            @{ await Html.RenderPartialAsync("_Pagination", ViewData["page"]); }
+            @{ await Html.RenderPartialAsync("_Pagination", Model.PageParams); }
         </div>
     </div>
 </div>

+ 6 - 6
src/Masuit.MyBlogs.Core/Views/Shared/_ArticleListPartial_Admin.cshtml

@@ -2,12 +2,12 @@
 @model Masuit.MyBlogs.Core.Models.ViewModel.HomePageViewModel
 <div class="col-md-9 box-left">
     <div class="wrapper-content  animated fadeIn blog">
-        @if (Model.Posts.Any())
+        @if (Model.Posts.Data.Any())
         {
             <div class="orderby">
                 <div class="row">
                     <div class="col-md-9 text-center">
-                        @{ await Html.RenderPartialAsync("_Pagination", ViewData["page"]); }
+                        @{ await Html.RenderPartialAsync("_Pagination", Model.PageParams); }
                     </div>
                     <div class="col-md-3">
                         <div class="btn-group pull-right">
@@ -44,15 +44,15 @@
                 </div>
             </div>
 
-            var rnd = new Random().Next(Model.Posts.Count > 2 ? 2 : 0, Model.Posts.Count);
-            for (var index = 0; index < Model.Posts.Count; index++)
+            var rnd = new Random().Next(Model.Posts.CurrentCount > 2 ? 2 : 0, Model.Posts.CurrentCount);
+            for (var index = 0; index < Model.Posts.CurrentCount; index++)
             {
                 if (rnd == index && Model.ListAdvertisement != null)
                 {
                     await Html.RenderPartialAsync("_ArticleListAdvertisement", Model.ListAdvertisement);
                 }
 
-                var post = Model.Posts[index];
+                var post = Model.Posts.Data[index];
                 await Html.RenderPartialAsync("_ArticleListItem_Admin", post);
             }
         }
@@ -71,7 +71,7 @@
             }
         }
         <div class="col-md-12 text-center">
-            @{ await Html.RenderPartialAsync("_Pagination", ViewData["page"]); }
+            @{ await Html.RenderPartialAsync("_Pagination", Model.PageParams); }
         </div>
     </div>
 </div>