discuz forums.inc.php,【Discuz】积分机制实现解析

本文详细介绍了如何在Discuz论坛中设置积分规则,包括基本积分项目设置、代码解析(如发帖、回复操作的积分增减)、数据库结构和通用积分更新函数。重点展示了如何通过扩展积分实现论坛激励,并提供了关键代码段和数据库表结构参考。
摘要由CSDN通过智能技术生成

1、积分设置

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

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

33c64bf0171f9e12e116f0655b2c1dd4.png

Discuz扩展积分设置

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

1b016f54cbaba82ebc3b67b142c331dc.png

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时弹出下图提示

b8eaaaa967b7bf509639617ffcd7dac9.png

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%'

本博客所有文章如无特别注明均为原创。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值