功能解析

home模块很庞大,包含了discuz论坛和用户信息相关的几乎所有功能,比如动态、消息、勋章、道具等等,有的功能还分为很多小功能,下面列出home模块基本的组成:

子模块 说明
space 用户个人空间相关的功能,如活动、相册、日志、收藏、好友、分享、悬赏等等
spacecp 用户个人空间相关功能的改动,如添加好友、发日志、收藏帖子等等
misc
magic 道具相关
editor 编辑器
invite 邀请相关
task 任务相关,如任务列表、申请任务、获取奖励、放弃任务等功能
medal 勋章相关,如勋章列表、申请勋章等功能
rss 网站信息聚合页
follow 广播相关

下面我们分别分析home模块的各个子模块:

rss模块

访问连接:home.php?mod=rss

此处的rss应该是指Really Simple Syndication(简易信息聚合),输出网站的信息和对应用户的个人动态信息(blog):

//输出网站信息
echo    "<?xml version=\"1.0\" encoding=\"".$charset."\"?>\n"."<rss version=\"2.0\">\n"."  <channel>\n"."    <title>{$space[username]}</title>\n"."    <link>{$space[space_url]}</link>\n"."    <description>{$_G[setting][bbname]}</description>\n"."    <copyright>Copyright(C) {$_G[setting][bbname]}</copyright>\n"."    <generator>Discuz! Board by Comsenz Inc.</generator>\n"."    <lastBuildDate>".gmdate('r', TIMESTAMP)."</lastBuildDate>\n"."    <image>\n"."      <url>{$_G[siteurl]}static/image/common/logo_88_31.gif</url>\n"."      <title>{$_G[setting][bbname]}</title>\n"."      <link>{$_G[siteurl]}</link>\n"."    </image>\n";//输出用户个人动态,$data_blog是根据uid在home_blog表中获取的
//$data_blog = C::t('home_blog')->range(0, $pagenum, 'DESC', 'dateline', 0, null, $uid);
foreach($data_blog as $curblogid => $value) {$value = array_merge($value, (array)$data_blogfield[$curblogid]);$value['message'] = getstr($value['message'], 300, 0, 0, 0, -1);if($value['pic']) {$value['pic'] = pic_cover_get($value['pic'], $value['picflag']);$value['message'] .= "<br /><img src=\"$value[pic]\">";}echo    "    <item>\n"."      <title>".$value['subject']."</title>\n"."      <link>$_G[siteurl]home.php?mod=space&amp;uid=$value[uid]&amp;do=blog&amp;id=$value[blogid]</link>\n"."      <description><![CDATA[".dhtmlspecialchars($value['message'])."]]></description>\n"."      <author>".dhtmlspecialchars($value['username'])."</author>\n"."      <pubDate>".gmdate('r', $value['dateline'])."</pubDate>\n"."    </item>\n";
}echo   "  </channel>\n"."</rss>";

medal模块

访问连接:home.php?mod=medal

medal模块即勋章模块,这个模块分别有以下几个功能(对应到action字段):

action 功能
action为空的情况下显示所有可用勋章列表
log 显示我的勋章列表
confirm 显示申请勋章窗口
apply 确认申请勋章

进入medal模块,就有一句缓存相关的调用,从common_syscache表中取出medals的缓存并存入全局变量$_G[‘cache’][$cachename]中,以便取用。

loadcache('medals');

展示所有勋章

展示所有勋章的代码如下,我添加了注释说明:

include libfile('function/forum');
$medalcredits = array();
//在forum_medal表中获取所有勋章并遍历
foreach(C::t('forum_medal')->fetch_all_data(1) as $medal) {//勋章获取权限,如金钱>100、威望>100等$medal['permission'] = medalformulaperm(serialize(array('medal' => dunserialize($medal['permission']))), 1);//勋章也可设置为可使用积分、威望等值购买if($medal['price']) {$medal['credit'] = $medal['credit'] ? $medal['credit'] : $_G['setting']['creditstransextra'][3];$medalcredits[$medal['credit']] = $medal['credit'];}$medallist[$medal['medalid']] = $medal;
}
//在common_member_field_forum表中获取当前用户已获得的勋章列表
$memberfieldforum = C::t('common_member_field_forum')->fetch($_G['uid']);
$membermedal = $memberfieldforum['medals'] ? explode("\t", $memberfieldforum['medals']) : array();
$membermedal = array_map('intval', $membermedal);$lastmedals = $uids = array();
//在forum_medallog表中获取最后10条勋章发放/获取记录
foreach(C::t('forum_medallog')->fetch_all_lastmedal(10) as $id => $lastmedal) {$lastmedal['dateline'] = dgmdate($lastmedal['dateline'], 'u');$lastmedals[$id] = $lastmedal;$uids[] = $lastmedal['uid'];
}
//获取最后10条勋章发放记录相关用户的信息
$lastmedalusers = C::t('common_member')->fetch_all($uids);
//获取当前登录用户已获得的所有勋章列表,此处的勋章列表和前面的变量$membermedal重复了,暂时不知道二者的区别
$mymedals = C::t('common_member_medal')->fetch_all_by_uid($_G['uid']);

log–我的勋章

我的勋章列表的实现代码与展示所有勋章的实现代码基本一致,唯一不同的就是勋章获取记录显示的是个人的记录,所以此处就不展开分析了。

comfirm–申请勋章窗口

include libfile('function/forum');
//获取所有勋章列表
$medal = C::t('forum_medal')->fetch($_GET['medalid']);
//获取勋章权限和价格
$medal['permission'] = medalformulaperm(serialize(array('medal' => dunserialize($medal['permission']))), 1);
if($medal['price']) {$medal['credit'] = $medal['credit'] ? $medal['credit'] : $_G['setting']['creditstransextra'][3];$medalcredits[$medal['credit']] = $medal['credit'];
}
include template('home/space_medal_float');

confirm功能通过上面的代码获取勋章的详细信息,并通过下面的js代码以窗口的形式展示:

onclick="showWindow('medal', 'home.php?mod=medal&action=confirm&medalid=7')"

apply–提交申请

提交申请的实现代码大致如下,在注释里分析其实现:

$medalid = intval($_GET['medalid']);
$_G['forum_formulamessage'] = $_G['forum_usermsg'] = $medalnew = '';
//获取所有可用的勋章列表
$medal = C::t('forum_medal')->fetch($medalid);
//检查勋章是否可申请
if(!$medal['type']) {showmessage('medal_apply_invalid');
}
//检查是否已持有勋章
if(C::t('common_member_medal')->count_by_uid_medalid($_G['uid'], $medalid)) {showmessage('medal_apply_existence', 'home.php?mod=medal');
}$applysucceed = FALSE;//是否符合申请条件
$medalpermission = $medal['permission'] ? dunserialize($medal['permission']) : '';
//检查勋章是否有用户组限制
if($medalpermission[0] || $medalpermission['usergroupallow']) {include libfile('function/forum');medalformulaperm(serialize(array('medal' => $medalpermission)), 1);if($_G['forum_formulamessage']) {showmessage('medal_permforum_nopermission', 'home.php?mod=medal', array('formulamessage' => $_G['forum_formulamessage'], 'usermsg' => $_G['forum_usermsg']));} else {$applysucceed = TRUE;}
} else {$applysucceed = TRUE;
}if($applysucceed) {$expiration = empty($medal['expiration'])? 0 : TIMESTAMP + $medal['expiration'] * 86400;if($medal['type'] == 1) {//勋章类型为可购买if($medal['price']) {//勋章是否需要花积分或威望等值购买//积分或威望是否足够$medal['credit'] = $medal['credit'] ? $medal['credit'] : $_G['setting']['creditstransextra'][3];if($medal['price'] > getuserprofile('extcredits'.$medal['credit'])) {showmessage('medal_not_get_credit', '', array('credit' => $_G['setting']['extcredits'][$medal[credit]][title]));}//扣除购买积分或威望等updatemembercount($_G['uid'], array($medal['credit'] => -$medal['price']), true, 'BME', $medal['medalid']);}$memberfieldforum = C::t('common_member_field_forum')->fetch($_G['uid']);$usermedal = $memberfieldforum;unset($memberfieldforum);$medal['medalid'] = $medal['medalid'].(empty($expiration) ? '' : '|'.$expiration);$medalnew = $usermedal['medals'] ? $usermedal['medals']."\t".$medal['medalid'] : $medal['medalid'];//给当前用户添加购买的勋章C::t('common_member_field_forum')->update($_G['uid'], array('medals' => $medalnew));C::t('common_member_medal')->insert(array('uid' => $_G['uid'], 'medalid' => $medal['medalid']), 0, 1);$medalmessage = 'medal_get_succeed';} else {//勋章类型为其他可申请的类型//检查是否已经申请过了if(C::t('forum_medallog')->count_by_verify_medalid($_G['uid'], $medal['medalid'])) {showmessage('medal_apply_existence', 'home.php?mod=medal');}$medalmessage = 'medal_apply_succeed';//通知管理员审核勋章manage_addnotify('verifymedal');}//记录勋章申请请求C::t('forum_medallog')->insert(array('uid' => $_G['uid'],'medalid' => $medalid,'type' => $medal['type'],'dateline' => TIMESTAMP,'expiration' => $expiration,'status' => ($expiration ? 1 : 0),));showmessage($medalmessage, 'home.php?mod=medal', array('medalname' => $medal['name']));
}

task模块

discuz自带任务模块,可在discuz管理中心->运营->站点任务中开启任务模块并管理论坛任务。

任务模块主要有以下几个功能,请求的字段do的值代表功能:

do值 功能
当do字段值为空时,表示浏览任务列表
view 查看任务详情
apply 申请任务
delete 放弃任务
draw 领取奖励
giveup 放弃任务,功能与delete一样,暂时未知被哪里调用
parter 参与某任务的用户列表

任务模块的业务逻辑实现主要在/source/class/class_task.php中,其数据存储主要跟表common_task、common_mytask和common_taskvar表相关。

数据库表 描述
common_task 存储所有论坛任务
common_mytask 存储所有用户和任务的关系
common_taskvar 存储任务的详细信息

展示任务列表

获取任务列表的功能代码如下,我将在注释中解析功能:

function tasklist($item) {...//从数据库中获取与用户和item相关的任务列表,item有4个值new/doing/done/failed分别对应新任务、进行中任务、已完成任务和失败任务foreach(C::t('common_task')->fetch_all_by_status($_G['uid'], $item) as $task) {//从fetch_all_by_status方法中看,new和canapply没有区别if($item == 'new' || $item == 'canapply') {//检查任务的时间限制list($task['allowapply'], $task['t']) = $this->checknextperiod($task);if($task['allowapply'] < 0) {//不符合时间限制则不显示任务continue;}$task['noperm'] = $task['applyperm'] && $task['applyperm'] != 'all' && !(($task['applyperm'] == 'member'&& $_G['adminid'] == '0') || ($task['applyperm'] == 'admin' && $_G['adminid'] > '0') || forumperm($task['applyperm']));$task['appliesfull'] = $task['tasklimits'] && $task['achievers'] >= $task['tasklimits'];//不符合权限限制和已申请满员则不显示任务if($item == 'canapply' && ($task['noperm'] || $task['appliesfull'])) {continue;}}$num++;//任务的奖励类型if($task['reward'] == 'magic') {$magicids[] = $task['prize'];} elseif($task['reward'] == 'medal') {$medalids[] = $task['prize'];} elseif($task['reward'] == 'invite') {$invitenum = $task['prize'];} elseif($task['reward'] == 'group') {$groupids[] = $task['prize'];}//任务已启用且在可申请时间内if($task['available'] == '2' && ($task['starttime'] > TIMESTAMP || ($task['endtime'] && $task['endtime'] <= TIMESTAMP))) {$endtaskids[] = $task['taskid'];}//csc字段包含了任务进度百分比和最后更新时间,用\t隔开$csc = explode("\t", $task['csc']);$task['csc'] = floatval($csc[0]);//获取任务进度$task['lastupdate'] = intval($csc[1]);//获取任务进度更新时间//更新任务进度if(!$updated && $item == 'doing' && $task['csc'] < 100) {$updated = TRUE;$escript = explode(':', $task['scriptname']);//discuz支持任务插件,插件任务存在/source/plugin/中,原生任务在/source/class/task/中if(count($escript) > 1) {include_once DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.php';$taskclassname = 'task_'.$escript[1];} else {require_once libfile('task/'.$task['scriptname'], 'class');$taskclassname = 'task_'.$task['scriptname'];}$taskclass = new $taskclassname;$task['applytime'] = $task['dateline'];if(method_exists($taskclass, 'csc')) {$result = $taskclass->csc($task);//计算任务进度} else {showmessage('task_not_found', '', array('taskclassname' => $taskclassname));}//更新用户和任务的关系if($result === TRUE) {$task['csc'] = '100';C::t('common_mytask')->update($_G['uid'], $task['taskid'], array('csc' => $task['csc']));} elseif($result === FALSE) {C::t('common_mytask')->update($_G['uid'], $task['taskid'], array('status' => -1));} else {$task['csc'] = floatval($result['csc']);C::t('common_mytask')->update($_G['uid'], $task['taskid'], array('csc' => $task['csc']."\t".$_G['timestamp']));}}//如果该任务已完成或者已失败,检查是否可重新申请if(in_array($item, array('done', 'failed')) && $task['period']) {list($task['allowapply'], $task['t']) = $this->checknextperiod($task);$task['allowapply'] = $task['allowapply'] > 0 ? 1 : 0;}//获取任务图标$task['icon'] = $task['icon'] ? $task['icon'] : 'task.gif';if(strtolower(substr($task['icon'], 0, 7)) != 'http://') {$escript = explode(':', $task['scriptname']);if(count($escript) > 1 && file_exists(DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.gif')) {$task['icon'] = 'source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.gif';} else {$task['icon'] = 'static/image/task/'.$task['icon'];}}$task['dateline'] = $task['dateline'] ? dgmdate($task['dateline'], 'u') : '';$tasklist[] = $task;}//根据任务奖励类型获取奖励相关的信息//获取奖励物品名if($magicids) {foreach(C::t('common_magic')->fetch_all($magicids) as $magic) {$this->listdata[$magic['magicid']] = $magic['name'];}}//获取奖励奖章名if($medalids) {foreach(C::t('forum_medal')->fetch_all($medalids) as $medal) {$this->listdata[$medal['medalid']] = $medal['name'];}}//获取奖励用户组名if($groupids) {foreach(C::t('common_usergroup')->fetch_all($groupids) as $group) {$this->listdata[$group['groupid']] = $group['grouptitle'];}}//获取奖励邀请码if($invitenum) {$this->listdata[$invitenum] = $_G['lang']['invite_code'];}//无奖励if($endtaskids) {}return $tasklist;}

view–任务详情

任务详情的代码如下:

function view($id) {//获取任务信息$this->task = C::t('common_task')->fetch_by_uid($_G['uid'], $id);...//获取任务奖励信息switch($this->task['reward']) {case 'magic':$this->task['rewardtext'] = C::t('common_magic')->fetch($this->task['prize']);$this->task['rewardtext'] = $this->task['rewardtext']['name'];break;case 'medal':$this->task['rewardtext'] = C::t('forum_medal')->fetch($this->task['prize']);$this->task['rewardtext'] = $this->task['rewardtext']['name'];break;case 'group':$group = C::t('common_usergroup')->fetch($this->task['prize']);$this->task['rewardtext'] = $group['grouptitle'];break;}//获取任务图标链接$this->task['icon'] = $this->task['icon'] ? $this->task['icon'] : 'task.gif';if(strtolower(substr($this->task['icon'], 0, 7)) != 'http://') {$escript = explode(':', $this->task['scriptname']);if(count($escript) > 1 && file_exists(DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.gif')) {$this->task['icon'] = 'source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.gif';} else {$this->task['icon'] = 'static/image/task/'.$this->task['icon'];}}//获取任务结束时间和任务描述$this->task['endtime'] = $this->task['endtime'] ? dgmdate($this->task['endtime'], 'u') : '';$this->task['description'] = nl2br($this->task['description']);$this->taskvars = array();foreach(C::t('common_taskvar')->fetch_all_by_taskid($id) as $taskvar) {if(!$taskvar['variable'] || $taskvar['value']) {if(!$taskvar['variable']) {$taskvar['value'] = $taskvar['description'];}//用户相对该任务的状态if($taskvar['sort'] == 'apply') {$this->taskvars['apply'][] = $taskvar;} elseif($taskvar['sort'] == 'complete') {$this->taskvars['complete'][$taskvar['variable']] = $taskvar;} elseif($taskvar['sort'] == 'setting') {$this->taskvars['setting'][$taskvar['variable']] = $taskvar;}}}//获取允许申请任务的用户组信息$this->task['grouprequired'] = $comma = '';$this->task['applyperm'] = $this->task['applyperm'] == 'all' ? '' : $this->task['applyperm'];if(!in_array($this->task['applyperm'], array('', 'member', 'admin'))) {$query = C::t('common_usergroup')->fetch_all(explode(',', str_replace("\t", ',', $this->task['applyperm'])));foreach($query as $group) {$this->task['grouprequired'] .= $comma.$group[grouptitle];$comma = ', ';}}//申请此任务前需要完成任务的任务信息if($this->task['relatedtaskid']) {$task = C::t('common_task')->fetch($this->task['relatedtaskid']);$_G['taskrequired'] = $task['name'];}//根据scriptname判断任务类型是内置任务还是插件类型的任务,并且获取任务对应的实现类$escript = explode(':', $this->task['scriptname']);if(count($escript) > 1) {include_once DISCUZ_ROOT.'./source/plugin/'.$escript[0].'/task/task_'.$escript[1].'.php';$taskclassname = 'task_'.$escript[1];} else {require_once libfile('task/'.$this->task['scriptname'], 'class');$taskclassname = 'task_'.$this->task['scriptname'];}$taskclass = new $taskclassname;if($this->task['status'] == '-1') {//失败的任务if($this->task['period']) {//检查申请时间限制list($allowapply, $this->task['t']) = $this->checknextperiod($this->task);} else {$allowapply = -4;//小于0则为不可申请}} elseif($this->task['status'] == '0') {//正在执行的任务...if($this->task['csc'] < 100) {//如果任务进度不是已完成,则检查任务进度if(method_exists($taskclass, 'csc')) {$result = $taskclass->csc($this->task);//更新任务进度,返回值为任务是否已完成或者进度}...}} elseif($this->task['status'] == '1') {//已完成的任务if($this->task['period']) {//检查是否可重新申请list($allowapply, $this->task['t']) = $this->checknextperiod($this->task);} else {$allowapply = -5;}} else {$allowapply = 1;}if(method_exists($taskclass, 'view')) {//获取勋章展示信息$this->task['viewmessage'] = $taskclass->view($this->task, $this->taskvars);} else {$this->task['viewmessage'] = '';}if($allowapply > 0) {//检查是否有其他申请限制if($this->task['applyperm'] && $this->task['applyperm'] != 'all' && !(($this->task['applyperm'] == 'member' && $_G['adminid'] == '0') || ($this->task['applyperm'] == 'admin' && $_G['adminid'] > '0') || preg_match("/(^|\t)(".$_G['groupid'].")(\t|$)/", $this->task['applyperm']))) {$allowapply = -2;} elseif($this->task['tasklimits'] && $this->task['achievers'] >= $this->task['tasklimits']) {$allowapply = -3;}}$this->task['dateline'] = dgmdate($this->task['dateline'], 'u');return $allowapply;}

apply–申请任务

apply的申请流程如下:

function apply($id) {//获取任务信息$this->task = C::t('common_task')->fetch($id);//检查任务状态,字面意思就能看懂if($this->task['available'] != 2) {showmessage('task_nonexistence');} elseif(($this->task['starttime'] && $this->task['starttime'] > TIMESTAMP) || ($this->task['endtime'] && $this->task['endtime'] <= TIMESTAMP)) {showmessage('task_offline');} elseif($this->task['tasklimits'] && $this->task['achievers'] >= $this->task['tasklimits']) {showmessage('task_full');}if($this->task['relatedtaskid'] && !C::t('common_mytask')->count($_G['uid'], $this->task['relatedtaskid'], 1)) {//未完成关联任务return -1;} elseif($this->task['applyperm'] && $this->task['applyperm'] != 'all' && !(($this->task['applyperm'] == 'member' && $_G['adminid'] == '0') || ($this->task['applyperm'] == 'admin' && $_G['adminid'] > '0') || preg_match("/(^|\t)(".$_G['groupid'].")(\t|$)/", $this->task['applyperm']))) {//不符合申请权限return -2;} elseif(!$this->task['period'] && C::t('common_mytask')->count($_G['uid'], $id)) {//不允许多次申请任务return -3;} elseif($this->task['period']) {//检查申请时间和申请次数等限制$mytask = C::t('common_mytask')->fetch($_G['uid'], $id);$task = C::t('common_task')->fetch($id);$mytask['period'] = $task['period'];$mytask['periodtype'] = $task['periodtype'];unset($task);list($allowapply) = $this->checknextperiod($mytask);if($allowapply < 0) {return -4;}}...$taskclass = new $taskclassname;//检查其他条件if(method_exists($taskclass, 'condition')) {$taskclass->condition();}//申请成功,保存用户申请数据C::t('common_mytask')->insert(array('uid' => $_G['uid'],'username' => $_G['username'],'taskid' => $this->task['taskid'],'csc' => '0\t'.$_G['timestamp'],'dateline' => $_G['timestamp']), false, true);//申请用户数C::t('common_task')->update_applicants($this->task['taskid'], 1);if(method_exists($taskclass, 'preprocess')) {$taskclass->preprocess($this->task);}return true;
}

delete,giveup–放弃任务

用户放弃任务的主要逻辑如下:

//移除用户和任务的关联
C::t('common_mytask')->delete($_G['uid'], $id);
//申请用户数减1
C::t('common_task')->update_applicants($id, -1);

draw–领取奖励

领取奖励的主要逻辑如下:

function draw($id) {...} elseif($this->task['tasklimits'] && $this->task['achievers'] >= $this->task['tasklimits']) {//完成任务人数限制return -1;}...$taskclass = new $taskclassname;if(method_exists($taskclass, 'csc')) {$result = $taskclass->csc($this->task);//更新并获取任务进度} ...if($result === TRUE) {//任务已完成if($this->task['reward']) {//是否有奖励$rewards = $this->reward();$notification = $this->task['reward'];//获取任务奖励信息if($this->task['reward'] == 'magic') {$rewardtext = C::t('common_magic')->fetch($this->task['prize']);$rewardtext = $rewardtext['name'];} elseif($this->task['reward'] == 'medal') {$rewardtext = C::t('forum_medal')->fetch($this->task['prize']);$rewardtext = $rewardtext['name'];if(!$this->task['bonus']) {$notification = 'medal_forever';}} elseif($this->task['reward'] == 'group') {$group = C::t('common_usergroup')->fetch($this->task['prize']);$rewardtext = $group['grouptitle'];} elseif($this->task['reward'] == 'invite') {$rewardtext = $this->task['prize'];}//通知用户奖励信息notification_add($_G[uid], 'task', 'task_reward_'.$notification, array('taskid' => $this->task['taskid'],'name' => $this->task['name'],'creditbonus' => $_G['setting']['extcredits'][$this->task['prize']]['title'].' '.$this->task['bonus'].' '.$_G['setting']['extcredits'][$this->task['prize']]['unit'],'rewardtext' => $rewardtext,'bonus' => $this->task['bonus'],'prize' => $this->task['prize'],));}//成功领取奖励的回调if(method_exists($taskclass, 'sufprocess')) {$taskclass->sufprocess($this->task);}//更新任务信息C::t('common_mytask')->update($_G['uid'], $id, array('status' => 1, 'csc' => 100, 'dateline' => $_G['timestamp']));C::t('common_task')->update_achievers($id, 1);...} elseif($result === FALSE) {//任务失败//更新任务状态C::t('common_mytask')->update($_G['uid'], $id, array('status' => -1));if($_G['inajax']) {$this->message('-1', 'task_failed');} else {return -2;}} else {//任务在执行中//提示任务进度$result['t'] = $this->timeformat($result['remaintime']);$this->messagevalues['values'] = array('csc' => $result['csc'], 't' => $result['t']);if($result['csc']) {C::t('common_mytask')->update($_G['uid'], $id, array('csc' => $result['csc']."\t".$_G['timestamp']));$this->messagevalues['msg'] = $result['t'] ? 'task_doing_rt' : 'task_doing';} else {$this->messagevalues['msg'] = $result['t'] ? 'task_waiting_rt' : 'task_waiting';}if($_G['inajax']) {$this->message($result['csc'], $this->messagevalues['msg'], $this->messagevalues['values']);} else {return -3;}}
}

parter–参与者列表

获取参与者列表的主要实现如下:

function parter($id) {$parterlist = array();//最多抓取8位参与者信息foreach(C::t('common_mytask')->fetch_all_by_taskid($id, 8) as $parter) {//展示参与者头像、昵称和任务进度等信息$parter['avatar'] = avatar($parter['uid'], 'small');$csc = explode("\t", $parter['csc']);$parter['csc'] = floatval($csc[0]);$parterlist[] = $parter;}return $parterlist;
}

Discuz home模块解析(一)相关推荐

  1. Discuz home模块解析(二)

    这篇文章将继续分析home模块其余的功能. invite模块 invite模块是邀请注册或者成为好友功能,邀请功能可以在管理后台的全局->注册与访问控制中开启.普通用户邀请的链接如下: http ...

  2. cuDNN 功能模块解析

    cuDNN 功能模块解析 Abstract 本cuDNN 8.0.4开发人员指南概述了cuDNN功能,如可自定义的数据布局.支持灵活的dimension ordering,striding,4D张量的 ...

  3. 实现一个webpack模块解析器

    最近在学习 webpack源码,由于源码比较复杂,就先梳理了一下整体流程,就参考官网的例子,手写一个最基本的 webpack 模块解析器. 代码很少,github地址:手写webpack模块解析器 整 ...

  4. python中json模块_Python使用内置json模块解析json格式数据的方法

    本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...

  5. TypeScript 素描 - 模块解析、声明合并

    模块解析 模块解析有两种方式 相对方式  也就是以/或 ./或-/开头的,比如import jq  from "/jq" 非相对方式  比如 import model  from ...

  6. Spring的核心模块解析

    转载自 Spring的核心模块解析 Spring框架是一个轻量级的集成式开发框架,可以和任何一种框架集成在一起使用,可以说是一个大的全家桶.Spring从1.x发展到现在的5.x可以说是越来越强大,下 ...

  7. php验证密码后跳转_php-laravel框架用户验证(Auth)模块解析(四)忘记密码

    一.忘记密码模块路由 二.控制器解析 跟注册.登录的控制器一样,大部分的逻辑使用trait引入. ForgotPasswordController:负责忘记密码页面,以及邮件发送 四.扩展开发:自定义 ...

  8. Nginx 静态文件服务器搭建及autoindex模块解析

    ngx_http_autoindex_module ngx_http_autoindex_module模块处理以斜杠字符('/')结尾的请求,并生成目录列表. 当ngx_http_index_modu ...

  9. 追踪系统分模块解析(Understanding and Diagnosing Visual Tracking Systems)

    追踪系统分模块解析(Understanding and Diagnosing Visual Tracking Systems) PROJECT http://winsty.net/tracker_di ...

最新文章

  1. Android listview viewholder
  2. cat、tac、more、less、head、tail、cut
  3. 相机小景深和大景深的区别?
  4. html打印日志_SpringBoot 2.X Kotlin系列之AOP统一打印日志
  5. 华为鸿蒙系统有什么特色,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  6. Linux基本操作【作业】
  7. Could not autowire. No beans of 'xxxx' type found的错误提示
  8. 隔空互撕!李想炮轰团车造车是“骗子”,团车CEO回怼:别把自己当先知
  9. linux消息队列消息清空函数,ipcrm命令_Linux ipcrm 命令用法详解:删除消息队列、信号集、或者共享内存标识...
  10. Spring.net(一)----Spring.NET框架简介及模块说明
  11. 谷歌街景15年乾坤大挪移!带你穿越法老的金字塔
  12. 什么是3D建模?用到哪些软件?
  13. arm有啥不同 intel_Intel处理器真的胜过ARM了?安兔兔什么的才不可靠呢
  14. 2011年上半年五大臭名昭著的数据库泄密事件--转载
  15. 奶粉中php是什么意思,那种奶粉dha含量高,奶粉中dha是什么意思
  16. 这场金融网络盛宴 华为又要秀出哪些前瞻性布局?
  17. Java——动态创建一维数组和二维数组
  18. 史上最简单的Spring Security教程(二十八):CA登录与默认用户名密码登录共存详细实现及配置
  19. UE风格化场景练习笔记Day1
  20. R语言ggplot2绘图教程——Pathway富集分析气泡图

热门文章

  1. 谁能给我发个ROSE COMMOM破译文件呀,就差一步了
  2. 用计算机开方总结,用计算器开方
  3. 自适应log file sync影响案例
  4. RobotStudio学习笔记——如何创建工业机器人系统与手动操作
  5. 【必读】目前最受欢迎的60款Android应用
  6. 在自改互评作文中,提高习作水平
  7. Windows下react-native连接夜神模拟器
  8. Edge Detector ----------Marr Hildreth 算法
  9. 幼儿园课件软件测试,幼儿园大班测试题
  10. 中职 计算机网络教材,中等职业学校教学用书:计算机网络基础