发新话题
打印

[原创] extman 0.2.3代码简单分析(6)完

本主题由 hzqbbc 于 2007-12-21 23:13 加入精华

extman 0.2.3代码简单分析(6)完

一切准备就绪,那么就开始干活了。
看看overview.cgi 中的下面部分
复制内容到剪贴板
代码:
  $app->run;
在MgrApp.pm 找到了该方法。
复制内容到剪贴板
代码:
sub run {
    my $app = shift;
    my $q = $app->{query};

    eval {
        REQUEST: #处理请求?
        {
            $app->pre_backend; # prepare backend  #处理用户选择的数据库类型。
            if($app->{requires_login}) {
            LOGIN: #登录模块
            {
                my $user = lc $q->cgi("username");
                last LOGIN if $app->already_login; #如果用户已经登录则不再要求登录。
                if($user and $q->cgi('action')) {
                    
                    if ($app->{sysconfig}->{SYS_CAPTCHA_ON}) {#检查用户有没有使用图片验证码
                        require Ext::CaptCha;
                        my $data = $q->get_cookie('scode');
                        my $raw = $q->cgi('vcode'); # verify code
                        my $key = $app->{sysconfig}->{SYS_CAPTCHA_KEY} || 'extmail';
                        my $cap = Ext::CaptCha->new(key => $key);

                        if (!$cap->verify(lc $raw, $data)) {
                            $app->{redirect} = "?__mode=show_login&error=vcode";
                            last LOGIN;
                        }
                    }
                    my($status, $ref) = $app->login; # 检查用户登录
                    if($status) { #看看是否成功了
                        # if login ok, re_calculate Quota, this is trick
                        # to udpate quota, only once after login. XXX

                        $app->init_env; # must initialize %ENV
                        $app->{redirect} = "?__mode=welcome&sid=$ref->{sid}";
                    }else {
                        $app->{redirect} = '?__mode=show_login&error=badlogin';
                    }
                }
            } # LOGIN block END
            }

            my $mode = $q->cgi("__mode") || $app->{default_mode}; #看看有没有请求指定的功能。没有则使用默认的,这个默认的方法在overview.pm 里定义了。
            my $code = $app->{fcbl}{$mode} or
                $app->error("No such action: $mode"), last REQUEST;

            if(($code && $app->valid) || $app->permit) {
                $q->send_cookie;
                unless ($app->{redirect}) {
                    $app->pre_run;  #执行overview.pm 里的功能前,需要做的事,可以什么都不做。
                    my $t0 = new Benchmark;
                    $app->global_tpl;
                    $code->($app);  # 执行overview.pm 里add_methods 里注册的功能,主要程序驱动在这里。
                    my $t1 = new Benchmark;
                    my $t = timediff($t1,$t0);
                    my $f = "%3d wsecs (%5.2f usr + %5.2f sys)";

                    $app->{tpl}->assign(
                        TIME => sprintf($f,$t->[0], $t->[1],$t->[2])
                    );
                    $app->post_run;  #执行那些功能后要做的事。
                }
            }

            if(my $url = $app->{redirect}) {
                $app->redirect($url);
            }
        } # END of REQUEST
    };

    if ($@) {#因为在eval 里执行,如果有错误会存放在$@  里。
        $app->error($@);  
    }

    if($app->{sysconfig}->{SYS_SHOW_WARN}) {  #如果打开了警告。
        $app->trace($app->{sysconfig}->{SYS_SHOW_WARN});
        $app->warn($app->{_trace});
    }
}
最后在overview.pm 的post_run 找到了html 的输出。
复制内容到剪贴板
代码:
sub post_run {
    my $template = $_[0]->{query}->cgi('screen') || 'overview.html';
    $_[0]->{tpl}->process($template);
    $_[0]->{tpl}->print;
}
开源易有
http://www.yiyou.org/

TOP

顶顶!!!!

TOP

帮你顶,看样搞的很辛苦

TOP

发新话题