1、文件上传

在laravel里面实现文件的上传是很简单的,压根不用引入第三方的类库,作者把上传作为一个简单的http请求看待的。官方手册:链接
1.修改表结构,添加一个字段。(文件路径path)
2.创建路由
3.创建视图页面并且添加@csrf

问题:请你说出文件上传的本质(核心思想) ?
答:就是临时文件的移动,move upload file( )
image.png
4.控制器:

  1. //file里面的名字要跟视图的name一致
  2. //store指的是存放的文件夹 返回为图片存储路径
  3. $path = $request->file('profile')->store('avatars');

修改配置文件:
image.png
上传文件存储示意图:
image.png
扩展:

// 获取上传文件扩展名
$extension = $request->file('fileName')->extension(); 
// 获取原始文件名
$name = $request->file('fileName')->getClientOriginalName();


//指定上传成功的文件名   1111.jpg
 $path = $request->file('fileName')->storeAs(
            'fileName', "11111.jpg"
        );
//扩展使用
$hname = $request->file('fileName')->extension(); //获取文件扩展名
$filename = time().rand(11111,9999).'.'.$hname;
$path = $request->file('fileName')->storeAs(
       'fileName', $filename
);
 dd($path);


2、数据分页

在laravel里面要完成分页是很简单的,它的思想之前的框架有些不一样,之前框架使用的是分页类完成分页,laravel是直接调用模型的分页方法,返回对应的数据和分页的字符串。
官方手册:链接

2.1.查询构造器分页

数据分页有多种方法。最简单的是使用 查询构造器 或 Eloquent query 的 paginate 方法。paginate 方法根据用户浏览的当前页码,自动设置恰当的偏移量 offset 和限制数 limit。默认情况下,HTTP 请求中的 page 查询参数值被当作当前页的页码。 Laravel 会自动检测该值,并自动将其插入到分页器生成的链接中。

在下面的例子中,传递给paginate方法的唯一参 数是你想要在每页显示的记录数。
在此例中,我们指定要在每页显示2条数据:

1.详细分页

控制器:

//每页展示两条数据(详细分页-带页码)
$nows = DB::table('member')->paginate(2);   
$data = compact('nows');
return view('fy',$data);


//如果你希望展示简单分页(没有页码的分页)
//可以调用simplePaginate( )方法
$users = DB::table('members')->simplePaginate(2);

分页样式只显示上一项和下- -页,中间的页码不显示,显示效果会发生样式错乱,是因为
laravel进阶 - 图8
修改配置文件:系统默认的样式比较乱
修改源码改成默认配置为bootstrap
. vendor/laravel/framework/srclluminate/Pagination/AbstractPaginator.
php 116行124行
image.png
视图 (展示分页结果):

//引入bootstrap css样式分页样式
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">



@foreach($nows as $v)
    {{$v->username}}
@endforeach

{{$nows->links()}}

2.搜索分页

如果你想要使分页链接携带参数,则可以使用appends( )方法

//如下实例代码可以使分页链接携带参数【属性->sort,值->votes】
{{ $users->appends(['sort' => 'votes'])->links() }}

如果你想要把所有的查询参数值添加到分页链接,可以使用withQueryString方法:

//如下实例可以将上一页查询的所有结果带给下一页
//当然,你也可以为withQueryString方法指定参数,带哪些数据
{{ $users->withQueryString()->links() }}

搜索分页
实例模板文件:

<form action="">
  //value  用来保存搜索的数据写入搜索框中
    <input type="text" name="search" value="{{request()->get('search')}}">
    <input type="submit" value="搜索">
    @foreach($nows as $v)
        <br>
        {{$v->username}}
        <br>
        {{$v->password}}
    @endforeach
      //appends 参数 用来在翻页时携带传参
    {{$nows->appends(['search'=>request()->get('search')])->links()}}
</form>

控制器:

//注意where都用where  orWhere都用orWhere 不能两者都用
$cont = $request->input('search');
        $nows = DB::table('member')
            ->orWhere('username','like',"%$cont%")
            ->orWhere('password','like',"%$cont%")->
            paginate(2);
$data = compact('nows');
return view('fy',$data);

3.获取分页信息

image.png

3、验证码

验证码:captcha,全自动区分人与计算机的图灵测试。
回顾:生成验证码需要经过:画画布、生成干扰线、生成噪点、生成验证码、生成验证码存入session、输出图片。
常见的验证码类型:字符验证码、短信验证码、电话验证码、12306类型验证码、拖拽验证码等。

1、验证码依赖安装

官方手册:链接
环境要求:php>=7.2,需要开启GD库,同时需要开启fileinfo和mbstring扩展\

1.1.Composer方法安装代码依赖包:

composer require mews/captcha


1.2修改配置文件:

配置:修改配置文件: config/app.php
配置provider信息, 添加一行信息: Mews\Captcha\CaptchaServiceProvider::class,

'providers'=>[
   //......
    Mews\Captcha\CaptchaServiceProvider::class,
]

image.png

1.3.配置别名aliases键,添加一个别名记录

‘Captcha’ => Mews\Captcha\Facades\Captcha::class,

   'aliases' => [
        // ...
        'Captcha' => Mews\Captcha\Facades\Captcha::class,
    ]


如果(可选)需要定义自己的配置,则需要生成配置文件:
php artisan vendor:publish

//如果希望定制验证码样式,就需要调用如下示例代码,
//此命令生成验证码配置文件

php artisan vendor:publish

//注意 :选12


发布之后会在config目录下找到对应的配置文件:
如果需要自定义配置(如长度、宽高等),可以修改配置文件config/captcha.php文件(当前默认是9个长度),可以去进行修改。:

image.png
2、案例

2.1.需要在页面上显示出来

视图中:

//1: 显示图片 本质是生成 img标签 
{!!captcha_img()!!} 


//2:可以进行点击刷新验证码 获取验证码的url
<img src="{{captcha_src()}}" alt="" onclick="this.src=this.src+'?rand='+Math.random()">

2.2 验证码验证操作 captcha

官方手册链接
注意:验证码有效性验证规则,手册里是没有的,如果使用mews验证码包的话,其验证码验证规则就是 captcha

public function yzmAction(Request $request)
    {
        $request->validate([
            'number'=>['required','captcha'],
        ]);
    }

2.3 翻译问题(参考laravel基础->自动验证部分)

4. 引入第三方类文件

官文:
laravel进阶 - 图13

4.1.app目录下创建公共目录文件用于存放第三方类文件


image.png

4.2.在目录中创建类文件,如Code.php,代码如下,切记命名空间

image.png

4.3.修改composer.json 文件,添加以下代码

image.png

4.4.执行命令重新加载composer.json文件

  composer dump-autoload

laravel进阶 - 图17

4.5.查看是否加载成功

image.png

4.6.控制器中使用

use App\Git\Code;


$code = new Code();
        dd($code->show());

5、自定义验证码类文件

<?php
namespace App\Libs;
/**

 * 生成验证码

 * Class VerificationCode
    */
    class VerificationCode {
    protected $image;
    protected $width;
    protected $height;
    protected $data;
    protected $num;
    protected $path;
    protected $strvalue="";

    /**

     * @param int $width
     * @param int $height
     * @param int $num
     * @param int $font_size
     * @param int $model
     * @param int $point_num
     * @param int $line_num
        */
        public function __construct($width,$height,$point_num,$line_num,$num=4,$font_size=6,$model=1){
        $this->width = $width;
        $this->height = $height;
        $this->num = $num;
        //创建白色底图
        $this->image = imagecreatetruecolor($this->width,$this->height);
        $bjcolor = imagecolorallocate($this->image,255,255,255);
        imagefill($this->image,0,0,$bjcolor);
        //填入验证码
        for($i = 0;$i<$this->num;$i++){
            $content = $this->CreateRandData($this->DataModel($model));
            $fontcolor = imagecolorallocate($this->image,rand(0,120),rand(0,120),rand(0,120));
            $x = rand(5,10)+$i*$this->width/$this->num;
            $y = rand(5,10);
            imagestring($this->image,$font_size,$x,$y,$content,$fontcolor);
        }
        //产生干扰
        $this->point($point_num);
        $this->line($line_num);
        }

    /**

     * 验证码产生数据模式
     * @param int $model
     * @return string
        */
        protected function dataModel($model){
        $str = "";
        switch ($model){
            //纯数字模式
            case 1:$str = "0123456789";
                break;
            //纯小写字母模式
            case 2:$str = "qwertyuiopasdfghjklzxcvbnm";
                break;
            //大小写随机模式
            case 3:$str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
                break;
            //数字字母随机模式
            case 4:$str = "0123456789qwertyuiopasdfghjklzxcvbnm";
                break;
            //数字大小写字母随机模式
            case 5:$str = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
                break;
            //数字字母安全识别模式
            case 6:$str = "23456789qwertyupasdfghjkzxcvbnm";
                break;
        }
        return $str;
        }
        protected function createRandData($str){
        $s = substr($str,rand(0,strlen($str))-1,1);
        $this->strvalue.=$s;
        return $s;
        }
        /**
     * 用于输出图片
        */
        public function showImage(){
        $newName = md5(time().$this->strvalue).".png";
        $this->path = 'temp/'.$newName;
        header('content-type:image/jpeg');
        imagejpeg($this->image,$this->path);
        return url($this->path);//在laravel框架中才有url这个方法,其他框架请替换这部分
        }

    /**

     * 用于
     * @return string
        */
        public function value(){
        return $this->strvalue;
        }

    /**

     * 产生点干扰
     * @param int $point_num 干扰点数目
        */
        protected function point($point_num=0){
        for($i=0;$i<$point_num;$i++){
            $pointcolor = imagecolorallocate($this->image,rand(50,200),rand(50,200),rand(50,200));
            imagesetpixel($this->image,rand(1,$this->width-1),rand(1,$this->height),$pointcolor);
        }
        }

    /**

     * 产生线干扰
     * @param int $line_num 干扰线数目
        */
        protected function line($line_num=0){
        for($i=0;$i<$line_num;$i++){
            $linecolor = imagecolorallocate($this->image,rand(80,220),rand(80,220),rand(80,220));
            imageline($this->image,rand(1,$this->width-1),rand(1,$this->height-1),rand(1,$this->width-1),rand(1,$this->height-1),$linecolor);
        }
        }

    /**

     * 析构函数,销毁图片
        */
        public function __destruct(){
        imagedestroy($this->image);
        }
        }

public function getVerCode(){
        $image = new VerificationCode(80,32,200,5,4,4,6);
        session(["code"=>$image->value()]);
        return $image->showImage();
    }


6、引入公共函数

6.1.app目录下创建公共目录用于存放公共函数

App\Common

6.2.在目录中创建文件,如functions.php

6.3.修改composer.json文件,添加以下代码

laravel进阶 - 图19

"files": ["app/Common/functions.php"]

6.4.执行命令加载composer.json文件

composer dump-autoload

6.5.查看公共函数是否加载成功

image.png

6.6.公共函数在控制器中的使用

image.png

7.中间件

7.1介绍

中间件提供了一种方便的机制来过滤进入应用程序的HTTP请求。例如,Laravel包含一个验证用户身份的中间件。如果用户未能通过认证,中间件会把用户重定向到登录页面。反之,用户如果通过验证,中间件将把请求进—步转发到应用程序中。
当然,除了验证身份外,还可以编写其他的中间件来执行各种任务。例如:CORS中间件可以负责为所有的应用返回的responses添加合适的响应头。日志中间件可以记录所有传入应用的请求。
Laravel自带了一些中间件,包括身份验证、CSRF 保护等。所有的这些中间件都位于app/Http/Middleware目录。

7.2定义中间件

//生成的文件位于app/http/middleware下

php artisan make:middleware CheckLogin

7.3 注册中间件(路由分配中间件)

7.3.1全局中间件

如果你希望中间件在应用处理每个HTTP请求期间都运行,只需要在
app/Http/Kernel.php中的$middleware 属性中列出这个中间件。
●全局中间件对所有路由生效,所以用途并不广泛
image.png

7.3.2为单个路由配置单个中间件

1.修改app/Http/Kernel.php文件中,添加合适代码(示例代码可以起别名)
laravel进阶 - 图23
2.使用middleware( )方法将中间件分配给路由:
image.png
注意:使用middleware( )方法也可以为同一个路由分配多个中间件,只需要传入多个参数即可,当然。如果一个路由具有多个中间件,我们更推荐使用中间件组的方式进行配置

Route::get('index', function () {
  //
})->middleware('cl','ca');

7.3.3 为路由群组配置单个中间件

image.png
注意:
- 如果需要阻止某个单个路由配置中间件需要withoutMiddleware( )方法
- withoutMiddleware( )方法只能删除路由中间件,不适用于全局中间件

7.3.4 中间件组

为路由群组配置中间件组
如果你要为你的路由分配多个中间件的话,可以把这些需要分配的中间件放到一个组中然后直接把这个分组分配给路由群组即可
1.修改Kernel.php

protected $middlewareGroups = [
     'myweb'=>[
        \App\Http\Middleware\CheckLogin::class,
     ],

2.修改路由文件

Route::group(["prefix"=>"admin","middleware"=>["myweb"]],
function(){
    Route::get("index","DayThreeController@index")->withoutMiddleware([CheckLogin::class]);
    Route::get("up","DayThreeController@up");

});

路由文件中:
image.png
配置文件:
image.png