您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Discuz X2任务开发教程实例
代云2025-06-29Discuz教程已有人查阅
导读由于公司的需求要在系统中添加任务管理,用户通过完成任务而获得一定的奖励,因此其设计过程需要考虑到:1、由于任务都是在系统中相关功能块处做一些相关事情,比如说在做题系统中
由于公司的需求要在系统中添加任务管理,用户通过完成任务而获得一定的奖励,因此其设计过程需要考虑到:
1、由于任务都是在系统中相关功能块处做一些相关事情,比如说在做题系统中完成指定的试题;在文章系统中发布3篇文章等等,说白了,完成任务就是在这些相关功能块的数据库表中更新一些数据。
2、由的情况,需要对任务进行可扩展配置(How to do?),比如说配置第m单元到第n单元的试题,即配置时要配置相关功能块的数据库表的哪一些字段的值要达到某一个要求或许是总条数达到某一个值。
3、任务完成进度与任务是否完成以及任务访问地址的管理(该访问地址不存在,就需要自己开发)。
简单模型建立
想象一下,假如每一位访问者都要在试题库中做10试题,这很容易完成,我们只需要统计用户所做试题的总数超过10条就行了(条数>10),
问题的关键在于,每一个任务的完成要求字段的值(或许总数)所满足的要求不一样(字段不一样,值不一样,表不一样,统计字段不一样),
Discuz 任务管理
配置任务
source\class\task目录下存放每一个任务文件名格式task_任务名.php,类名与文件名格式相同。
以task_promotion.php为例
其中字段variable即使记录完成条件中所需要的字段名,比如文章数目要达到5,就让表中记录variable=‘文章名’,value='5'
description字段是一个注解,显示在在系统的前台,判断一个用户是否完成,只需要调用scs()方法即可。
注,在discuzX2中,不能配置完成条件的description属性值,系统自带的是 在语言包文件夹下获取的,只需在source\admincp admincp_tasks.php中添加如下代码即可,
1、由于任务都是在系统中相关功能块处做一些相关事情,比如说在做题系统中完成指定的试题;在文章系统中发布3篇文章等等,说白了,完成任务就是在这些相关功能块的数据库表中更新一些数据。
2、由的情况,需要对任务进行可扩展配置(How to do?),比如说配置第m单元到第n单元的试题,即配置时要配置相关功能块的数据库表的哪一些字段的值要达到某一个要求或许是总条数达到某一个值。
3、任务完成进度与任务是否完成以及任务访问地址的管理(该访问地址不存在,就需要自己开发)。
简单模型建立
想象一下,假如每一位访问者都要在试题库中做10试题,这很容易完成,我们只需要统计用户所做试题的总数超过10条就行了(条数>10),
问题的关键在于,每一个任务的完成要求字段的值(或许总数)所满足的要求不一样(字段不一样,值不一样,表不一样,统计字段不一样),
Discuz 任务管理
配置任务
source\class\task目录下存放每一个任务文件名格式task_任务名.php,类名与文件名格式相同。
以task_promotion.php为例
1 if(!defined('IN_DISCUZ')) {
2 exit('Access Denied');
3 }
4
5 class task_promotion {
6
7 var $version = '1.0';
8 var $name = 'promotion_name';
9 var $description = 'promotion_desc';
10 var $copyright = '<a href="http:// .comsenz.com" target="_blank">Comsenz Inc.</a>';
11 var $icon = '';
12 var $period = '';
13 var $periodtype = 0;
14 var $conditions = array(//任务完成的条件
15 'num' => array(
16 'title' => 'promotion_complete_var_iplimit',
17 'type' => 'text',
18 'value' => '',
19 'default' => 100,
20 'sort' => 'complete',
21 ),
22 );
23
24 function preprocess($task) {//任务进度
25 global $_G;
26
27 $promotions = DB::result_first("SELECT COUNT(*) FROM ".DB::table('forum_promotion')." WHERE uid='$_G[uid]'");
28 DB::query("REPLACE INTO ".DB::table('forum_spacecache')." (uid, variable, value, expiration) VALUES ('$_G[uid]', 'promotion$task[taskid]', '$promotions', '$_G[timestamp]')");
29 }
30
31 function csc($task = array()) {//任务是否完成
32 global $_G;
33
34 $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]'");
35 $numlimit = DB::result_first("SELECT value FROM ".DB::table('common_taskvar')." WHERE taskid='$task[taskid]' AND variable='num'");
36 if($num && $num >= $numlimit) {
37 return TRUE;
38 } else {
39 return array('csc' => $num > 0 && $numlimit ? sprintf("%01.2f", $num / $numlimit * 100) : 0, 'remaintime' => 0);
40 }
41 }
42
43 function sufprocess($task) {
44 global $_G;
45
46 DB::query("DELETE FROM ".DB::table('forum_spacecache')." WHERE uid='$_G[uid]' AND variable='promotion$task[taskid]'");
47 }
48
49 }
可见source\class\task目录下的文件皆判断任务的完成状态,通方法csc判断任务是否完成!通常情况下还有任务的访问页面方法,前台调用该方法获得做任务的页面。
function view() {
return lang('task/avatar', 'avatar_view');
}
source\admincp admincp_tasks.php是管理任务的文件,将任务与配置到数据库中
1 $applyperm = $_G['gp_grouplimit'] == 'special' && is_array($_G['gp_applyperm']) ? implode("\t", $_G['gp_applyperm']) : $_G['gp_grouplimit'];
2 $_G['gp_starttime'] = strtotime($_G['gp_starttime']);
3 $_G['gp_endtime'] = strtotime($_G['gp_endtime']);
4 $reward = $_G['gp_reward'];
5 $prize = $_G['gp_prize_'.$reward];
6 $bonus = $_G['gp_bonus_'.$reward];
7 if(!$_G['gp_name'] || !$_G['gp_description']) {
8 cpmsg('tasks_basic_invalid', '', 'error');
9 } elseif(($_G['gp_endtime'] && $_G['gp_endtime'] <= TIMESTAMP) || ($_G['gp_starttime'] && $_G['gp_endtime'] && $_G['gp_endtime'] <= $_G['gp_starttime'])) {
10 cpmsg('tasks_time_invalid', '', 'error');
11 } elseif($reward && (!$prize || ($reward == 'credit' && !$bonus))) {
12 cpmsg('tasks_reward_invalid', '', 'error');
13 }
14 $data = array(
15 'relatedtaskid' => $_G['gp_relatedtaskid'],
16 'available' => 0,
17 'name' => $_G['gp_name'],
18 'description' => $_G['gp_description'],
19 'icon' => $_G['gp_iconnew'],
20 'tasklimits' => $_G['gp_tasklimits'],
21 'applyperm' => $applyperm,
22 'scriptname' => $_G['gp_script'],
23 'starttime' => $_G['gp_starttime'],
24 'endtime' => $_G['gp_endtime'],
25 'period' => $_G['gp_period'],
26 'periodtype' => $_G['gp_periodtype'],
27 'reward' => $reward,
28 'prize' => $prize,
29 'bonus' => $bonus,
30 );
31 $taskid = DB::insert('common_task', $data, 1);
32
33 if(is_array($task_conditions)) {
34 foreach($task_conditions as $taskvarkey => $taskvars) {
35 if($taskvars['title']) {
36 $comment = lang('task/'.$_G['gp_script'], $taskvars['title'].'_comment');
37 $comment = $comment != $taskvars['title'].'_comment' ? $comment : '';
38 //if block add by com.zaodao Jayson.Xie
39 if($comment == ""){
40 $comment = $taskvars['description'];
41 }
42 $data = array(
43 'taskid' => $taskid,
44 'sort' => $taskvars['sort'],
45 'name' => lang('task/'.$_G['gp_script'], $taskvars['title']),
46 'description' => $comment,
47 'variable' => $taskvarkey,
48 'value' => is_array($_G['gp_'.$taskvarkey]) ? addslashes(serialize($_G['gp_'.$taskvarkey])) : $_G['gp_'.$taskvarkey],
49 'type' => $taskvars['type'],
50 );
51 DB::insert('common_taskvar', $data);
52 }
53 }
54 }
55
56 cpmsg('tasks_succeed', "action=tasks", 'succeed');
57
58 }
数据库中分别用两个表来管理任务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 nt插件开发教程
相关教程
图文教程
discuz伪静态设置方法教程
伪静态是一种将动态 URL 转换为静态 URL 的技术。在 Discuz 中设置伪静态的步骤包括:1. 安装伪静态模块;2. 根据系统类型(Nginx 或 Apache),修改服务器配置文件;
怎么用discuz门户,discuz门户是什么
Discuz门户是基于Discuz论坛系统开发的门户 CMS,为社区网站提供了新闻发布、文章管理、自定义页面等功能。使用指南包括:安装Discuz门户插件添加新闻和文章创建自定义
配置Discuz与微信小程序开发环境的步骤介绍
在现代网络开发中,Discuz与微信小程序的结合是一个非常有趣的组合。它们可以让你的社区更加活跃,用户体验更为流畅。那么,如何配置Discuz与微信小程序开发环境呢?
Discuz的NT2.0系统登录整合
在做Discuz!NT 2.0与自己的系统整合过程中,使用的是Discuz!NT 2.0的用户数据作为我的用户数据。把Discuz!NT 2.0文件存放入bbs目录,把bbs目录设置为虚拟目录。把DNT.config拷贝到根目录。
相关源码
-
(PC+WAP)企业管理工程造价资产评估财务审计带留言网站模板本模板基于PbootCMS内核开发,为工程造价咨询、财务审计类企业量身打造,同时支持多行业快速适配。采用PC+WAP双端同步设计,数据实时互通,助您高效展示企业形象与服务能力。查看源码 -
(自适应响应式)HTML5建筑工程公司建筑集团网站模板下载基于PbootCMS内核开发的响应式建筑行业网站模板,为建筑工程公司、建筑集团等企业打造,通过简洁大气的设计风格展现企业专业形象。查看源码 -
深蓝色风景摄影机构网站(自适应多端)pbootcms模板该模板基于PbootCMS内核开发,专为风景摄影机构、户外摄影企业设计,采用深蓝色主题传递专业与艺术感,全栈响应式架构确保PC、平板、手机端无缝适配PHP程序结合轻量级SQLite数据库也可以更换MySQL数据库查看源码 -
(自适应)WordPress主题SEO自媒体博客资讯模板RabbitV2.0Rabbit v2.0主题专注于网站搜索引擎优化需求,为博客、自媒体及资讯类网站提供专业的SEO技术解决方案。该主题从架构设计到功能实现均围绕搜索引擎优化理念展开。查看源码 -
自适应黑色建筑装饰设计公司个人工作室pbootcms模板基于PbootCMS内核开发的黑金风格模板,为建筑装饰、工程设计类企业打造,采用开源架构,支持跨行业快速适配,核心优势如下: 查看源码 -
(自适应响应式)HTML5中小学早教教育机构类网站pbootcms模板下载基于PbootCMS内核开发的响应式模板,为早教中心、培训学校等教育机构打造,提供从技术架构到视觉呈现的全套网站建设方案。查看源码
| 分享笔记 (共有 篇笔记) |