admin 發表於 2016-2-28 11:08:17

Discuz!X3.2 用户积分系统二次开发简介

Discuz 内置了一套比较完善的用户积分系统。通过积分系统可以将用户的日常行为转化为一些可以量化的指标,一方面提高了用户粘性,另一方面也为运营提供了相应的数据支撑。本文将简要介绍 Discuz 内置的用户积分系统的工作原理。

Discuz!X 3.2 后台全局设置下可以配置站点的积分策略,在积分基本设置中我们可以看到,Discuz 内置了 8 种扩展积分类型,分别是 extcredits1~extcredits8。用户可以自定义属性的名称,比如:经验、金币、体力等等。总积分由管理员设定的公式计算得到,公式中的变量由以上八种扩展积分和用户行为统计共同决定,具体如何决定取决于公式如何写,比如系统默认的积分计算公式是:
发帖数+精华帖数*5+威望*2+金钱+贡献
posts+digestposts*5+extcredits1*2+extcredits2+extcredits3用户行为统计支持:发帖数、主题数、精华帖数、在线时间、好友数、记录数、日志数、相册数、分享数等等。

在积分策略设置可以设置用户行为对应的扩展积分奖励,奖励仅限于处于开启状态的扩展积分,默认仅开启了 extcredits1~extcredits3。每个用户行为对应的奖励可以细化到“一次性”、“每天”、“每小时” 或 “间隔多少分钟” 等类型,以及每次奖励的具体数值。


对于二次开发而言,系统后台并没有提供增加用户行为的方法,因此只能通过代码实现。

实例:需要对微信用户分享到朋友圈的行为进行相关的积分奖励。以下是具体实现步骤:

1、创建一条积分策略规则。
C::t("common_credit_rule")->insert(array(
      'rulename' => '分享到朋友圈',
      'action' => 'wxsharetimeline',
));代码解释:
common_credit_rule 是积分策略规则表
rulename 是此条积分规则的名称
action 是系统用于识别此条规则的唯一ID


当然也可以通过 phpmyadmin 这类数据库 Web 管理接口直接在表 common_credit_rule 中创建一条记录。完成后,在 Discuz 系统后台的积分策略中就能看见此条策略,然后通过 Discuz 后台UI设置对应的奖励周期和每次奖励的数值即可。

2、使用微信 JS-SDK 联动用户的分享行为,即当用户将相关应用页面分享到朋友圈后,执行步骤1所创建的积分规则。参考代码如下:

wx.onMenuShareTimeline({
      title: '', // 分享标题
      link: '', // 分享链接
      imgUrl: '', // 分享图标
      success: function () {
                // 用户确认分享后执行的回调函数
                $.ajax({
                        type : 'GET',
                        url : 'plugin.php?id=yourpluginid&mod=credit&act=wxsharetimeline',
                        dataType : 'xml'
                });
      },
      cancel: function () {
      // 用户取消分享后执行的回调函数
      }
});代码解释:
本段代码来自微信 JS-SDK 说明文档,onMenuShareTimeline 用于匹配用户分享到朋友圈的行为,分享成功后会自动执行 success 下的代码。这里我们使用 ajax 实现, 本代码中 success 下的代码采用的是 jQuery 的 Ajax 写法,参数 url 则是服务端用于处理积分更新的地址。


3、服务端执行更新操作
$rule = updatecreditbyaction('wxsharetimeline', $uid);服务端执行积分更新操作的核心代码只有一条,就是调用函数 updatecreditbyaction,此函数只要加载了 Discuz 内核即可执行。第一个参数则是需要用到的积分策略规则的 action 值,第二个参数是更新哪一个用户的数据。这两个参数为必填。如果同时还行更新用户的分享次数,则可以通过增加第三个参数实现,参考代码如下:
$rule = updatecreditbyaction('wxsharetimeline', $uid, array('sharings' => 1));sharings 是表 common_member_count 中的字段,后面的数字是本次需要更新的值,1 表示 +1 操作。

完成以上三步,就能针对用户分享到朋友圈的行为进行相关的奖励。但是以上操作仅仅进行了积分数据的更新操作,而不能实现用户的积分变化的历史记录。

4、实现积分变动记录,则还需要同步更新 common_credit_log 以及 common_credit_log_field 等数据表。参考代码如下:

include_once libfile('function/credit');
credit_log( $uid, 'TSK', $rule['rid'], array('extcredits2' => 100), 'ShareTimeLine', 'Share to Weixin Timeline');
代码解释:
Discuz 通过内置函数 credit_log 来实现积分变动的历史记录功能,使用改函数前需加载 function_credit.php 库文件。
函数原型如下:
credit_log($uids, $operation, $relatedid, $data, $customtitle, $custommemo)$uids 为用户ID,可以是多用户ID的数组,也可以是单个用户ID值,当为数组的时候表示对多个用户执行了相同的积分变动。
$operation 是用户自定义操作类型,只能是 varchar 类型,即类似与 “TSK” 的三个字符组成的短字符串,用于标识积分变动的类型。
$relatedid 是本次积分变动相关的ID号,可以根据实际情况使用用户ID,或者 credit_rule 的 ID。
$data 则是本次积分变动更新的具体积分项目,只能是系统内置的扩展积分项,即:extcredits1~extcredits8。
$customtitle, $custommemo 此两个参数可以省略,如果设置了此参数,则会同时更新表 common_credit_log_field,用于记录本次积分更新操作的用户自定义的更新原因,其中 customtitle 是标题, custommemo 是具体描述。








頁: [1]
查看完整版本: Discuz!X3.2 用户积分系统二次开发简介