首页 > 建站教程 > CMS教程 > dedecms >  dedecms二次开发之点赞功能正文

dedecms二次开发之点赞功能

dedecms二次开发之点赞功能,点赞无需跳转页面,采用ajax无刷新效果,并且同一IP只给赞一次,可以有效防止刷赞。先看下效果图:



1、在dedecms后台的系统->SQL命令工具执行下面的SQL语句,这是在数据库的dede_archives表插入一个zan字段,这个zan字段位于weight后面:
ALTER TABLE dede_archives ADD zan int(11) NOT NULL DEFAULT '0' AFTER weight;
2、在SQL命令工具接着执行下面的语句,这个表是保存被赞的文档aid 及IP的,为了检测是否赞过的IP
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
3、然后在include/extend.func.php 中增加以下函数,用来获取文档被赞次数的
function zan($aid)
{
    global $dsql;
    $row = $dsql->GetOne("Select id,zan From dede_archives where id='".$aid."'");
    return $row['zan'];
}
4、打开模板templets/default/article_article.htm,找到要显示点赞的位置,加入下面的代码(您也可以自定义):
<a class="article-zan" onclick="doDigg(this)" rel="{dede:field.id/}" href="javascript:;" title="赞一个 ">
    <i class="icon iconfont icon-dianzan"></i>
    <span>{dede:field.id function="zan(@me)"/}</span>
</a>
5、css代码
.article-zan{width: 118px; height: 72px; padding-top: 15px; position: relative; display: -webkit-box; display: -ms-flexbox; display: flex; flex-flow: column; -webkit-box-align: center; -ms-flex-align: center; align-items: center; background-color: #0098d7; margin:30px auto; border-radius: 50px; cursor: pointer; -webkit-box-sizing: border-box; box-sizing: border-box;}
.article-zan:hover{opacity: .8;}
.article-zan i{font-size: 25px; color: #fff;}
.article-zan span{color: #fff;}
6、doDigg方法:
function doDigg(thisObj){
    var id = thisObj.getAttribute("rel");
    //ajax无刷新点赞
    $.ajax({
        type:"POST",
        url:"/zan.php",
        data:"id="+id,
        cache:false, //不缓存此页面
        success:function(data){
            thisObj.getElementsByTagName('span')[0].innerHTML = data;
        }
    });
}
7、新建zan.php,放到网站根目录:
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
$ip =getip(); //获取用户IP
$id = $_POST['id'];
if(!isset($id) || empty($id)) exit;
 
//查询已赞过的IP
$dsql->SetQuery("SELECT ip FROM dede_zan  WHERE aid='".$id."' and ip='$ip'");
$dsql->Execute();
$count = $dsql->GetTotalRow();
 
if($count==0){ //如果没有记录
    $dsql->ExecuteNoneQuery("update dede_archives set zan=zan+1 where id='$id'; ");//写入赞数
    $dsql->ExecuteNoneQuery("insert into dede_zan (aid,ip) values ('$id','$ip'); ");//写入IP,及被赞的AID
    $rows = $dsql->GetOne("Select zan  from dede_archives where id='".$id."'");//获取被赞的数量
    $zan = $rows['zan']; //获取赞数值
    echo $zan;
}else{
    echo "赞过了..";
}
至此,您的点赞效果就做好了。

2021-01-05补充:

    以上的赞有bug,原因是如果您的文章时生成的静态html文件,会发现即使赞成功了,下次打开时,赞还是0,因为你并没有更新html。我爱模板网仿照点击次数,对上面的赞进行了改进,每次点赞完后,下次进来会自动显示最新的点赞数:

    1、在网站根目录新建zancount.php,写入下面的代码:
document.write("<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
$rows = $dsql->GetOne("Select zan from dede_archives where id='{$aid}'");
$zan = $rows['zan']; //获取赞数值 
echo $zan;
?>");
    2、在显示赞的位置,也就是上面的第四步,改为下面的代码:
<a class="article-zan" onclick="doDigg(this)" rel="{dede:field.id/}" href="javascript:;" title="赞一个 ">
       <i class="icon iconfont icon-dianzan"></i>
       <span><script type="text/javascript" src="/zancount.php?aid={dede:field.id/}"></script></span>
</a>