本地应用开发
<h4>1. 目录结构</h4>
<p>目录结构和thinkphp6常用结构一致.</p>
<p>www WEB部署目录
├─app 应用目录
│ ├─app_name 应用目录
│ │ ├─common.php 函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ ├─config 配置目录
│ │ ├─route 路由目录
│ │ └─ ... 更多类库目录</p>
<hr />
<h4>2. 模板文件</h4>
<p>前后端分离时,把编译后代码放到public/app/demo目录下 (demo为你的应用名称)</p>
<h4>3. 静态文件</h4>
<p>如果是非前后端分离模式,则需把 静态文件放到 public/static/demo(应用名)目录下, 引用时按照tp6框架正常引用即可</p>
<blockquote>
<p>【本地开发模式下】直接将资源文件放到public/static/demo 下面即可 (demo为你的应用名称)</p>
</blockquote>
<h4>4.插件配置文件 manifest.xml</h4>
<p>详见https://www.showdoc.com.cn/2068549701394518/9377743196801972</p>
<hr />
<h4>5. 中间件</h4>
<p>应用开发如果需要和框架的验证保持一致, 需添加应用中间件,中间件代码示例如下:</p>
<p>建议:
1.应用有管理后台, 建议写两个中间件以便区分不同的token验证, token是唯一值,通过token匹配用户或者管理员,每次请求将会把token有效期自动往后加 有效期</p>
<p>2.前后端分离建议token缓存到本地,请求接口时token放到Header中;前后端不分离建议token缓存到服务器端(Session默认未开启,建议在应用中间件定义文件中开启)</p>
<pre><code class="language-php"><?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);
}
}
</code></pre>
<pre><code class="language-php"><?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);
}
}</code></pre>
<hr />
<h4>6. 基础控制器</h4>
<p>通过token,获取相应用户信息或者管理员信息</p>
<p>代码示例如下:</p>
<pre><code class="language-php">
<?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']);
}
}
}</code></pre>
<pre><code class="language-php">
<?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']);
}
}
}</code></pre>
<hr />
<h4>7. 应用的路由配置route.php(这里主要体现路由中间件的注册方式)</h4>
<pre><code class="language-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);</code></pre>