• UCenter Home代码研读之space.php


    space.php是UCenter Home的入口文件之一,通过它可以进入用户个人主页。

    下面,我们来一点点吃掉它。

    首先它引入了两个php文件,一个是common.php,一个是data文件夹下的data_magic.php。

    然后是处理rewrite设置,这里就不多讲了,我也不太清楚它的作用。

    //允许动作
    $dos = array('feed', 'doing', 'mood', 'blog', 'album', 'thread', 'mtag', 'friend', 'wall', 'tag', 'notice', 'share', 'topic', 'home', 'pm', 'event', 'poll', 'top', 'info', 'videophoto');

    点评:此代码,设置允许的动作,将这些动作保存在数组中,如果动作存在数组中,就可以执行,否则就跳转到index页面。

    //获取变量
    $isinvite = 0;
    $uid = empty($_GET['uid'])?0:intval($_GET['uid']);
    $username = empty($_GET['username'])?'':$_GET['username'];
    $domain = empty($_GET['domain'])?'':$_GET['domain'];
    $do = (!empty($_GET['do']) && in_array($_GET['do'], $dos))?$_GET['do']:'index';     //进入相应的动作
    if($do == 'home') {
        $do = 'feed';
    } elseif ($do == 'index') {
        //邀请好友
        $invite = empty($_GET['invite'])?'':$_GET['invite'];
        $code = empty($_GET['code'])?'':$_GET['code'];
        $reward = getreward('invitecode', 0);
        if($code && !$reward['credit']) {
            $isinvite = -1;
        } elseif($invite) {
            $isinvite = $_SGLOBAL['db']->result($_SGLOBAL['db']->query("SELECT id FROM ".tname('invite')." WHERE uid='$uid' AND code='$invite' AND fuid='0'"), 0);
        }
    }

    点评:此段代码获取变量,正如注释所说的一样,前面的几个就不多说了,主要的是$do,获取动作之后如果存在就获取,否则就设为index。

    //是否公开
    if(empty($isinvite) && empty($_SCONFIG['networkpublic'])) {
        checklogin();//需要登录
    }

    点评:检验是否已经登录,这里的checklogin()方法来自于function_common.php中。

    function_common.php是common.php中引入的,所以可以在space.php中进行使用。其checklogin()方法的具体代码如下,仅作参考。

    //检查是否登录
    function checklogin() {
        global $_SGLOBAL, $_SCONFIG;
    
        if(empty($_SGLOBAL['supe_uid'])) {
            ssetcookie('_refer', rawurlencode($_SERVER['REQUEST_URI']));
            showmessage('to_login', 'do.php?ac='.$_SCONFIG['login_action']);
        }
    }

    如果用户id不存在就会跳转到登陆界面。

    //获取空间
    if($uid) {
        $space = getspace($uid, 'uid');
    } elseif ($username) {
        $space = getspace($username, 'username');
    } elseif ($domain) {
        $space = getspace($domain, 'domain');
    } elseif ($_SGLOBAL['supe_uid']) {
        $space = getspace($_SGLOBAL['supe_uid'], 'uid');
    }

    点评:此段代码的作用是获取相应的空间信息,根据uid或者username或者其他的一些信息。

    if($space) {
        
        //验证空间是否被锁定
        if($space['flag'] == -1) {
            showmessage('space_has_been_locked');
        }
        
        //隐私检查
        if(empty($isinvite) || ($isinvite<0 && $code != space_key($space, $_GET['app']))) {
            //游客
            if(empty($_SCONFIG['networkpublic'])) {
                checklogin();//需要登录
            }
            if(!ckprivacy($do)) {
                include template('space_privacy');
                exit();
            }
        }
        
        //别人只查看自己
        if(!$space['self']) {
            $_GET['view'] = 'me';
        } else if(empty($space['feedfriend']) && empty($_GET['view'])) {
            $_GET['view'] = 'all';
        }
        if ($_GET['view'] == 'me') {
            $space['feedfriend'] = '';
        }
        
    } elseif($uid) {
    
        //判断当前用户是否删除
        $query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('spacelog')." WHERE uid='$uid' AND flag='-1'");
        if($value = $_SGLOBAL['db']->fetch_array($query)) {
            showmessage('the_space_has_been_closed');
        }
        
        //未开通空间
        include_once(S_ROOT.'./uc_client/client.php');
        if($user = uc_get_user($uid, 1)) {
            $space = array('uid' => $user[0], 'username' => $user[1], 'dateline'=>$_SGLOBAL['timestamp'], 'friends'=>array());
            $_SN[$space['uid']] = $space['username'];
        }
    }

    点评:获取空间信息。以及身份,权限等等。

    //游客
    if(empty($space)) {
        $space = array('uid'=>0, 'username'=>'guest', 'self'=>1);
        if($do == 'index') $do = 'feed';
    }

    点评:游客身份

    //更新活动session
    if($_SGLOBAL['supe_uid']) {
        
        getmember(); //获取当前用户信息
        
        if($_SGLOBAL['member']['flag'] == -1) {
            showmessage('space_has_been_locked');
        }
        
        //禁止访问
        if(checkperm('banvisit')) {
            ckspacelog();
            showmessage('you_do_not_have_permission_to_visit');
        }
        
        updatetable('session', array('lastactivity' => $_SGLOBAL['timestamp']), array('uid'=>$_SGLOBAL['supe_uid']));
    }

    点评:获取用户信息,getmember()来自于function_common.php中

    //对话框
    function showmessage($msgkey, $url_forward='', $second=1, $values=array()) {
        global $_SGLOBAL, $_SC, $_SCONFIG, $_TPL, $space, $_SN;
    
        obclean();
    
        //去掉广告
        $_SGLOBAL['ad'] = array();
        
        //语言
        include_once(S_ROOT.'./language/lang_showmessage.php');
        if(isset($_SGLOBAL['msglang'][$msgkey])) {
            $message = lang_replace($_SGLOBAL['msglang'][$msgkey], $values);
        } else {
            $message = $msgkey;
        }
        //手机
        if($_SGLOBAL['mobile']) {
            include template('showmessage');
            exit();
        }
        //显示
        if(empty($_SGLOBAL['inajax']) && $url_forward && empty($second)) {
            header("HTTP/1.1 301 Moved Permanently");
            header("Location: $url_forward");
        } else {
            if($_SGLOBAL['inajax']) {
                if($url_forward) {
                    $message = "<a href=\"$url_forward\">$message</a><ajaxok>";
                }
                //$message = "<h1>".$_SGLOBAL['msglang']['box_title']."</h1><a href=\"javascript:;\" onclick=\"hideMenu();\" class=\"float_del\">X</a><div class=\"popupmenu_inner\">$message</div>";
                echo $message;
                ob_out();
            } else {
                if($url_forward) {
                    $message = "<a href=\"$url_forward\">$message</a><script>setTimeout(\"window.location.href ='$url_forward';\", ".($second*1000).");</script>";
                }
                include template('showmessage');
            }
        }
        exit();
    }

    showmessage()方法中的内容。

    //对话框
    function showmessage($msgkey, $url_forward='', $second=1, $values=array()) {
        global $_SGLOBAL, $_SC, $_SCONFIG, $_TPL, $space, $_SN;
    
        obclean();
    
        //去掉广告
        $_SGLOBAL['ad'] = array();
        
        //语言
        include_once(S_ROOT.'./language/lang_showmessage.php');
        if(isset($_SGLOBAL['msglang'][$msgkey])) {
            $message = lang_replace($_SGLOBAL['msglang'][$msgkey], $values);
        } else {
            $message = $msgkey;
        }
        //手机
        if($_SGLOBAL['mobile']) {
            include template('showmessage');
            exit();
        }
        //显示
        if(empty($_SGLOBAL['inajax']) && $url_forward && empty($second)) {
            header("HTTP/1.1 301 Moved Permanently");
            header("Location: $url_forward");
        } else {
            if($_SGLOBAL['inajax']) {
                if($url_forward) {
                    $message = "<a href=\"$url_forward\">$message</a><ajaxok>";
                }
                //$message = "<h1>".$_SGLOBAL['msglang']['box_title']."</h1><a href=\"javascript:;\" onclick=\"hideMenu();\" class=\"float_del\">X</a><div class=\"popupmenu_inner\">$message</div>";
                echo $message;
                ob_out();
            } else {
                if($url_forward) {
                    $message = "<a href=\"$url_forward\">$message</a><script>setTimeout(\"window.location.href ='$url_forward';\", ".($second*1000).");</script>";
                }
                include template('showmessage');
            }
        }
        exit();
    }

    最后是处理动作

    //计划任务
    if(!empty($_SCONFIG['cronnextrun']) && $_SCONFIG['cronnextrun'] <= $_SGLOBAL['timestamp']) {
        include_once S_ROOT.'./source/function_cron.php';
        runcron();
    }
    
    //处理
    include_once(S_ROOT."./source/space_{$do}.php");

     至此,代码分析完毕,可能还会感觉晕乎乎的,这很正常。因为熟悉业务本身就是一个体力活。要一点点的摸索,探索其中的奥秘,一点一点的扒开衣服。

    经过探索,发现首页的视图文件来自于template/default/space_feed.htm

    UCenterHome会有缓存文件,把每一次的视图都缓存下来。缓存到tpl_cache文件夹下面。所以删除space_feed.htm并没有使得页面失效。这是缓存搞得鬼,这里的缓存不是浏览器缓存,而是实实在在的文件缓存。

  • 相关阅读:
    个人总结
    第三次个人作业
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次博客编程作业
    第一次随笔作业
    BUAA_2020_软件工程_提问回顾与总结
    BUAA_2020_软件工程_软件案例分析作业
    BUAA_2020_软件工程_结对项目作业
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/3056911.html
Copyright © 2020-2023  润新知