【Discuz】积分机制实现解析

    1、积分设置 

    在论坛 管理界面》全局》积分设置 里进行积分项目和积分规则的设置。可以用扩展积分来实现诸如热情、威望、贡献、论坛币等论坛激励机制,可设定扩展积分之间的兑换比例,可设置发帖、回复、加精、上传附件等操作需要增加的积分及下载附件等操作需要扣除的积分,并可对不同版面设定不同的积分规则,可谓是灵活自由。 

    如下图所示,有八个扩展积分可供设置,可用积分名称来命名你希望的名字,如热情、威望、贡献、论坛币等。

    Discuz扩展积分设置

    Discuz扩展积分设置



    如下图所示,可设置各个积分的在发帖、回复等操作时的增加规则。

    Discuz 扩展积分增加策略

    Discuz 扩展积分增加策略

    2、代码解析 

    以发一个回复为例,看一下加积分的过程。 

    1) 在post.php中找到以下代码段:  

    $postcredits = $forum['postcredits'] ? $forum['postcredits'] : $creditspolicy['post'];
    $replycredits = $forum['replycredits'] ? $forum['replycredits'] : $creditspolicy['reply'];
    $digestcredits = $forum['digestcredits'] ? $forum['digestcredits'] : $creditspolicy['digest'];
    $postattachcredits = $forum['postattachcredits'] ? $forum['postattachcredits'] : $creditspolicy['postattach'];

    说明:以上代码是读取积分规则,各行分别对应发帖、回复、加精、上传附件对应的加分规则,回复规则只看第二行;从代码可以看出,论坛版块的积分规则优先于全局的积分规则。这个规则也就是上面我们在积分设置里设定的。 

    2) 在include/newreply.inc.php中找到一下分别找到以下两行代码: 

    checklowerlimit($replycredits);

    该行为检测增减的积分下限是否符合系统设定,如不符合会给出警告消息;各项积分的操作下限在积分设置中设定;checklowerlimit($creditsarray, $coef = 1)函数定义位于include/global.func.php中。 

    updatepostcredits('+', $discuz_uid, $replycredits);

    该行对积分进行更新操作,并通过Cookie通知界面弹出积分增减提示;updatepostcredits($operator, $uidarray, $creditsarray)函数定义位于include/post.func.php中。 

    3) 在include/post.func.php的updatepostcredits函数定义中找到以下一行: 

    dsetcookie('discuz_creditnotice', implode('D', $cookiecredits).'D'.$discuz_uid, 43200, 0);

    该行即是通过设置discuz_creditnotice的Cookie值来通知界面弹出积分增减提示的;discuz_creditnotice值为用D做分隔符的数字组合字符串,共10个数字,第0个为0无意义,第1到第8个数字依次对应为各个扩展积分变化的数值,即extcredits1~extcredits8,如不为0则会在界面弹出积分变化提示,第10个数字为当前的用户编号。例如discuz_creditnotice=0D5D-1D1D0D0D0D0D0D1时弹出下图提示 

    Discuz积分增加提示

    Discuz积分增加提示

    另外,在include/global.func.php中找到function updatecredits($uids, $creditsarray, $coef = 1, $extrasql = '')函数,同样是用于更新积分的,更加通用;其中$uids为逗号分隔的用户编号字符串,$creditsarray为积分操作规则数组,$coef为积分系数, $extrasql为执行积分UPDATE操作sql语句补充部分。用到的话看一下源码会更清楚。举两个例子:

    updatecredits($discuz_uid, $postattachcredits, count($attachments));
    updatecredits(“1,2,3", array(2=>1,4=>-2), 3);

    第一句摘自include/newreply.inc.php,为上传附件时对$discuz_uid用户以$postattachcredits的积分规则数组乘上附件数量的倍数来进行积分更新;第二句为对用户编号为1、2、3的用户的extcredits2积分项增加1*3分,对extcredits4积分项增加-2*3分。

    3、数据库说明 

    用户的积分和扩展积分存于cdb_members表,字段为credits、extcredits1、extcredits2、...、extcredits8,分别对应用户积分和8个扩展积分。 

    论坛版块的积分规则位于cdb_forumfields表,字段为postcredits、replycredits、getattachcredits、postattachcredits字段,分别对应发帖、回复、下载附件、上传附件的积分规则。 

    系统全局设置中积分设置信息位于cdb_settings表,variable中包含credit字符的表项,可以用以下SQL语句查出 

    SELECT * FROM `cdb_settings` WHERE `variable` LIKE '%credit%'


    本博客所有文章如无特别注明均为原创。
    复制或转载请以超链接形式注明转自枫芸志,原文地址《【Discuz】积分机制实现解析
    标签:
    分享:

已经有4 条评论抢在你前面了~

  1. 沙发
    zh672903 2010年10月25日 下午12:51

    很有帮助,谢谢

    [回复]

  2. 板凳
    shy9000 2010年8月31日 下午2:57

    对此经常用这些个积分函数的飘过.

    [回复]

  3. 地板
    Firm 2010年8月25日 下午4:04

    如果网盘有源码开放的话,就可以搞个下载论坛赚钱了

    [回复]

    晴枫

    晴枫 回复:

    @Firm, dz不是支持上传下载吗

    [回复]

无觅相关文章插件,快速提升流量