sspanel进阶——修改属于自己的sspanel站点(二)

上一章我阐述了如何修改sspanel的视图,这一章为大家带来页面定向控制以及controller代码的修改


我们知道ssapnelV3是基于mvc架构,页面的访问并不是直接访问到页面文件,而是由controller处理后再返回的html源码。我也提及到,网页的根目录是public,不过关于页面定向的实际处理文件是的app文件夹下的routes.php(不同魔改版本位置略有差异,例如glzjin的魔改版本位置是config文件夹下)具体位置可以在public的index.php中找到

run();

这里的routes.php是在app目录下,打开这个文件

 [
        'debug' => $debug,
        'whoops.editor' => 'sublime'
    ]
]);
$app->add(new WhoopsMiddleware);


// Home
$app->get('/', 'App\Controllers\HomeController:index');
$app->get('/code', 'App\Controllers\HomeController:code');
$app->get('/tos', 'App\Controllers\HomeController:tos');
$app->get('/debug', 'App\Controllers\HomeController:debug');
$app->post('/debug', 'App\Controllers\HomeController:postDebug');
//$app->get('/about', 'App\Controllers\HomeController:about');

$app->get('/client', 'App\Controllers\HomeController:client');
$app->get('/nodeList', 'App\Controllers\UserController:nodeList');

// User Center
$app->group('/user', function () {
    $this->get('', 'App\Controllers\UserController:index');
    $this->get('/', 'App\Controllers\UserController:index');
    $this->post('/checkin', 'App\Controllers\UserController:doCheckin');
    $this->get('/node', 'App\Controllers\UserController:node');
    $this->get('/node/{id}', 'App\Controllers\UserController:nodeInfo');
    $this->get('/profile', 'App\Controllers\UserController:profile');
    $this->get('/invite', 'App\Controllers\UserController:invite');
    $this->post('/invite', 'App\Controllers\UserController:doInvite');
    $this->get('/edit', 'App\Controllers\UserController:edit');
    $this->post('/password', 'App\Controllers\UserController:updatePassword');
    $this->post('/sspwd', 'App\Controllers\UserController:updateSsPwd');
    $this->post('/method', 'App\Controllers\UserController:updateMethod');
    $this->get('/sys', 'App\Controllers\UserController:sys');
    $this->get('/trafficlog', 'App\Controllers\UserController:trafficLog');
    $this->get('/kill', 'App\Controllers\UserController:kill');
    $this->post('/kill', 'App\Controllers\UserController:handleKill');
    $this->get('/logout', 'App\Controllers\UserController:logout');
})->add(new Auth());

最上层引用了controller的目录,如果自己有新增的目录,也要引用进来,我们可以看到注释 //home、//user Center,其下分别是主页这一块的页面、用户中心这一块的页面,$app->group('/user', function () {起到了一个分组的作用,在这个组里是以/user为根路径,例如www.baidu.com,指向的是home,www.baidu.com/user,指向的就是user下的处理。

这个是我修改后的代码,所以能够看到新增的两行

$app->get('/client', 'App\Controllers\HomeController:client');
$app->get('/nodeList', 'App\Controllers\UserController:nodeList');

如果在浏览器中访问www.baidu.com/client,那么这个路径就会由App\Controllers\HomeController:client这个方法去处理,HomeController就是页面的控制器,按图索骥找到app\controller下的源码文件

/**
 *  HomeController
 */
class HomeController extends BaseController
{

    public function index()
    {
        $homeIndexMsg = DbConfig::get('home-index');
        return $this->view()->assign('homeIndexMsg', $homeIndexMsg)->display('index.tpl');
    }

    public function code()
    {
        $msg = DbConfig::get('home-code');
        $codes = InviteCode::where('user_id', '=', '0')->take(10)->get();
        return $this->view()->assign('codes', $codes)->assign('msg', $msg)->display('code.tpl');
    }

    public function debug($request, $response, $args)
    {
        $server = [
            "headers" => $request->getHeaders(),
            "content_type" => $request->getContentType()
        ];
        $res = [
            "server_info" => $server,
            "ip" => Http::getClientIP(),
            "version" => Config::get('version'),
            "reg_count" => Check::getIpRegCount(Http::getClientIP()),
        ];
        Logger::debug(json_encode($res));
        return $this->echoJson($response, $res);
    }

    public function tos()
    {
        return $this->view()->display('tos.tpl');
    }

    public function client()
    {
        return $this->view()->display('client.tpl');
    }

最后一行可以找到我加入代码引用的client方法,返回了client.tpl这个页面,这里并没有代码的处理,只是简单的返回了一个静态页面,如果按照我的写法,那么我们就新增了一个client页面,通过www.baidu.com/client.tpl可以访问到这个页面(别忘了把百度换成你自己的域名)。可能有人会疑惑,$this->view()->display('client.tpl');我的client.tpl界面在哪里,这里的view对象是在HomeController继承的BaseController中所定义的,上一章我说了view资源文件的位置,具体的view引用和app\Services\View.php有关,作者在其中有相应注释,有兴趣的道友可以去看一下,这里不再讲解。这里也可以新增一个api方法,不返回页面,代码雷同

    public function debug($request, $response, $args)
    {
        $server = [
            "headers" => $request->getHeaders(),
            "content_type" => $request->getContentType()
        ];
        $res = [
            "server_info" => $server,
            "ip" => Http::getClientIP(),
            "version" => Config::get('version'),
            "reg_count" => Check::getIpRegCount(Http::getClientIP()),
        ];
        Logger::debug(json_encode($res));
        return $this->echoJson($response, $res);
    }
可以获取请求的参数,处理后通过response返回json或其他格式数据。

上面我们新增了一个静态页面,如果要加一个动态页面那该如何?上段代码中,有个主页的index方法

    public function index()
    {
        $homeIndexMsg = DbConfig::get('home-index');
        return $this->view()->assign('homeIndexMsg', $homeIndexMsg)->display('index.tpl');
    }
->assign('homeIndexMsg', $homeIndexMsg)这个方法就是向view传递数据对象,类似于map键值对,键是homeIndexMsg,值是$homeIndexMsg对象,在对应的index.tpl中就可以通过键引用到对象的值



{$config["appName"]}

轻松科学上网 保护个人隐私
{$homeIndexMsg}
{if $user->isLogin} {else} {/if}


想必有人会疑惑,我们看到了传入的对象被引用,还有另外两个对象config、user,并没有看见传入,这两个对象是在view中被默认传入的,在所有页面中都可以直接调用,打开app\Services\View.php就可以看到对应的代码,在//add config注释下面几行,将这些配置信息以及个人信息传入

settemplatedir(BASE_PATH.'/resources/views/'.Config::get('theme').'/'); //设置模板文件存放目录
        $smarty->setcompiledir(BASE_PATH.'/storage/framework/smarty/compile/'); //设置生成文件存放目录
        $smarty->setcachedir(BASE_PATH.'/storage/framework/smarty/cache/'); //设置缓存文件存放目录
        // add config
        $smarty->assign('config',Config::getPublicConfig());
        $smarty->assign('user',Auth::getUser());
        $smarty->assign('analyticsCode',DbConfig::get('analytics-code'));
        return $smarty;
    }

}

本章讲到这里,下一章会阐述模型的修改以及数据库相关。诸位快行动起来,拆了重建,搞搞大新闻,想必是极好的。




你可能感兴趣的:(编程技术)