首页 > 其他分享 >.NET6 个人博客-推荐文章加载优化

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

时间:2023-06-21 09:55:05浏览次数:49  
标签:fp await 博客 文章 NET6 post data 加载

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

前言

随着博客文章越来越多,那么推荐的文章也是越来越多,之前推荐文章是只推荐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() {
          // 处理错误
        }
});

实现效果

image

结尾

合理的利用分布视图可以很方便的去展示数据。
关注公众号,一起交流学习~
image

标签:fp,await,博客,文章,NET6,post,data,加载
From: https://www.cnblogs.com/ZYPLJ/p/17495172.html

相关文章

  • 2023-06-20 hexo博客 运行报错:Cannot find module 'hexo' from 'D:\ablog' 提示要rm
    前言:把博客拉到到新电脑,运行hexos报错如下:PSD:\ablog>hexosERRORCannotfindmodule'hexo'from'D:\ablog'ERRORLocalhexoloadingfailedinD:\ablogERRORTryrunning:'rm-rfnode_modules&&npminstall--force'原因:没有装......
  • 代码加载字体以及使用asset中的文件
    AssetManagermanager=this.getAssets();try{manager.open("tahoma.ttf");TextViewtv=(TextView)this.findViewById(R.id.testMe);tv.setTypeface(Typeface.createFromAsset(manager,"tahoma.ttf"));tv.setTextSize(50f);tv.setText(ArabicUtili......
  • WinUI ComboBox加载时不能正常显示绑定属性
    搞WINUI时发现下述问题:ComboBox的item1绑定了一个属性,但是程序在加载完成后,页面上并不能正常显示(已经设置了默认选择为ComboBox绑定属性那个item,但是就不正常);而TextBlock绑定相同的属性,是能正常显示的。 具体现象如下,左红色框中为TextBlock,右蓝色框中为ComboBox。 其xam......
  • 扩展LinearLayout以及从xml中加载menu,selector的使用
    在包.com.test1.android.anim中为什么单独写这个包名要用到publicclassSlidingPanelextendsLinearLayout{ privateintspeed=300; privatebooleanisOpen=false; publicSlidingPanel(finalContextctxt,AttributeSetattrs){ super(ctxt,attrs); TypedArr......
  • asp.net使用sapnco3.x64,未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格
    报错原因:引用了sapnco3.x64的dll之后将web应用程序改为了64位,VS启动报错,未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。造成这种故障的原因是,大部分asp.net编译器和容器并没有默认设置为64位,而是以32位兼容模式运行。如果将程序库更换为32位,则运行......
  • Ribbon-饥饿加载
    Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。 【LoadBalanceClient定义了从可用服务列表中选择一个具体的服务实例进行访问的逻辑】而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:ribbon:eager-load......
  • 博客项目02
    项目名称:云博客屋项目简介:云博客屋软件就是记录日常生活点滴。一款跨平台的简单的快速的个人记事备忘工具,并且能够实现PC、移动设备和云端之间的信息同步,简介高效。将会议记录、日程安排、生活备忘、快乐趣事以及任何心情及突发灵感都可以记录到系统中。本项目包含用户模块、类......
  • 博客项目01
    项目实现演示流程概述:登录--账号、密码(记住密码--系统记住不需要单独)--默认进入首页--个人中心(用户基本信息--昵称、心情、头像)修改(昵称唯一性交互不能和数据库重复,其他个人需要修改)类别管理--将所有列表查询出来(添加按钮跳出不可与原有的重复--唯一性校验--删除\修改--Ajax结合DO......
  • TensorFlow08 神经网络-模型的保存和加载
    一般情况下有三种方式:▪save/loadweights(只保存网络的参数,状态不管)▪save/loadentiremodel(把所有的状态都保存)▪saved_model(交给工厂的时候可以用,可以跨语言)1save/loadweights比如说你的网络里面有[w1,b1,w2,b2,w3,b3]这些参数,我们使用model.save_weights('')可以......
  • 博客的简单美化
    在写博客之前,首先美化一下这个看起来非常普通的博客页面。在申请完博客之后,进入设置界面,首先博客皮肤选择“SimpleMemory”(因为本次改动均是基于此皮肤),然后申请js权限!具体如下图所示: 然后将从网上找的代码复制到博客侧边栏和页面定制CSS代码处,如图注意将个人信息修改为......