找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1850|回复: 0

[知识库] Discuz!X3.2 用户积分系统二次开发简介

[复制链接]
发表于 2021-7-27 15:04:48 | 显示全部楼层 |阅读模式 来自 中国–河南–新乡
Discuz 内置了一套比较完善的用户积分系统。通过积分系统可以将用户的日常行为转化为一些可以量化的指标,一方面提高了用户粘性,另一方面也为运营提供了相应的数据支撑。本文将简要介绍 Discuz 内置的用户积分系统的工作原理。

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


用户行为统计支持:发帖数、主题数、精华帖数、在线时间、好友数、记录数、日志数、相册数、分享数等等。

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


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

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

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


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

2、使用微信 JS-SDK 联动用户的分享行为,即当用户将相关应用页面分享到朋友圈后,执行步骤1所创建的积分规则。参考代码如下:
  1. wx.onMenuShareTimeline({
  2.         title: '', // 分享标题
  3.         link: '', // 分享链接
  4.         imgUrl: '', // 分享图标
  5.         success: function () {
  6.                 // 用户确认分享后执行的回调函数
  7.                 $.ajax({
  8.                         type : 'GET',
  9.                         url : 'plugin.php?id=yourpluginid&mod=credit&act=wxsharetimeline',
  10.                         dataType : 'xml'
  11.                 });
  12.         },
  13.         cancel: function () {
  14.         // 用户取消分享后执行的回调函数
  15.         }
  16. });
复制代码
代码解释:
本段代码来自微信 JS-SDK 说明文档,onMenuShareTimeline 用于匹配用户分享到朋友圈的行为,分享成功后会自动执行 success 下的代码。这里我们使用 ajax 实现, 本代码中 success 下的代码采用的是 jQuery 的 Ajax 写法,参数 url 则是服务端用于处理积分更新的地址。


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

sharings 是表 common_member_count 中的字段,后面的数字是本次需要更新的值,1 表示 +1 操作。

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

4、实现积分变动记录,则还需要同步更新 common_credit_log 以及 common_credit_log_field 等数据表。参考代码如下:
  1. include_once libfile('function/credit');
  2. credit_log( $uid, 'TSK', $rule['rid'], array('extcredits2' => 100), 'ShareTimeLine', 'Share to Weixin Timeline');
复制代码

代码解释:
Discuz 通过内置函数 credit_log 来实现积分变动的历史记录功能,使用改函数前需加载 function_credit.php 库文件。
函数原型如下:
  1. credit_log($uids, $operation, $relatedid, $data, $customtitle, $custommemo)
复制代码

$uids 为用户ID,可以是多用户ID的数组,也可以是单个用户ID值,当为数组的时候表示对多个用户执行了相同的积分变动。
$operation 是用户自定义操作类型,只能是 varchar[3] 类型,即类似与 “TSK” 的三个字符组成的短字符串,用于标识积分变动的类型。
$relatedid 是本次积分变动相关的ID号,可以根据实际情况使用用户ID,或者 credit_rule 的 ID。
$data 则是本次积分变动更新的具体积分项目,只能是系统内置的扩展积分项,即:extcredits1~extcredits8。
$customtitle, $custommemo 此两个参数可以省略,如果设置了此参数,则会同时更新表 common_credit_log_field,用于记录本次积分更新操作的用户自定义的更新原因,其中 customtitle 是标题, custommemo 是具体描述。

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-12-23 16:21 , Processed in 0.045042 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表