个人博客-推荐文章加载优化

前言

随着博客文章越来越多,那么推荐的文章也是越来越多,之前推荐文章是只推荐8篇,但是我感觉有点少,然后也是决定加一个加载按钮,也是类似与分页的效果,点击按钮可以继续加载8篇文章。

我的实现思路

同样使用X.PagedList组件去实现分页效果,通过Nuget下载即可

首先我在Service层新增了一个Task<IPagedList<Post>> GetFeaturedPostsAsync(QueryParameters param)方法

QueryParameters 类主要参数

参数类型 参数名 描述
int MaxPageSize 最大页面条目
int PageSize 页面大小
int Page 当前页面

然后该方法的实现:

/// <summary>
/// 这个查询语句会先加载 featuredPosts 表,然后使用 Include 方法加载文章表 Post,并使用 ThenInclude 方法一次性加载文章的分类和评论。
///注意,我们使用了两个 Include 方法来加载不同的关联表,并使用 ThenInclude 方法来指定要加载的关联表的属性。这样可以避免 EF Core 生成多个 SQL 查询,从而提高查询效率。
///在查询结果中,每个文章对象都包含了它的分类和评论。
/// </summary>
/// <returns></returns>
public async Task<IPagedList<Post>> GetFeaturedPostsAsync(QueryParameters param)
{
var posts =await _myDbContext.featuredPosts
.Include(fp => fp.Post)
.ThenInclude(p => p.Categories)
.Include(fp => fp.Post)
.ThenInclude(p => p.Comments)
.Select(fp => fp.Post)
.OrderByDescending(o => o.CreationTime)
.ToPagedListAsync(param.Page, param.PageSize); //分页加载数据
return posts;
}

控制器

主要是FeaturedPosts字段去加载推荐文章,然后加载第一页,每页八条

public async Task<IActionResult> Index()
{
HomeViewModel homeView = new HomeViewModel()
{
FeaturedPhotos = _fPhotoService.GetFeaturePhotos(),
FeaturedCategories = _fCategoryService.GetFeaturedCategories(),
TopPost = _TopPostService.GetTopOnePost(),
FeaturedPosts = await _PostService.GetFeaturedPostsAsync(new QueryParameters
{
Page = 1,
PageSize = 8,
}),
Links = await _linkService.GetAll(),
Notices = await _noticeService.GetAllAsync(),
FirstLastPost =await _articelsService.FirstLastPostAsync(),
// MaxPost = await _articelsService.MaxPostAsync()
};
return View(homeView);
}

然后我在控制器新增了一个返回分布视图的方法

这个方法是从第2页开始,同样也是展示8条,该方法需要通过前端jquery ajax去调用它

public async Task<IActionResult> GetFeaturedPosts(int page = 2, int pageSize = 8)
{
IPagedList<Post> data = await _PostService.GetFeaturedPostsAsync(new QueryParameters
{
Page = page,
PageSize = pageSize,
});
if (data.Count == 0) {
// 没有更多数据了,返回错误
return NoContent();
} return PartialView("Widgets/FeaturedPostCard", data);
}

前端

这里可以看到加载了一个分布视图并且传入了Model.FeaturedPosts,也就是上面控制里面的FeaturedPosts对象,他是一个IPagedList集合对象

 <div class="row mb-2" id="Home-list">
@await Html.PartialAsync("Widgets/FeaturedPostCard",Model.FeaturedPosts) //数据在这里
</div>
<div class="row justify-content-center">
<div class="col align-self-center text-center">
<div class="ArcBtn" id="HomeBtn">
<button type="button" class="btn"
id="Home-more"
style="background-color:#33c2ff;color:white;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);"
onclick="LoadHome()">加载更多</button>
</div>
</div>

分布视图:然后我们在分布视图中通过foreach去加载它

@using Personalblog.Migrate
@using Microsoft.AspNetCore.Mvc.TagHelpers
@model X.PagedList.IPagedList<Personalblog.Model.Entitys.Post> @foreach (var post in @Model)
{
<div class="col-md-6 box">
<div class="row g-0 border rounded overflow-hidden flex-md-row mb-4 shadow-sm h-md-250 position-relative">
<div class="col p-4 d-flex flex-column position-static">
<strong class="d-inline-block mb-2 text-primary">@post.Categories.Name</strong>
<h5 class="mb-0">@post.Title</h5>
<div class="mb-1 text-muted d-flex align-items-center">
<span class="me-2">@post.LastUpdateTime.ToShortDateString()</span>
<div class="d-flex align-items-center">
<i class="bi bi-eye bi-sm me-1"></i>
<span style="font-size: 0.875rem;">@post.ViewCount</span>
</div>
<span style="width: 10px;"></span> <!-- 这里设置了一个 10px 的间距 -->
<div class="d-flex align-items-center">
<i class="bi bi-chat-square-dots bi-sm me-1"></i>
<span style="font-size: 0.875rem;">@post.Comments.Count</span>
</div>
</div>
<p class="card-text mb-auto">@post.Summary.Limit(50)</p>
<a class="stretched-link"
asp-controller="Blog" asp-action="Post" asp-route-id="@post.Id">
Continue reading
</a>
</div>
<div class="col-auto d-none d-lg-block">
<img class="bd-placeholder-img" alt="" style="width:200px;height: 250px"
src="@Url.Action("GetRandomImage", "PicLib" ,new { seed = post.Id,Width = 800, Height = 1000})">
</div>
</div>
</div>
}

上述内容只能展示8条信息,所以还需要通过ajax去调用GetFeaturedPosts接口去请求第n页的数据。

这里和之前的文章归档的实现其实是一个道理。

var currentPage = 2;
function LoadHome() {
$.ajax({
url: '/Home/GetFeaturedPosts',
type: 'GET',
data: { page: currentPage },
success: function(data,status, xhr) {
// 处理返回的数据
// 更新当前页码
currentPage++;
// 将数据渲染到页面中
$('#Home-list').append(data);
},
error: function() {
// 处理错误
}
});

实现效果

结尾

合理的利用分布视图可以很方便的去展示数据。

关注公众号,一起交流学习~

.NET6 个人博客-推荐文章加载优化的更多相关文章

  1. 我的Android进阶之旅------>经典的大牛博客推荐(排名不分先后)!!

    本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超 ...

  2. cnBlogs博客推荐

      数据结构和算法若可以称为为编程的细胞结构,那设计模式就是编程的灵魂气脉. 一个从是编程的微观演绎,一个是编程的宏观设计.这个从技术和艺术的结合体,毫无疑问是在世界末日之前的很伟大的一项发明. 设计 ...

  3. python3.4学习笔记(七) 学习网站博客推荐

    python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...

  4. 【Android 我的博客APP】1.抓取博客首页文章列表内容——网页数据抓取

    打算做个自己在博客园的博客APP,首先要能访问首页获取数据获取首页的文章列表,第一步抓取博客首页文章列表内容的功能已实现,在小米2S上的效果图如下: 思路是:通过编写的工具类访问网页,获取页面源代码, ...

  5. Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量

    Python并不是我的主业,当初学Python主要是为了学爬虫,以为自己觉得能够从网上爬东西是一件非常神奇又是一件非常有用的事情,因为我们可以获取一些方面的数据或者其他的东西,反正各有用处. 这两天闲 ...

  6. 第 3 篇:实现博客首页文章列表 API

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 此前在讨论基于模板引擎的开发方式和 django-rest-framework 开发 ...

  7. vue加载优化策略

    vue.js是一个比较流行的前端框架,与react.js.angular.js相比来说,vue.js入手曲线更加流畅,不管掌握多少都可以快速上手.但是单页面应用也都有其弊病,有时候首屏加载慢的让人捏舌 ...

  8. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十四)谈谈写博客的原因和项目优化

    阶段总结 又到了优化篇的收尾阶段了,这其实是一篇阶段总结性的文章,今天是4月29号,距离第一次发布博客已经两个月零5天,这两个多月的时间,完成了第一个项目ssm-demo的更新,过程中也写了33篇博客 ...

  9. vue项目首屏加载优化实战

    问题 单页面应用的一个问题就是首页加载东西过多,加载时间过长.特别在移动端,单页面应用的首屏加载优化更是绕不开的话题.下面我会写出我在项目中做的一些优化,希望大家能够相互讨论,共同进步. 我的项目vu ...

  10. Vue SPA 首屏加载优化实践

    写在前面 本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案! 我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui ...

随机推荐

  1. NopCommerce 多数据库方案

    本文转自:http://www.cnblogs.com/YUTOUYUWEI/p/5538200.html 有时候一个项目需要连接多个数据库,以实现不同数据库的数据在同个项目的共享. 如果已经安装了n ...

  2. 005_Orcad里创建Homogeneous分裂元件

    005_Orcad里创建Homogeneous分裂元件 两种类型Homogeneous和Hetergeneous的区别,都是用来把一个复杂的元件分成多个部分来画,不同的是homogeneous画的每部 ...

  3. 【动画进阶】巧用 CSS/SVG 实现复杂线条光效动画

    最近,群里在讨论一个很有意思的线条动画效果,效果大致如下: 简单而言,就是线条沿着不规则路径的行进动画,其中的线条动画可以理解为是特殊的光效. 本文,我们将一起探索,看看在不使用 JavaScript ...

  4. Rails向数据库添加新字段和修改字段

    目录 添加字段 控制台上执行下面的命令 会生成文件db/migrate/20210529131328_add_column_to_black_ips.rb 执行迁移 执行结果 修改字段 添加迁移文件 ...

  5. 超级详细的PostgreSQL创建数据库操作并附带图文

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485195&idx=1 ...

  6. 详解Python 中可视化数据分析工作流程

    本文分享自华为云社区<Python 可视化数据分析从数据获取到洞见发现的全面指南>,作者:柠檬味拥抱. 在数据科学和分析的领域中,可视化是一种强大的工具,能够帮助我们理解数据.发现模式,并 ...

  7. 记录一次安装PIDtoolBox报缺少jvm.dll问题。

    背景: 1.在安装PIDtoolBox时,报 安装程序错误 安装程序无法启动JVM. could not find file C:\Users\AdministratorAppData\Local\M ...

  8. Java简单实现MQ架构和思路02

    Java MQ的100个功能清单 有重复的 一个消息队列(MQ)可以有以下功能: 批量发送消息:允许将多个消息打包成一个批次发送,可以减少网络传输开销和提高系统吞吐量. 消息过期时间:消息可以设置一个 ...

  9. Istio(十二):Istio问题排查

    目录 一.模块概览 二.Envoy基础 2.1 Envoy 基础 三.Envoy示例 四.调试备忘录 4.1 配置 4.2 运行时 4.3 检查 Envoy 日志 4.4 配置 istiod 日志 一 ...

  10. centos 7网卡配置文件详解(ifcfg-ens33)

    centos 7网卡配置文件详解(ifcfg-ens33) [root@xuegod63 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE ...