安企CMS如何实现文章列表的分页功能和页码显示?

作为一位资深的网站运营专家,我深知一套强大且易用的内容管理系统对于网站成功的关键作用。安企CMS(AnQiCMS)凭借其基于Go语言的高性能架构和灵活的模板机制,在内容发布和管理方面提供了卓越的体验。其中,高效地展示大量内容,尤其是实现文章列表的分页功能,是提升用户体验和网站SEO表现不可或缺的一环。今天,我们就来深入探讨安企CMS如何巧妙地实现这一功能,并展示友好的页码导航。


安企CMS:文章列表分页与页码显示深度解析

在内容爆炸式增长的今天,一个网站如果仅将所有文章堆砌在一个页面上,不仅会造成页面加载缓慢,更会大大降低用户寻找信息的效率,甚至影响搜索引擎的抓取和收录。因此,将文章列表进行分页处理,并提供清晰的页码导航,成为了现代网站运营的标配。安企CMS充分考虑了这一需求,通过其直观的模板标签,让内容分页变得轻而易举。

一、 文章列表的分页魔法:archiveList 标签

安企CMS 的核心能力之一,便是其灵活高效的内容管理。当您的网站内容日益丰富,特别是文章数量达到一定规模时,如何优雅地展示这些内容,同时保证用户体验,就成了运营者需要考量的问题。分页功能应运而生,它能将海量内容划分成若干个页面,让用户可以逐页浏览,避免单页加载过重。

在 AnQiCMS 中,实现文章列表分页的核心在于 archiveList 标签。这个标签专门用于获取文档(即文章或产品)列表。要使其具备分页能力,您需要关注两个关键参数:

  • type="page":这是启用分页功能的“开关”。当您将 type 参数设置为 "page" 时,archiveList 标签就会以分页的形式返回文章数据,而不是一次性返回所有符合条件的文章。
  • limit:这个参数决定了每页显示的文章数量。例如,limit="10" 意味着每页将展示10篇文章。

通过 archiveList 标签,您可以根据多种条件筛选文章,例如按模型ID(moduleId)、分类ID(categoryId)、推荐属性(flag)等,再结合 type="page"limit 参数,即可轻松获取到当前页所需展示的文章列表。

以下是一个 archiveList 标签配合 type="page" 使用的简化示例:

{% archiveList archives with type="page" limit="10" %}
    {% for item in archives %}
    <li>
        <a href="{{item.Link}}">
            <h5>{{item.Title}}</h5>
            <div>{{item.Description}}</div>
            <div>
                <span>{% categoryDetail with name="Title" id=item.CategoryId %}</span>
                <span>{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
                <span>{{item.Views}} 阅读</span>
            </div>
        </a>
        {% if item.Thumb %}
        <a href="{{item.Link}}">
            <img alt="{{item.Title}}" src="{{item.Thumb}}">
        </a>
        {% endif %}
    </li>
    {% empty %}
    <li>
        抱歉,目前该列表还没有任何内容哦。
    </li>
    {% endfor %}
{% endarchiveList %}

在这个例子中,archives 变量将包含当前页的10篇文章数据,通过 for 循环即可遍历并展示每篇文章的标题、简介、分类、发布时间和浏览量等信息。当没有文章时,{% empty %} 标签内的内容会显示,提供友好的提示。

二、 驾驭页码:pagination 标签

光有文章内容列表还不够,用户还需要清晰的导航控件来跳转到不同的页面。这时,pagination 分页标签就派上用场了。它与 archiveList 标签紧密协作,根据 archiveList 生成的分页数据,智能地构建出页码导航链接。

pagination 标签非常简洁,主要通过一个 show 参数来控制页码显示的数量。例如,show="5" 表示最多显示5个连续的页码(如 “1 2 3 4 5” 或 “3 4 5 6 7”)。

pagination 标签内部会提供一个 pages 对象,这个对象内包含了丰富的分页信息,例如:

  • TotalItems:所有文章的总条数。
  • TotalPages:总页码数。
  • CurrentPage:当前所在的页码。
  • FirstPage:首页的对象,包含 Name (如 “首页”) 和 Link (首页链接)。
  • LastPage:末页的对象,包含 Name (如 “末页”) 和 Link (末页链接)。
  • PrevPage:上一页的对象,包含 Name (如 “上一页”) 和 Link (上一页链接)。
  • NextPage:下一页的对象,包含 Name (如 “下一页”) 和 Link (下一页链接)。
  • Pages:一个包含中间页码(如 1, 2, 3…)的数组,每个元素也是一个对象,包含 Name (页码数字), Link (页码链接), IsCurrent (是否当前页)。

利用这些信息,您可以构建出各种样式和布局的页码导航。

三、 将两者融会贯通:完整示例

现在,我们将 archiveListpagination 这两个标签结合起来,展示一个完整且实用的文章列表分页代码结构。

<div class="article-list-section">
    {# 第一步:使用 archiveList 标签获取当前页的文章列表 #}
    {% archiveList articles with type="page" limit="10" %}
        <ul class="article-items">
            {% for item in articles %}
            <li class="article-item">
                <a href="{{item.Link}}" class="article-link">
                    {% if item.Thumb %}
                    <div class="article-thumb">
                        <img alt="{{item.Title}}" src="{{item.Thumb}}">
                    </div>
                    {% endif %}
                    <div class="article-info">
                        <h5 class="article-title">{{item.Title}}</h5>
                        <p class="article-description">{{item.Description}}</p>
                        <div class="article-meta">
                            <span class="category-name">分类: {% categoryDetail with name="Title" id=item.CategoryId %}</span>
                            <span class="publish-date">发布: {{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
                            <span class="views-count">阅读: {{item.Views}}</span>
                        </div>
                    </div>
                </a>
            </li>
            {% empty %}
            <li class="no-articles-found">
                很抱歉,当前分类或筛选条件下没有找到任何文章。
            </li>
            {% endfor %}
        </ul>
    {% endarchiveList %}

    {# 第二步:使用 pagination 标签显示页码导航 #}
    <div class="pagination-nav">
        {% pagination pages with show="5" %}
            <ul class="pagination-list">
                {# 首页链接 #}
                <li class="page-item {% if pages.FirstPage.IsCurrent %}active{% endif %}">
                    <a href="{{pages.FirstPage.Link}}">{{pages.FirstPage.Name}}</a>
                </li>
                {# 上一页链接 #}
                {% if pages.PrevPage %}
                <li class="page-item">
                    <a href="{{pages.PrevPage.Link}}">{{pages.PrevPage.Name}}</a>
                </li>
                {% endif %}
                {# 中间页码链接 #}
                {% for item in pages.Pages %}
                <li class="page-item {% if item.IsCurrent %}active{% endif %}">
                    <a href="{{item.Link}}">{{item.Name}}</a>
                </li>
                {% endfor %}
                {# 下一页链接 #}
                {% if pages.NextPage %}
                <li class="page-item">
                    <a href="{{pages.NextPage.Link}}">{{pages.NextPage.Name}}</a>
                </li>
                {% endif %}
                {# 末页链接 #}
                <li class="page-item {% if pages.LastPage.IsCurrent %}active{% endif %}">
                    <a href="{{pages.LastPage.Link}}">{{pages.LastPage.Name}}</a>
                </li>
            </ul>
            <div class="pagination-summary">
                共计 {{pages.TotalItems}} 篇文章,{{pages.TotalPages}} 页,当前第 {{pages.CurrentPage}} 页
            </div>
        {% endpagination %}
    </div>
</div>

代码解析:

  1. 文章列表获取{% archiveList articles with type="page" limit="10" %} 会从数据库中获取当前页的10篇文章,并将它们赋值给 articles 变量。
  2. 文章遍历显示{% for item in articles %} 循环遍历 articles 变量,显示每篇文章的标题、链接、缩略图