个人博客文章归档实现

这篇具有很好参考价值的文章主要介绍了个人博客文章归档实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人博客文章归档实现📑

前言

随着博客的文章越来越多,那么归档就显得尤为重要,然后最近也是没什么课,加紧更新一下博客,之前也是更新了评论、留言板。

然后博客是使用的前后的不分离的项目,数据返回一般都是用的.NET的强类型数据返回,也会用到分布视图。

重点是一段sql查询困恼我许久,在后端接口中有详细解释。😓

后端接口的实现

首先,文章归档我实现的思路是根据月份和日期分组降序查询。

思路有了之后,就开始实现。

Service层实现:

首先创建IArcService接口和ArcService类,然后就是继承实现了,看代码:

public interface IArcService
{
    Task<IPagedList<ArcPost>> GetAllAsync(QueryParameters param);
}

下述方法不可取:

public class ArcService:IArcService
{
    private readonly MyDbContext _myDbContext;

    public ArcService(MyDbContext myDbContext)
    {
        _myDbContext = myDbContext;
    }
    public async Task<IPagedList<ArcPost>>GetAllAsync(QueryParameters param)
    {
        var groupKeys = await _myDbContext.posts
            .GroupBy(p => new { p.CreationTime.Year, p.CreationTime.Month })
            .Select(g => new { Year = g.Key.Year, Month = g.Key.Month })
            .OrderByDescending(g => g.Year)
            .ThenByDescending(g => g.Month) 
            .ToListAsync();
        
        var postsByMonth = new List<ArcPost>();
        
        foreach (var key in groupKeys)
        {
            var posts = await _myDbContext.posts
                .Where(p => p.CreationTime.Year == key.Year && p.CreationTime.Month == key.Month)
                .ToListAsync();
        
            postsByMonth.Add(new ArcPost 
            {
                Year = key.Year,
                Month = key.Month,
                Posts = posts
            });
        }
        
        var result = postsByMonth.OrderByDescending(o => o.Year).ToPagedList(param.Page, param.PageSize);
        
        return result;
    }
}

private readonly MyDbContext _myDbContext;是注入EF 上下文服务,用与操作数据库,这里就不细讲了。

然后我在分组查询时出现了一个问题,我原本是这样子写的,重点!!!,正常来说这么写是没问题的

可取的方法:

var query = _myDbContext.posts
    .OrderByDescending(p => p.CreationTime)
    .GroupBy(p => new { p.CreationTime.Year, p.CreationTime.Month })
    .Select(g => new ArcPost
            {
                Year = g.Key.Year,
                Month = g.Key.Month,
                Posts = g.ToList()
            });

var result = await query.ToPagedListAsync(param.Page, param.PageSize);

return result;

但是按上述代码查询会出现如下报错:

摘取报错:

但是他会出现System.InvalidOperationException:无法转换投影中的集合子查询,因为父查询或子查询都没有投影唯一标识它并在客户端正确生成结果所需的必要信息。当尝试关联无钥匙实体类型时,可能会发生这种情况。在“Distinct”之前投影的某些情况下,或者在“GroupBy”的情况下分组键的某些形状也可能发生这种情况。它们应该包含应用该操作的实体的所有键属性,或者只包含简单的属性访问表达式。

然后就是长达1天的bug解决,最后发现升级版本就能解决,我真的是服了。

Posts = g.ToList() 这行代码一直映射不成功,我用的是EF Core 6.0版本,我弄了很久,换了很多种方式,就是映射不出来,然后我升级到EF Core 7.0就不会出现这个问题了。

控制器实现

考虑到后面文章会很多,页面不一次性加载所有,所以用了分页的思想去返回信息,先展示一小部分文章的归档,然后点击加载更多之后,展示后续的归档。

public class ArticleArcController : Controller
{
    private readonly IArcService _arcService;
    private readonly Messages _messages;

    public ArticleArcController(IArcService arcService,Messages messages)
    {
        _arcService = arcService;
        _messages = messages;
    }
    // GET
    public IActionResult Index()
    {
        return View();
    }
    public async Task<IActionResult> GetPageData(int page = 1, int pageSize = 2)
    {
        IPagedList<ArcPost> data = await _arcService.GetAllAsync(new QueryParameters
        {
            Page = page,
            PageSize = pageSize,
        });
        if (data.Count == 0) {
            // 没有更多数据了,返回错误
            return NotFound();
        }
        
        return PartialView("Widgets/ArcBox", data);
    }
}

QueryParameters类就是一个普通的分页参数类
然后分页的插件是X.PagedList,通过Nuget下载即可。

可以看到GetPageData返回的是一个分布视图,后面会讲,上述就是后端的实现,接下来讲解前端的实现。

前端页面实现

Index页面视图

这是一个主视图

<div class="container px-4 py-3">
    <h2 class="d-flex w-100 justify-content-between pb-2 mb-3 border-bottom">
        <div>Article archiving</div>
        <div>文章归档</div>
    </h2>
    <div id="liveAlertPlaceholder"></div>
    <div class="container">
        <div id="data-list">

        </div>
        <div class="ArcBtn" id="ArcBtn">
            <button type="button" class="btn btn-info" id="load-more">加载更多</button>
        </div>
    </div>
</div>

这里主要注意 <div id="data-list">,它将用来加载文章归档的数据

js加载数据

var currentPage = 2;
// 页面加载时渲染第一页的数据
$.ajax({
  url: '/ArticleArc/GetPageData',
  type: 'GET',
  data: { page: 1, pageSize: 2 },
  success: function(data) {
    // 将数据渲染到页面中
    $('#data-list').html(data);
  },
  error: function() {
    // 处理错误
  }
});

这串js代码请求了后端接口,也就是那个返回分部视图的接口,传递的参数页很简单,第一页,显示2条数据。

分布视图展示数据

视图名为ArcBox.cshtml

@model X.PagedList.IPagedList<Personalblog.Model.ViewModels.Arc.ArcPost>
@inject LinkGenerator _generator
@inject IHttpContextAccessor _accessor;

@foreach (var a in @Model)
{
    <div class="Arc">
        <div class="ArcBox toggle-icon" data-bs-toggle="collapse" href="#id_@a.Year@a.Month" aria-expanded="false" aria-controls="collapseExample">
            <div style="width: 100px;margin-left:10px">@a.Year 年 @a.Month 月</div>
            <div style="margin-left: auto;">
                <a class="btn btn-light" role="button">
                    <i class="fa fa-chevron-down cd"></i>
                </a>
            </div>
        </div>
        <div class="collapse" id="id_@a.Year@a.Month">
            <div class="card card-body" style="border:0;padding-bottom:0">
                <ol style="list-style-type: none;margin: 0">
                    @foreach (var ap in a.Posts)
                    {
                        string? url = _generator.GetUriByAction(
                            _accessor.HttpContext!,
                            "Post", "Blog",
                            new { @ap.Id }, "https"
                            );
                        <li>
                            <a href="@url" style="text-decoration: none;">@ap.CreationTime.ToString("MM/dd"):&nbsp;&nbsp;@ap.Title</a>
                        </li>
                    }
                </ol>
            </div>
        </div>
    </div>
}

上述就是分布视图了,也就是数据展示的页面,用的是model强类型去加载数,可以看到上面引入了ArcPost类,它其实就是后端接口返回的那个数据类型。

也就是return PartialView("Widgets/ArcBox", data);中的data

public class ArcPost
{
    public int Year;
    public int Month;
    public List<Post> Posts;
}

上述就是前端关键代码的实现

效果图

个人博客文章归档实现

浏览地址:ZY知识库 · ZY - 文章归档 (pljzy.top)文章来源地址https://www.toymoban.com/news/detail-487504.html

到了这里,关于个人博客文章归档实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你使用Hexo+GitHub搭建个人博客并发布文章(附常见问题解决方法)

    本教程使用GitHub自带的GitHub pages来生成静态个人博客,而Hexo可以更换各种好看的主题,而且都是免费的,花一点时间就可以打造出自己独有的个人博客。 Hexo这个有力的工具可以让我们专注于写出一篇博客而不需要关心如何编写html和CSS,再如何形成一个网站,它可以根据ma

    2024年02月04日
    浏览(63)
  • 个人博客系统|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)

    个人博客系统目录 目录 基于Springboot的个人博客系统设计与实现 一、前言 二、系统功能设计  三、系统实现 1、管理员功能实现 (1)用户管理 (2)文章分类管理 (3)公告信息管理 (4)博主信息管理 2、博主功能实现 (1)博主文章管理 3、用户功能实现 (1)博主文章信

    2024年04月13日
    浏览(47)
  • 个人博客留言板功能实现

    因为这个博客是用的大佬的开源项目,我也是用自己的想法改了很多东西,虽然可能写的不是很好,但是我自己想要的效果实现了,开源项目不就是用来学习的嘛,所以不能一层不变,之前首页改版、评论功能我都没有写文章,这次抽空更新了留言板功能,来水一篇文章。

    2024年02月08日
    浏览(39)
  • 基于java的个人博客系统设计与实现

    基于java的个人博客系统设计与实现 研究背景: 在互联网和信息技术快速发展的时代,人们对于信息交流和知识分享的需求越来越大。个人博客作为一种自由、开放、个性化的信息发布平台,受到了广泛的关注和青睐。个人博客系统的设计和实现也成为了计算机领域中的一个

    2024年02月04日
    浏览(43)
  • 个人博客网站实现微信扫码登录(新)

            在不久之前(两年前)我写了一篇同名的博客《个人博客网站实现微信扫码登录(附源码)》,当时只是做一个记录而已。但是没想到会收到很多“猿友”的私聊, “代码跑不起来”、“实现原理”、“测试网址访问不了” 等各种问题。我也都一一解答了。趁着这

    2024年02月08日
    浏览(59)
  • 基于vuepress快速实现个人博客-github免费部署

    本人代码仓库:https://github.com/Lihua-cpu/BlockPage 个人博客地址:https://lihua-cpu.github.io/BlockPage/ pc展示效果 app展示效果 快速开始同 VuePress 官网: npx npm yarn 官方部署 部署gitee、github是可以的,但是gitee部署需要实名认证,github则不需要. 官网:https://vuepress.vuejs.org/zh/guide/deploy.html#github-p

    2024年02月04日
    浏览(42)
  • Spring boot+Vue博客平台:文章列表展示、文章分类与标签管理模块实现

    本文将详细介绍如何实现博客平台中的文章列表展示、文章分类与标签管理功能,包括前端的Vue组件设计和后端的Spring Boot接口实现。在阅读本文后,您将了解如何设计和实现高效、易用的文章列表展示、文章分类与标签管理功能。 1.设计思路 在设计文章列表展示功能时,我

    2023年04月11日
    浏览(55)
  • 基于NodeJs+Express+MySQL 实现的个人博客完整项目

    目录 一、创建项目并初始化 项目结构 二、安装项目所需要的包 三、创建所需要的数据库表 表 user 用于存放账户密码 表 notepad 用于存放文章数据 表 leaving 用于存放留言板的数据 三、编写app.js文件 1、导入所有需要的包 2、创建web服务器 3、创建db文件夹,在文件夹里面创建

    2024年02月08日
    浏览(51)
  • 使用SpringBoot+SpringMVC+Mybatis+Redis实现个人博客管理平台

    在几个月前实现了一个servlet版本的博客系统,本项目则是在原有基础上进行升级。使用SSM框架、数据库密码使用加盐算法加密、使用Redis对session进行持久化存储从而支持分部式部署、通过拦截器实现用户登录校验、对于数据格式返回以及异常处理进行统一功能处理、增加分页

    2024年02月14日
    浏览(42)
  • Python三百行代码实现一简约个人博客网站(全网最小巧)

    这是全互联网最小巧的博客,没有比这更小的了。虽然小巧,但功能一点儿也不弱,支持文章的分页展示,文章表格,图片和代码语法高亮。文章无限制分类,访问量统计,按时间和按点击量排序,展示最新文章,最热文章,文章留言评论等功能。 如果你也想拥有一个属于自

    2024年02月04日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包