Discuz X2任务开发
简单描述
由于公司的需求要在系统中添加任务管理,用户通过完成任务而获得一定的奖励,因此其设计过程需要考虑到:
1、由于任务都是在系统中相关功能块处做一些相关事情,比如说在做题系统中完成指定的试题[1];在文章系统中发布3篇文章等等,说白了,完成任务就是在这些相关功能块的数据库表中更新一些数据。
2、由[1]的情况,需要对任务进行可扩展配置(How to do?),比如说配置第m单元到第n单元的试题,即配置时要配置相关功能块的数据库表的哪一些字段的值要达到某一个要求或许是总条数达到某一个值。
3、任务完成进度与任务是否完成以及任务访问地址的管理(该访问地址不存在,就需要自己开发)。
简单模型建立
想象一下,假如每一位访问者都要在试题库中做10试题,这很容易完成,我们只需要统计用户所做试题的总数超过10条就行了(条数>10),
问题的关键在于,每一个任务的完成要求字段的值(或许总数)所满足的要求不一样(字段不一样,值不一样,表不一样,统计字段不一样),
Discuz 任务管理

配置任务

source\class\task目录下存放每一个任务
文件名格式task_任务名.php,类名与文件名格式相同。
以task_promotion.php为例
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
class task_promotion {
var $version = '1.0';
var $name = 'promotion_name';
var $description = 'promotion_desc';
var $copyright = '<a href="http://www.comsenz.com" target="_blank">Comsenz Inc.</a>';
var $icon = '';
var $period = '';
var $periodtype = 0;
var $conditions = array(//任务完成的条件
'num' => array(
'title' => 'promotion_complete_var_iplimit',
'type' => 'text',
'value' => '',
'default' => 100,
'sort' => 'complete',
),
);
function preprocess($task) {//任务进度
global $_G;
$promotions = DB::result_first("SELECT COUNT(*) FROM ".DB::table('forum_promotion')." WHERE uid='$_G[uid]'");
DB::query("REPLACE INTO ".DB::table('forum_spacecache')." (uid, variable, value, expiration) VALUES ('$_G[uid]', 'promotion$task[taskid]', '$promotions', '$_G[timestamp]')");
}
function csc($task = array()) {//任务是否完成
global $_G;
$num = DB::result_first("SELECT COUNT(*) FROM ".DB::table('forum_promotion')." WHERE uid='$_G[uid]'") - DB::result_first("SELECT value FROM ".DB::table('forum_spacecache')." WHERE uid='$_G[uid]' AND variable='promotion$task[taskid]'");
$numlimit = DB::result_first("SELECT value FROM ".DB::table('common_taskvar')." WHERE taskid='$task[taskid]' AND variable='num'");
if($num && $num >= $numlimit) {
return TRUE;
} else {
return array('csc' => $num > 0 && $numlimit ? sprintf("%01.2f", $num / $numlimit * 100) : 0, 'remaintime' => 0);
}
}
function sufprocess($task) {
global $_G;
DB::query("DELETE FROM ".DB::table('forum_spacecache')." WHERE uid='$_G[uid]' AND variable='promotion$task[taskid]'");
}
}
可见source\class\task目录下的文件皆判断任务的完成状态,通方法csc判断任务是否完成!通常情况下还有任务的访问页面方法,前台调用该方法获得做任务的页面。
function view() {
return lang('task/avatar', 'avatar_view');
}
source\admincp admincp_tasks.php是管理任务的文件,将任务与配置到数据库中
$applyperm = $_G['gp_grouplimit'] == 'special' && is_array($_G['gp_applyperm']) ? implode("\t", $_G['gp_applyperm']) : $_G['gp_grouplimit'];
$_G['gp_starttime'] = strtotime($_G['gp_starttime']);
$_G['gp_endtime'] = strtotime($_G['gp_endtime']);
$reward = $_G['gp_reward'];
$prize = $_G['gp_prize_'.$reward];
$bonus = $_G['gp_bonus_'.$reward];
if(!$_G['gp_name'] || !$_G['gp_description']) {
cpmsg('tasks_basic_invalid', '', 'error');
} elseif(($_G['gp_endtime'] && $_G['gp_endtime'] <= TIMESTAMP) || ($_G['gp_starttime'] && $_G['gp_endtime'] && $_G['gp_endtime'] <= $_G['gp_starttime'])) {
cpmsg('tasks_time_invalid', '', 'error');
} elseif($reward && (!$prize || ($reward == 'credit' && !$bonus))) {
cpmsg('tasks_reward_invalid', '', 'error');
}
$data = array(
'relatedtaskid' => $_G['gp_relatedtaskid'],
'available' => 0,
'name' => $_G['gp_name'],
'description' => $_G['gp_description'],
'icon' => $_G['gp_iconnew'],
'tasklimits' => $_G['gp_tasklimits'],
'applyperm' => $applyperm,
'scriptname' => $_G['gp_script'],
'starttime' => $_G['gp_starttime'],
'endtime' => $_G['gp_endtime'],
'period' => $_G['gp_period'],
'periodtype' => $_G['gp_periodtype'],
'reward' => $reward,
'prize' => $prize,
'bonus' => $bonus,
);
$taskid = DB::insert('common_task', $data, 1);
if(is_array($task_conditions)) {
foreach($task_conditions as $taskvarkey => $taskvars) {
if($taskvars['title']) {
$comment = lang('task/'.$_G['gp_script'], $taskvars['title'].'_comment');
$comment = $comment != $taskvars['title'].'_comment' ? $comment : '';
//if block add by com.zaodao Jayson.Xie
if($comment == ""){
$comment = $taskvars['description'];
}
$data = array(
'taskid' => $taskid,
'sort' => $taskvars['sort'],
'name' => lang('task/'.$_G['gp_script'], $taskvars['title']),
'description' => $comment,
'variable' => $taskvarkey,
'value' => is_array($_G['gp_'.$taskvarkey]) ? addslashes(serialize($_G['gp_'.$taskvarkey])) : $_G['gp_'.$taskvarkey],
'type' => $taskvars['type'],
);
DB::insert('common_taskvar', $data);
}
}
}
cpmsg('tasks_succeed', "action=tasks", 'succeed');
}
数据库中分别用两个表来管理任务
common_task 任务表,记录任务与通用配置信息

【关键点】 common_taskvar 个性化配置信息与任务完成条件的记录(完成条件的每一个字段在该表中用一条记录来存储,因此当判断一个任务是否完成就从该表中取出字段,再到相应的表中去查询、统计以确定是否完成)

其中字段variable即使记录完成条件中所需要的字段名,
比如文章数目要达到5,就让表中记录variable=‘文章名’,value='5'
description字段是一个注解,显示在

在系统的前台,判断一个用户是否完成,只需要调用scs()方法即可。
注,在discuzX2中,不能配置完成条件的description属性值,系统自带的是 在语言包文件夹下获取的,只需在source\admincp admincp_tasks.php中添加如下代码即可,
if($comment == ""){
$comment = $taskvars['description'];
}

在每个该段代码的地方都给加上,
在配置完成条件的时候,就可以用description字段。
var $conditions = array(
'danyuan' => array(
'title' => '完成的题目数大于或等于此设置,才算完成任务!',
'type' => 'text',
'value' => '',
'default' => 100,
'sort' => 'complete',
'description' => 'ssssssssss',
), );
Discuz X2任务开发的更多相关文章
- 解决ngnix服务器上的Discuz!x2.5 Upload Error:413错误
1.修改php.ini sudo nano /etc/php5/fpm/php.ini #打开php.ini找到并修改以下的参数,目的是修改上传限制 max_execution_time = 900 ...
- phpcms V9 整合 Discuz! X2 教程
整合原理: UCenter 作服务端:phpsso 与 Discuz! 分别作 UCenter 的客户端应用:phpsso 与 Discuz! 通过 UCenter 发生交互. phpcms 通过 p ...
- Discuz!X2大附件上传插件-Xproer.HttpUploader6
插件代码(github):https://github.com/1269085759/up6-discuz 插件代码(coding):https://coding.net/u/xproer/p/up6 ...
- Discuz! X2.5判断会员登录状态及外部调用注册登录框
Discuz! X2.5判断会员登录状态及外部调用注册登录框 有关discuz论坛会员信息,收集的一些资料: 用dedecms+discuz做了个门户加论坛形式的网站,但是dedecms顶部目前只能q ...
- 2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程
2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程 所有项目均带有软件,笔记,视频,源码 日期 课程(空内容代表放假) 2015/7/10 星期五 开学典礼 ...
- destoon 深度整合discuz x2 UC 之免邮箱二次验证
destoon中member/my.php,信息发布入口处判断是否已在dx中做了验证,如果已经验证,则不再提示验证,否则其中dt的验证页面. 在home.php.php. group.php. for ...
- DISCUZ X2更换域名注意事项
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- DISCUZ! X2.5设置仅允许QQ登录注册论坛 加固会员注册机制
论坛稍微有点起色之后,很多站长就会担心论坛经常被人恶意灌水.注册机.顶贴机等等一些列非法的手段.通常站长都会通过一些后台的设置和插件等等一 切有效的方法预防,但更多的站长会通过限制用户注册会员,需注册 ...
- discuz二次开发技巧
discuz二次开发技巧 二次开发大多时候知识设置和处理,如果能够获知模板文件获得的变量数组将大大提高我们的开发效率 获取页面已经定义的变量 <--{eval printf_r(get_defi ...
随机推荐
- iOS-性能优化2
性能优化总结2 iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象.还记得12306么,那个速度 ...
- 在 xampp 环境下安装 laravel
网上搜了很多教程,很多都是采用命令行安装的.但是对于web前端来说,根本就不知道在干吗! 于是,打算写一篇文章,来教后面的人如何在 XAMPP 环境下安装 laravel. 初步认识 XAMPP(Ap ...
- mysql关键字与自己设置的字段冲突
当我们设置字段大意的使用数据库关键字,会报与数据库有关错误,原因就是字段误与数据库关键字冲突造成. 解决办法:1.修改字段名字. 2.采用数组的方式进行调用.例如:thinkphp3.2手册中orde ...
- javascript中关于日期和时间的基础知识
× 目录 [1]标准时间 [2]字符串 [3]闰年[4]月日[5]星期[6]时分秒 前面的话 在介绍Date对象之前,首先要先了解关于日期和时间的一些知识.比如,闰年.UTC等等.深入了解这些,有助于 ...
- 机器学习&数据挖掘笔记_22(PGM练习六:制定决策)
前言: 本次实验是将一些简单的决策理论和PGM推理结合,实验内容相对前面的图模型推理要简单些.决策理论采用的是influence diagrams,和常见图模型本质一样, 其中的决策节点也可以用CPD ...
- String.split()用法以及特殊分隔符注意,ps:|
转载:http://www.cnblogs.com/mingforyou/archive/2013/09/03/3299569.html 在java.lang包中有String.split()方法,返 ...
- SQL Server代理(11/12):维护计划作业
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这一系列的上一篇,我们看了使用代理帐户模 ...
- angularJS配合bootstrap动态加载弹出提示内容
1.bootstrp的弹出提示 bootstrap已经帮我们封装了非常好用的弹出提示Popover. http://v3.bootcss.com/javascript/#popovers 2.自定义p ...
- SQ--模糊查询
Between..And --between...and...在数据库内部是做作特殊优化的,执行效率比> and<等这种方式快:--between a and b 相当于:字段>=a ...
- ASP.NET Core 1.0到底是什么?
ASP.NET Core1.0 是微软的下一代ASP.NET框架.我们将ASP.NET升级到最新版本我们会发现最高级的版本是ASP.NET 4.6对应的FrameWork版本是4.6.1. 那么很多人 ...