官方文档:https://www.kancloud.cn/manual/thinkphp6_0/1037479
composer文档:https://www.kancloud.cn/thinkphp/composer
一.TP6下载安装
安装要求:
php>7.1.0
6.0版本开始,必须通过Composer方式安装和更新,所以你无法通过Git下载安装。
安装composer
1.下载 composer.exe
2.安装注意选择系统环境变量以及php
通过composer获取tp6
然后在你选择的目录下打开cmd
通过
composer create-project topthink/think tp
下载,然后你会发现
表示下载成功!
然后再目录下可以看到tp这个文件夹。自此tp6下载完成。
运行tp6
我使用的使phpstudy_pro。用phpstudy创建站点,目录选着到tp5/public中,具体如图所示
选择完成后,我们就可以直接使用啦。不要忘记打开apache OR nginx啊,然后我们可以直接打开网址
localhost:1470
观察到如下页面:
好,至此你的tp6已经安装完成。
目录结构分析
www WEB部署目录(或者子目录)
├─app 应用目录
│ ├─controller 控制器目录
│ ├─model 模型目录
│ ├─ ... 更多类库目录
│ │
│ ├─common.php 公共函数文件
│ └─event.php 事件定义文件
│
├─config 配置目录
│ ├─app.php 应用配置
│ ├─cache.php 缓存配置
│ ├─console.php 控制台配置
│ ├─cookie.php Cookie配置
│ ├─database.php 数据库配置
│ ├─filesystem.php 文件磁盘配置
│ ├─lang.php 多语言配置
│ ├─log.php 日志配置
│ ├─middleware.php 中间件配置
│ ├─route.php URL和路由配置
│ ├─session.php Session配置
│ ├─trace.php Trace配置
│ └─view.php 视图配置
│
├─view 视图目录
├─route 路由定义目录
│ ├─route.php 路由定义文件
│ └─ ...
│
├─public WEB目录(对外访问目录)
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
│
├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor Composer类库目录
├─.example.env 环境变量示例文件
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行入口文件
直接操作数据库
首先数据库我们新建一个命名为"tp6test"
新建表"zk_user"
三个字段
然后我们去tp/app下面新建一个文件夹命名为model
在model下面新建一个php,使其继承Model
然后再controller下面的index中新建一个函数名字随意,放入以下代码
public function asd()
{
$data = Db::name('user')->select();
return json_encode($data);
}
然后我们打开debug模式
在tp根目录下.example.env环境变量示例文件,改成.env文件后就可以了,然后修改一下数据库连接
在database.php中添加表前缀
然后我们访问http://localhost:1470/index.php/index/asd就可以看到我们的数据啦
然后我们集成一下JWT
1.客户端使用用户名和密码请求登录
2.服务端收到请求,验证用户名和密码
3.验证成功后,服务端会签发一个token,再把这个token返回给客户端
4.客户端收到token后可以把它存储起来,比如放到cookie中
5.客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
6.服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据
安装jwt扩展
composer require firebase/php-jwt
安装成功项目文件夹为 firebase
调用 JWT里面的 encode 和 decode方法进行生成token和验证token
在common.php下面放入以下代码
<?php
// 应用公共文件
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
/**
* 生成验签
* @param $uid 用户id
* @return mixed
*/
function signToken($uid){
$key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt
$token = array(
"iss" => $key,
//"aud" => $id,//接收人,也就是发给谁
"iat" => time(),//签发时间,当前时间
"nbf" => time()+3,//生效时间,在生成时间后一点点
'exp' => time()+10800,//过期时间,三个小时
'data'=> ['uid'=>$uid]//自定义信息
);
// print_r($token);
$jwt = JWT::encode($token, $key, "HS256"); //生成了 token
return $jwt;
}
/**
* 验证token
* @param $token
* @return array|int[]
*/
function checkToken($token){
$result["token"] = $token;
$key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt
try {
//延长有效期1分钟
JWT::$leeway = 60;
//对token解码,得到的一个对象,所以直接转成数组
$data = (array)JWT::decode($token,new Key($key, 'HS256'));
//获取token里面的相关信息并赋值给数据集
$result['data'] = $data['data'];
//定义Result变量的status字段
$result['status'] = 10001;
//验证通过后返回$result数据集
return $result;
//如果验证失败,catch以下错误
}catch (SignatureInvalidException $exception){
//定义result数据集状态码status和data的默认值
$result['status'] = 10002;
$result['data'] = '验证失败!请重新登录';
return $result;
}catch (BeforeValidException $exception){
//定义result数据集状态码status和data的默认值
$result['status'] = 10003;
$result['data'] = 'token未生效,请稍后!';
return $result;
}catch (ExpiredException $exception){
//定义result数据集状态码status和data的默认值
$result['status'] = 10004;
$result['data'] = '登录过期,请重新登录!';
return $result;
}catch (Exception $exception){
//定义result数据集状态码status和data的默认值
$result['status'] = 10005;
$result['data'] = '未知错误,请重新登录!';
return $result;
}
}
完成登录接口返回token
<?php
namespace app\controller;
use app\BaseController;
use think\facade\Db;
class User extends BaseController
{
public function login()
{
if ($this->request->isPost()){
$username = $this->request->param('username','','trim');
$password = $this->request->param('password','','trim');
//查询数据库
$user = Db::name('user')->where('username',$username)->select();
$user = $user[0]["id"];
if (!$user){
return json(['status' => 'fail','msg' => '用户名不存在?']);
}
$getToken = signToken($user);
return json(['status' => $user,'msg' => '登陆成功','token' => $getToken]);
}
}
}
利用tp6中间件去拦截检查是否携带token以及token是否正确
<?php
namespace app\middleware;
class Auth
{
public function handle($request, \Closure $next)
{
//获取前端header请求信息并把token信息转在字符串
$token = (string)$request->header('token');
if (empty($token)) {
return json(['status' => 'fail','msg' => $token]);
}
//调用JWTAuth里面的checkAdminToken()方法对token解码
$result = checkToken($token);
//result得到包含有status/data字段的数据集
// return $next($request);
if ($result['status'] !== 10001) {
//如果status 不等于10001,验证失败,返回错误提示
return json($result);
} else {
//否则验证通过,把result里面data数据传给$request
//经过测试,数据并不能传到¥request的header里面,也不知道怎么调用,很是烦躁
// $request->loginMsg = $result['data'];
//执行下一步代码
return $next($request);
}
}
}