纳速健身

标题: Discuz!源代码分析-积分系统代码分析post.php [打印本页]

作者: awagink    时间: 2010-3-13 10:58
标题: Discuz!源代码分析-积分系统代码分析post.php
  Discuz拥有一套完整的积分系统,从3.0来引进了扩展积分的概念,使得定制程度极高,本教程覆盖了Discuz 5.5的积分系统的大部分源代码和实现原理,本文章适合有一定编程基础和开发过全站系统,对系统全局有宏观把握的会员。

这篇文章只是积分系统的一半,也就是平时发帖,附件等等的增减,对于积分交易,我会在不久后再补一篇。


(一)数据表分析

1.cdb_members
用户的积分集中在cdb_members这个表,其中,posts表示帖子数,digestposts表示精华帖,oltime表示在线时间,pageviews表示页面访问量,credits表示积分,extcreditsX为扩展积分

2.cdb_settings
这个表是论坛的设置存放的表,里面有对于积分公式(creditsformula),公式的说明(creditsformulaexp),积分的策略(creditspolicy)(注:这个存放的是一个序列化的数组),积分交易税(creditstax),启用的交易积分(creditstrans),兑换最低余额(exchangemincredits),扩展积分的名字(extcredits)(注:此外也为一个序列化的数组,初始的积分(initcredits),

3.cdb_forumfields
这个表里面记录了论坛的一些设置,包括发帖积分(postcredits),回复积分(replycredits),下载附件积分(getattachcredits),发表附件积分(postattachcredits),加精华积分(digestcredits),这些对应在后台的论坛设置里面都有。

4.cdb_creditslog
这个是积分交易记录表

5.cdb_paymentlog
这个是帖子付费记录表

(二)源代码分析

1.登陆积分显示
首先是登陆,登陆的时候论坛从cdb_members中取出一些发帖数,积分,扩展积分等等设置,在./include/common.inc.php中有如下代码:
复制代码
以上就是取出数据库中的会员用到的字段。

发帖,回复,发附件,下附件等的积分增加或减少

2.发帖,回复积分增减

(1)原理分析:
是这样一个过程,发帖的时候前台看到的文件是:post.php,
然后引用如下文件:
include/common.inc.php  DZ通用函数库
include/post.func.php  发帖用到的函数库
include/discuzcode.func.php  解析Discuz Code用到的

接下来跟据传入的action判断引用到哪个文件继续处理
include/newthread.inc.php(新帖)
include/newreply.inc.php(回复)
include/supesite_import.inc.php(导入到supersite)

(2)代码分析:

下面就以发新帖来分析一下Discuz对于积分的处理。

第一部分:post.php
这个文件是发新帖,回复,投票都会用到的,所以它的作用就是初始化一些全局的东西,我就不全文件分析了,只分析一些与积分有关的部分。
复制代码
这一部分的作用就是取出当前论坛的一些积分设置,和我们前面分析的数据表cdb_forumfields对应,得到会员发帖,回复等加多少分。

第二部分:include/newthread.inc.php
这个文件处理发新帖的特定请求。
复制代码
这一部分的代码是用来判断帖子的类型的,1为投票,2为交易帖,3为悬赏,4为活动,0为普通帖。
复制代码
这里是帖子价格的赋值,超过了最大的价格的处理,特殊帖子的价格处理。
复制代码
前面说过3表示悬赏帖子,那么当你发表成功了一个悬赏帖子后,就会相应在cdb_members表中减少相应的扩展积分,便是上面的代码的作用了。
复制代码
后续判断如果为悬赏帖子的话就往cdb_rewardlog(悬赏记录表)里写入一条记录。
复制代码
如果帖子中带有附件的话,就把附件插入cdb_attachments表,然后注意到$message这一个变量在这里用到了替换,这里的作用是图文混排。接下来往cdb_posts写一条记录,再用include/global.func.php定义到一个函数updatecredits来更新积分。
给Discuz的一个小建议:可以判断是不是postattachcredits为0,为0就可以不执行updatecredits这个函数,虽然在函数定义的时候也有判断,不过在这里判断似乎更好。
复制代码
这里是最后一段代码,作用是这样的:
首先看看是不是在发新帖的时候就被加为文集

3.下载附件积分增减

这一部分主要用到的就是attachment.php这个文件了,下面就来分析这个文件中与积分中有关系的代码:

复制代码
这一段的意思是:当一个附件不是图像的时候,取出该论坛对于下载附件的积分设置,比方说是-5分,那么就调用updatecredits(global.func中定义)这个函数更新一下积分。

P.S.:相关函数分析:

updatepostcredits函数,定义于./include/post.func.php
复制代码
可以看到这个函数有三个传入参数,$operator表示加还是减,$uidarray表示会员的id数组,$creditsarray表示要加减的积分数组。调用方法如:

用法:
复制代码
表示给uid为1的会员加1个积分





欢迎光临 纳速健身 (https://www.nasue.com/) Powered by Discuz! X3.4