【Discuz】积分机制实现解析
1、积分设置
在论坛 管理界面》全局》积分设置 里进行积分项目和积分规则的设置。可以用扩展积分来实现诸如热情、威望、贡献、论坛币等论坛激励机制,可设定扩展积分之间的兑换比例,可设置发帖、回复、加精、上传附件等操作需要增加的积分及下载附件等操作需要扣除的积分,并可对不同版面设定不同的积分规则,可谓是灵活自由。
如下图所示,有八个扩展积分可供设置,可用积分名称来命名你希望的名字,如热情、威望、贡献、论坛币等。
如下图所示,可设置各个积分的在发帖、回复等操作时的增加规则。
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时弹出下图提示
另外,在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%'
很有帮助,谢谢
[回复]
对此经常用这些个积分函数的飘过.
[回复]
如果网盘有源码开放的话,就可以搞个下载论坛赚钱了
[回复]
晴枫 8月 25th, 2010 下午7:14 回复:
@Firm, dz不是支持上传下载吗
[回复]