织梦DedeCMS增加文章【点赞】功能
在DedeCMS文章增加一个点赞功能,每个IP点限制一次点赞;
测试版本:DedeCMS-V5.7.117-UTF8
一、新增字段
1、在 dede_archives 表中增加【zan】这个字段,加到weight这个字段后边
2、后台 - 系统 - sql命令行工具 - 多行命令 输入以下执行代码
ALTER
TABLE
dede_archives
ADD
zan
int
(11)
NOT
NULL
DEFAULT
'0'
AFTER
weight;
二、新增数据表
1、新增一个表【dede_zan】,这个表是保存被赞的文档aid 及IP的,为了检测是否赞过的IP
2、后台 - 系统 - sql命令行工具 - 多行命令 输入以下执行代码
CREATE
TABLE
IF
NOT
EXISTS `dede_zan` (
`id`
int
(11)
NOT
NULL
AUTO_INCREMENT,
`aid`
int
(11)
NOT
NULL
,
`ip`
varchar
(40)
NOT
NULL
,
PRIMARY
KEY
(`id`)
) ENGINE=MyISAM
DEFAULT
CHARSET=utf8
三、获取文档被赞次数
1、打开【include/extend.func.php】 中增加以下函数,用来获取文档被赞次数的
2、在最下面增加以下代码:
function zan($aid)
{
// 声明使用全局变量 $dsql,用于数据库操作
global $dsql;
// 执行 SQL 查询,从 dede_archives 表中获取指定文章的 id 和 zan 字段
$row = $dsql->GetOne("Select id,zan From dede_archives where id='".$aid."'");
// 返回文章的点赞数
return $row['zan'];
}
四、建立zan.php点赞文件
1、新建一个【zan.php】文件,存放在【/plus/】目录下;
2、zan.php文件代码
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
$ip = getip(); // 获取用户 IP
$id = isset($_GET['aid']) ? $_GET['aid'] : $_POST['id'];
if (!isset($id) || empty($id)) exit;
// 查询已赞过的 IP
$dsql->SetQuery("SELECT ip FROM #@__zan WHERE aid='".$id."' and ip='$ip'");
$dsql->Execute();
$count = $dsql->GetTotalRow();
if ($count == 0) { // 如果没有记录
$dsql->ExecuteNoneQuery("update #@__archives set zan=zan+1 where id='$id'; "); // 写入赞数
$dsql->ExecuteNoneQuery("insert into #@__zan (aid,ip) values ('$id','$ip'); "); // 写入 IP 及被赞的 AID
}
$rows = $dsql->GetOne("Select zan from #@__archives where id='".$id."'"); // 获取被赞的数量
$zan = $rows['zan']; // 获取赞数值
if ($count == 0) {
echo "<i class='fa'>❤</i>点赞($zan)";
} else {
$output = "<script>function showAlert() { alert('您已点过赞!'); }</script>";
$output .= "<i class='fa'>❤</i>点赞($zan)";
$output .= "<script>showAlert();</script>";
echo $output;
}
?>
五、建立zan.count.php调用点赞数文件
1、新建一个【zan.count.php】文件,存放在【/plus/】目录下;
2、zan.count.php文件代码
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
$ip = getip(); // 获取用户 IP
$id = isset($_GET['aid']) ? $_GET['aid'] : $_POST['id'];
if (!isset($id) || empty($id)) exit;
// 查询已赞过的 IP
$dsql->SetQuery("SELECT ip FROM #@__zan WHERE aid='".$id."' and ip='$ip'");
$dsql->Execute();
$count = $dsql->GetTotalRow();
$rows = $dsql->GetOne("Select zan from #@__archives where id='".$id."'"); // 获取被赞的数量
$zan = $rows['zan']; // 获取赞数值
// 判断是否是通过 JS 以 aid 参数请求,若是则直接输出点赞值的 JS 代码
if (isset($_GET['aid'])) {
// 对 $zan 进行 HTML 实体编码,避免特殊字符引发问题
$safeZan = htmlspecialchars($zan, ENT_QUOTES, 'UTF-8');
if ($count == 0) {
echo "document.write('<i class=\'fa\'>♡</i>点赞($safeZan)');";
exit;
} else {
echo "document.write('<i class=\'fa\'>❤</i>点赞($safeZan)');";
exit;
}
}
?>
六、文章模版调用
1、打开文章模板【templets/default/article_article.htm】
2、在<head></head>插入jquery库,你也可以用你本地的库文件;
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
3、在文章模板安装点赞按键,将下面代码插入到你想要显示的地方;
<!-- 点赞 start-->
<div>
<span class="zan"><a href='javascript:void(0);' title="赞一个 " rel="{dede:field.id/}"><script src="{dede:field name='phpurl'/}/zan.count.php?aid={dede:field.id/}" type='text/javascript' language="javascript"></script></a></span>
<script language="javascript" type="text/javascript">
$(function(){
$(".zan a").click(function(){
var zan = $(this);
var id = zan.attr("rel"); //对应id
zan.fadeOut(300); //渐隐效果
$.ajax({
type:"POST",
url:"{dede:field name='phpurl'/}/zan.php",
data:"id="+id,
cache:false, //不缓存此页面
success:function(data){
zan.html(data);
zan.fadeIn(300); //渐显效果
}
});
return false;
});
});
</script>
</div><!-- 点赞 end-->
七、进阶版,可以后台设置文章的点赞初始值
为了让每篇新文章的点赞量初始值有一个随机数值,而不是0,看起来有人气
可以参考【织梦DedeCMS修改文档默认点击量和随机增加量-CSDN博客】这篇文章如何设置初始值;