安企CMS在内容运营中,用户互动是提升网站活跃度的重要一环,而评论功能及其配套的分页显示和点赞功能,无疑是实现这一目标的关键。得益于AnQiCMS灵活的模板引擎和丰富的内置标签,我们可以相对轻松地为网站的文章或产品添加这些功能。
1. 评论功能的基础启用与配置
首先,要确保网站的评论功能处于启用状态。这通常在AnQiCMS的后台管理界面中进行设置,具体位置在“功能管理”下的“内容评论管理”。在这里,你可以开启或关闭评论功能,并配置一些基本规则,例如是否需要审核、是否启用验证码等。开启验证码(参考tag-captcha.md)可以有效防止垃圾评论,提升评论内容的质量。
默认情况下,新提交的评论可能需要经过审核才能在前台显示。在模板中,我们可以根据评论的审核状态(Status字段)进行判断和展示,例如,对正在审核中的评论给出相应的提示。
2. 构建评论列表的模板结构
要在文章详情页(或其他内容详情页)展示评论列表,我们需要使用AnQiCMS提供的commentList模板标签。这个标签能够获取指定文章的评论数据。
假设我们正在一个文档详情页中,当前文档的ID可以通过archiveDetail标签获取,例如{% archiveDetail with name="Id" %}。然后,我们可以将这个ID传递给commentList标签。
以下是一个基本的评论列表模板代码片段,它会遍历并显示评论:
{# 获取当前文章的ID,以便加载其评论 #}
{% archiveDetail archiveId with name="Id" %}
<div class="comment-section">
<h3>用户评论</h3>
{% commentList comments with archiveId=archiveId type="page" limit="10" %}
{% for item in comments %}
{% if item.Status == 1 %} {# 仅显示已审核通过的评论 #}
<div class="comment-item" data-comment-id="{{ item.Id }}">
<div class="comment-header">
<span class="username">{{ item.UserName }}</span>
{% if item.Parent %}
<span class="reply-to">回复 <span class="parent-username">{{ item.Parent.UserName }}</span></span>
{% endif %}
<span class="timestamp">{{ stampToDate(item.CreatedTime, "2006-01-02 15:04") }}</span>
</div>
<div class="comment-content">
{% if item.Parent %}
<blockquote class="reply-quote">
{{ item.Parent.Content|truncatechars:100 }}
</blockquote>
{% endif %}
<p>{{ item.Content }}</p>
</div>
<div class="comment-actions">
<a href="javascript:;" class="like-btn" data-id="{{ item.Id }}">
赞 (<span class="vote-count">{{ item.VoteCount }}</span>)
</a>
<a href="javascript:;" class="reply-btn" data-id="{{ item.Id }}" data-user="{{ item.UserName }}">回复</a>
</div>
</div>
{% else %}
{# 如果评论正在审核中,可以给出提示 #}
<div class="comment-item pending-review">
<div class="comment-header">
<span class="username">{{ item.UserName }}</span>
<span class="timestamp">{{ stampToDate(item.CreatedTime, "2006-01-02 15:04") }}</span>
</div>
<div class="comment-content">
<p>您的评论正在审核中,审核通过后将显示。</p>
</div>
</div>
{% endif %}
{% empty %}
<p class="no-comments">暂无评论,快来发表你的看法吧!</p>
{% endfor %}
{% endcommentList %}
</div>
在上述代码中:
archiveId参数确保我们获取的是当前文章的评论。type="page"是启用分页的关键,它会为pagination标签提供必要的数据。limit="10"设置每页显示10条评论。- 我们通过
item.Status == 1来判断评论是否已通过审核。 item.Parent对象用于处理回复评论的显示,如果存在,则表示该评论是对另一条评论的回复。stampToDate标签用于格式化评论时间,使其更具可读性。
3. 实现评论列表的分页显示
由于在commentList标签中我们设置了type="page",系统会自动生成分页所需的数据。接下来,我们就可以使用pagination标签来显示分页导航了。
紧接着上面的commentList代码块,在{% endcommentList %}之后添加分页代码:
{# ... 前面是评论列表显示代码 ... #}
{# 分页代码 #}
<div class="pagination-container">
{% pagination pages with show="5" %} {# show="5" 表示最多显示5个页码按钮 #}
<ul>
{% if pages.FirstPage.Link %} {# 首页 #}
<li class="page-item {% if pages.FirstPage.IsCurrent %}active{% endif %}">
<a href="{{pages.FirstPage.Link}}">{{pages.FirstPage.Name}}</a>
</li>
{% endif %}
{% if pages.PrevPage %} {# 上一页 #}
<li class="page-item">
<a href="{{pages.PrevPage.Link}}">{{pages.PrevPage.Name}}</a>
</li>
{% endif %}
{% for pageItem in pages.Pages %} {# 中间页码 #}
<li class="page-item {% if pageItem.IsCurrent %}active{% endif %}">
<a href="{{pageItem.Link}}">{{pageItem.Name}}</a>
</li>
{% endfor %}
{% if pages.NextPage %} {# 下一页 #}
<li class="page-item">
<a href="{{pages.NextPage.Link}}">{{pages.NextPage.Name}}</a>
</li>
{% endif %}
{% if pages.LastPage.Link %} {# 尾页 #}
<li class="page-item {% if pages.LastPage.IsCurrent %}active{% endif %}">
<a href="{{pages.LastPage.Link}}">{{pages.LastPage.Name}}</a>
</li>
{% endif %}
</ul>
{% endpagination %}
</div>
pagination标签会创建一个pages对象,其中包含了当前页码、总页数、首页链接、末页链接、上一页链接、下一页链接以及一个包含中间页码的数组。通过遍历这个pages对象,我们可以构建出完整且交互友好的分页导航。
4. 实现评论点赞功能
点赞功能通常需要通过JavaScript(AJAX)与后端进行交互,以实现无刷新更新点赞数量。AnQiCMS提供了评论点赞的API接口。
在评论列表中,每个点赞按钮可以添加一个data-id属性来存储评论的ID,vote-count类来显示点赞数:
<a href="javascript:;" class="like-btn" data-id="{{ item.Id }}">
赞 (<span class="vote-count">{{ item.VoteCount }}</span>)
</a>
然后,你可以编写JavaScript代码来处理点击事件和API请求。这里以jQuery为例:
”`javascript $(document).ready(function() {
// 处理点赞按钮点击事件
$('.comment-actions .like-btn').on('click', function(e) {
e.preventDefault();
const $this = $(this);
const commentId = $this.data('id');
const $voteCountSpan = $this.find('.