狂团KtAdmin框架开发文档

狂团KtAdmin框架开发文档


本地应用开发

1. 目录结构

目录结构和thinkphp6常用结构一致.

www WEB部署目录 ├─app 应用目录 │ ├─app_name 应用目录 │ │ ├─common.php 函数文件 │ │ ├─controller 控制器目录 │ │ ├─model 模型目录 │ │ ├─view 视图目录 │ │ ├─config 配置目录 │ │ ├─route 路由目录 │ │ └─ ... 更多类库目录


2. 模板文件

前后端分离时,把编译后代码放到public/app/demo目录下 (demo为你的应用名称)

3. 静态文件

如果是非前后端分离模式,则需把 静态文件放到 public/static/demo(应用名)目录下, 引用时按照tp6框架正常引用即可

> 【本地开发模式下】直接将资源文件放到public/static/demo 下面即可 (demo为你的应用名称)

4.插件配置文件 manifest.xml

详见https://www.showdoc.com.cn/2068549701394518/9377743196801972


5. 中间件

应用开发如果需要和框架的验证保持一致, 需添加应用中间件,中间件代码示例如下:

建议: 1.应用有管理后台, 建议写两个中间件以便区分不同的token验证, token是唯一值,通过token匹配用户或者管理员,每次请求将会把token有效期自动往后加 有效期

2.前后端分离建议token缓存到本地,请求接口时token放到Header中;前后端不分离建议token缓存到服务器端(Session默认未开启,建议在应用中间件定义文件中开启)

<?php

declare (strict_types = 1);

namespace app\demo\middleware;
use think\facade\Db;
use think\facade\Session;

class admincheck
{
    protected $whiteList = [
        '/',
    ];
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */

    public function handle($request, \Closure $next)
    {
        //前后端分离建议token缓存到本地,请求接口时token放到Header中(注意要注释掉下面session部分)
        //$token = $request->header('AdminToken');

        //前后端不分离建议token缓存到服务器端(Session默认未开启,建议在应用中间件定义文件中开启)
        $token = Session::get('AdminToken');
        if(request()->get('token')){
            Session::set('AdminToken',request()->get('token'));
            return redirect($request->domain().$request->baseUrl());
        }
        $url   = strtolower($request->baseUrl()); //获取url地址, 不带域名,然后小写,
        if(in_array($url,$this->whiteList)) return $next($request);
        if(!$token) return error('缺少参数UserToken');
        $admin = Db::table('kt_base_agent')->where([['agency_token', '=', $token],['expire_time','>',time()]])->find();
        if(!$admin) return error('无效的UserToken');
        Db::table('kt_base_agent')->where('id',$admin['id'])->update(['expire_time'=> time() + (7*24*3600)]);
        return $next($request);

    }
}
<?php

declare (strict_types = 1);

namespace app\demo\middleware;
use think\facade\Db;
use think\facade\Session;

class check
{
    protected $whiteList = [
        '/',
    ];
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */

    public function handle($request, \Closure $next)
    { 
        //前后端分离建议token缓存到本地,请求接口时token放到Header中(注意要注释掉下面session部分)
        //$token = $request->header('UserToken');

        //前后端不分离建议token缓存到服务器端(Session默认未开启,建议在应用中间件定义文件中开启)
        $token = Session::get('UserToken');
        if(request()->get('token')){
            Session::set('UserToken',request()->get('token'));
            return redirect($request->domain().$request->baseUrl());
        }
        $url   = strtolower($request->baseUrl()); //获取url地址, 不带域名,然后小写,
        if(in_array($url,$this->whiteList)) return $next($request);
        if(!$token) return error('缺少参数UserToken');
        $user = Db::table('kt_base_user')->where([['token', '=', $token],['expire_time','>',time()]])->find();
        if(!$user) return error('无效的UserToken');
        Db::table('kt_base_user')->where('id',$user['id'])->update(['expire_time'=> time() + (7*24*3600) ]);
        return $next($request);

    }
}

6. 基础控制器

通过token,获取相应用户信息或者管理员信息

代码示例如下:


<?php

namespace app\demo\controller;

use app\BaseController;
use think\facade\Db;
use think\Request;
use think\facade\Session;

class BaseAdmin extends BaseController
{
    protected $req;
    protected $admin;
    protected $uid;
    protected $token;
    protected $host;

    public function  __construct(Request $request){
        if(Session::has('uid')) Session::delete('uid');
        $this->req = $request;
        $this->host  = $request->host();
        //$this->token = $this->req->header('AdminToken');
        $this->token = Session::get('AdminToken');
        $this->admin = Db::table('kt_base_agent')->where([['agency_token', '=', $this->token], ['expire_time', '>',time()]])->find();
        if($this->admin){
            $this->uid = $this->admin['id'];
            Session::set('uid',$this->admin['id']);
        }
    }   
}

<?php

namespace app\demo\controller;

use app\BaseController;
use think\facade\Db;
use think\Request;
use think\facade\Session;

class BaseUser extends BaseController
{
    protected $req;
    protected $user;
    protected $wid;
    protected $token;

    public function  __construct(Request $request){
        $this->req = $request;
        $this->host  = $request->host();
        $url  = $request->url();
        //$this->token = $this->req->header('UserToken');
        $this->token = Session::get('UserToken');
        $this->user = Db::table('kt_base_user')->where([['token', '=', $this->token], ['expire_time', '>',time()]])->find();
        if($this->user){
            $this->wid = $this->user['id'];
            Session::set('wid',$this->user['id']);
            Session::set('uid',$this->user['agid']);
        } 
    }
}

7. 应用的路由配置route.php(这里主要体现路由中间件的注册方式)

<?php

use think\facade\Route;
/**
 * 管理后台
 */
Route::group('admin', function () {
    Route::any('/index', 'admin.index/index'); //首页
})->middleware(app\demo\middleware\admincheck::class);

/**
 * 用户后台
 */
Route::group('user',function(){
    Route::any('/index', 'user.index/index'); //首页
})->middleware(app\demo\middleware\check::class);

页面列表

ITEM_HTML