IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> laravel框架使用教程 -> 正文阅读

[PHP知识库]laravel框架使用教程

laravel 框架的使用

aravel配置文件

1?? app --------------------------控制器模型,数据操作

2?? bootstrap--------------------系统所使用的目录,表格,样式,启动的文件

3?? config ------------------------包含邮件,session,view的配置文件

  • App.php---------------------项目的主要配置文件
  • Auth.php--------------------用于定义用户认证,登录的文件
  • Database.php-------------针对数据库的配置
  • factories
  • migrations-------------通过这个文件创建类,每一个数据表就是一个
  • seeds
  • Filesystems.php----------上传文件,文件存储需要使用到的配置文件

4?? public ------------------------入口文件

5?? resources--------------------存放视图文件,还有就是语言包的目录

  • Lang 目录:语言包目录(如果项目需要本地化则配置语言包)
  • Views 目录: 视图文件存储目录(视图文件也可以分目录管理)

7?? routes-------------------------定义路由的目录,web.php是定义路由的目录

8?? storage------------------------主要是存放缓存和日志文件,注意,在linux里,这个目录需要**可写权限**

  • app------------------用户上传的文件
  • framework---------框架运行时的缓存文件
  • logs------------------日志

9?? vendor------------------------第三方的代码依赖

🔟 .env-----------------------------主要是设置一些系统相关的环境配置文件信息. 1

创建controller

  1. 创建

    php artisan make:Controller

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;// 命名空间的三元素: 常量,方法,类
    
    class ni extends Controller
    {
        //
    }
    
  2. 路由的基本使用

    //跟路由
    Route::get("/",function(){
    	
    });
    
      $router->any("/home",function()
        {
            echo "这是/home";
        });
        $router->match(['get',"post"],"/home",function (){
            echo "这是/home";
        });
    // 路由参数
    // 必选参数
    $router->get("/home{id}",function(){
            echo $id;
        });
    // 可选参数
    $router->get("/home{id?}",function(){
            echo $id;
        });
    
    // 路由别名
    $router->get("/home{id?}",function(){
            echo $id;
        }) -> name("route");
    // 查看路由
    php artisan route:list
       
    // 路由群组
         Route::group(['prefix'=>"admin"],function(){
             
         });
    
  3. 控制器路由

    Route::请求方法(路由表达式,‘控制器@方法’)

  4. 控制器分目录管理

    后台管理

    php artisan make:controller admin/controller

    前代管理

    php artisan make:controller home/controller

  5. 接受用户输入

    Facades:门面,们面是一个类的实例化与没有实例化中间的一个状态,其实是类的一个接口是实现.在这个状态下可以不实例化类但是可以调用类中的方法.说白了就是静态方法

    use Illuminate\Support\Facades\Input

    Input:get("id","10086");// 属性名 , 默认值
    Input:all():获取所有的用户输入 // 返回的是一个数组
    Input:get(''):获取单个用户的输入
    Input:only([]):获取指定几个用户的输入
    

    注:以上6.0以下版本使用

    Request 这个 facade 可以让我们得到绑定在容器里的当前这个请求

    // 获取所有输入的值
    $request->input("");
    // 没有获取到,使用默认值
    $request->input("","默认值");
    // 确定一个值是否出现
    $request->has("name");
    // 得到请求里的所有输入的值
    $request->all();
    // 如果输入里面包含数组类型的值,可以使用点的形式访问到这个数组里的值:
    $request->input('mysql.table.name');
    
    // 可以把值缓存到会话里,这样用户下一次发送请求的时候就可以获取到以前的值
    Request::flash();
    // 缓存部分的值
    Request::flashOnly("username","password");
    
    graph TB
    A[Request]--->B(获取请求)
    B--->c[input]
    A--->D(加入缓存)
    D--->E[flash]
    

数据库的操作

对于数据的操作都是在模型中完成,但是如果不使用 Model ,我们也可以使用 DB类 来创建

数据表的创建与配置

  1. 建立数据库

    • sql 语句

    • 图形界面

    • 在config->database.php文件中配置

      如果是在php artisan serve方式启动的,修改了配置文件,则需要重新启动,才能读取修改后的配置文件,如果是wamp/lamp等环境则不需要重启;

  2. 数据库的增删改查

      public function add()
        {
            // 定义操作关联的表
            $db = DB::table("users");
            // 使用insert增加记录 连贯操作  链式操作
            $db->insert([
                [
                    'name'     => "付立翔",
                    'email'    => "2172792521@qq.com",
                    'password' => "123456",
                ]
            ]);
        }
        public function del()
        {
            // 定义操作关联的表
            $db = DB::table("users");
        }
        public function upd(Request $request)
        {
            // 定义操作关联的表
            $db = DB::table("users");
            $db->where("id", "=", "2")->update(["name" => "大师"]);
        }
        public function sel()
        {
            // 查询全部的数据
            $db = DB::table("users");
            // dd($db->get());
    
            // 查询id等于三的数据
             $data = $db ->where('id','=','2') ->get();
            dd($data);
        }
    // where()->where()->where() 这是并且关系
    // where()->orWhere()->orWhere() 这是或者关系
    
            // 按照指定的字段进行特定规则的排序
            $db->orderBy('age','desc')->get();
    // 执行任意的SQL语句
    1. 执行任意的 insert , delete , update 语句
        DB::statement
    2. 执行任意的 select 语句 
    	DB::select       
    

视图操作

// 返回视图
return view("index");
// 传递参数
1. return view("index",["ni"=>"ni","wo"="wo"]);
// 第一个是参数名,第二个是值
2. return view("index")->with("ni","ni")->with("wo","wo");
// compact 原生
3. $ni = "ni";
$wo = "wo";
return view('index',compact("ni","wo"));


 // 判断试图文件是否存在
 $router->get("wo", function () {
     if (View::exists("welcome")) {
         echo '视图存在';
     } else {
         echo '视图不存在';
     }
 });

数据库模型

创建数据库表

// 创建数据库表的模型
// 必选
protected $table = "users";
// 可选,禁用时间戳
protected $timestamps = false;
  1. 模型插入

    $this->insert([]);
    
  2. 模型查询

    $this->where('id','=','1')->get();
    
  3. 模型修改

    $this->where('id','=','1')->update([]);
    
  4. 模型删除

    $this->where('id','=','1')->delete();
    

分页数据

@foreach ($nn as $list)
        <tr>
            <td>{{ $list->id }}</td>
            <td>{{ $list->name }}</td>
            <td>{{ $list->email }}</td>
            <td>{{ $list->password }}</td>
        </tr>
    @endforeach

</table>
{{ $nn->links() }}

 // 在数据库中使用paginate方法
    public function fenye(){
        return $this->paginate(1);
    }

数据迁移

回滚最后一次迁移,可以使用 rollback 命令:

php artisan migrate:rollback

php artisan migrate:rollback --step=5 //回滚迁移的个数

php artisan migrate:reset //回滚应用程序中的所有迁移

php artisan migrate:refresh // 命令不仅会回滚数据库的所有迁移还会接着运行 migrate 命令

php artisan migrate  //恢复

注: 如果是第一次执行文件的话,则必须执行

php artisan migrate:install

给表添加注释

  1. 下载
composer require zedisdog/laravel-schema-extend
  1. 修改config->app.php->aliases

    'aliases' => [
        ...
        // 'Schema' => Illuminate\Support\Facades\Schema::class,
        'Schema'    => Jialeo\LaravelSchemaExtend\Schema::class,
    ],
    
    1. 使用

      默认创建的migration文件对应的“Schema”还是引用的laravel自带的,需要修改为该组件包的引用

    //use Illuminate\Support\Facades\Schema;
    use Jialeo\LaravelSchemaExtend\Schema;
    
1. php artisan make:migration CreateTestTable
2. php artisan migrate:fresh
    
    
// 使用 Artisan 命令 migrate 来运行所有未完成的迁移:
php artisan migrate   可以接表名
// 执行数据回滚,就是删除的意思
php artisan migrate:rollback 
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePaperTable extends Migration
{
    /**
     * Run the migrations.
     *  创建数据表
     * @return void
     */
    public function up()
    {
        Schema::create('paper', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     * 删除数据表
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('paper');
    }
}

命令详解

$table->id();	$table->bigIncrements('id') 的别名
$table->foreignId('user_id');	$table->unsignedBigInteger('user_id') 的别名
$table->bigIncrements('id');	递增 ID(主键),相当于「UNSIGNED BIG INTEGER$table->bigInteger('votes');	相当于 BIGINT
$table->binary('data');	相当于 BLOB
$table->boolean('confirmed');	相当于 BOOLEAN
$table->char('name', 100);	相当于带有长度的 CHAR
$table->date('created_at');	相当于 DATE
$table->dateTime('created_at', 0);	相当于 DATETIME ,可以指定位数
$table->dateTimeTz('created_at', 0);	相当于 DATETIME (带时区) ,可以指定位数
$table->decimal('amount', 8, 2);	相当于 DECIMAL,可以指定总位数和小数位数
$table->double('amount', 8, 2);	相当于 DOUBLE,可以指定总位数和小数位数
$table->enum('level', ['easy', 'hard']);	相当于 ENUM
$table->float('amount', 8, 2);	相当于 FLOAT,可以指定总位数和小数位数
$table->geometry('positions');	相当于 GEOMETRY
$table->geometryCollection('positions');	相当于 GEOMETRYCOLLECTION
$table->increments('id');	递增 ID(主键),相当于 UNSIGNED INTEGER
$table->integer('votes');	相当于 INTEGER
$table->ipAddress('visitor');	相当于 IP 地址
$table->json('options');	相当于 JSON
$table->jsonb('options');	相当于 JSONB
$table->lineString('positions');	相当于 LINESTRING
$table->longText('description');	相当于 LONGTEXT
$table->macAddress('device');	相当于 MAC 地址
$table->mediumIncrements('id');	递增 ID(主键),相当于 UNSIGNED MEDIUMINT
$table->mediumInteger('votes');	相当于 MEDIUMINT
$table->mediumText('description');	相当于 MEDIUMTEXT
$table->morphs('taggable');	相当于加入递增 UNSIGNED BIGINT 类型的 taggable_id 与字符串类型的 taggable_type
$table->uuidMorphs('taggable');	相当于添加一个 CHAR (36) 类型的 taggable_id 字段和 VARCHAR (255) UUID 类型的 taggable_type
$table->multiLineString('positions');	相当于 MULTILINESTRING
$table->multiPoint('positions');	相当于 MULTIPOINT
$table->multiPolygon('positions');	相当于 MULTIPOLYGON
$table->nullableMorphs('taggable');	添加一个可以为空版本的 morphs() 字段.
$table->nullableUuidMorphs('taggable');	添加一个可以为空版本的 uuidMorphs() 字段
$table->nullableTimestamps(0);	timestamps() 方法的别名
$table->point('position');	相当于 POINT
$table->polygon('positions');	相当于 POLYGON
$table->rememberToken();	添加一个允许空值的 VARCHAR (100) 类型的 remember_token 字段
$table->set('flavors', ['strawberry', 'vanilla']);	相当于 SET
$table->smallIncrements('id');	递增 ID(主键),相当于 UNSIGNED SMALLINT
$table->smallInteger('votes');	相当于 SMALLINT
$table->softDeletes('deleted_at', 0);	相当于为软删除添加一个可空的 deleted_at 字段
$table->softDeletesTz('deleted_at', 0);	相当于为软删除添加一个可空的 带时区的 deleted_at 字段
$table->string('name', 100);	相当于指定长度的 VARCHAR
$table->text('description');	相当于 TEXT
$table->time('sunrise', 0);	相当于指定位数的 TIME
$table->timeTz('sunrise', 0);	相当于指定位数带时区的 TIME
$table->timestamp('added_on', 0);	相当于指定位数的 TIMESTAMP
$table->timestampTz('added_on', 0);	相当于指定位数带时区的 TIMESTAMP
$table->timestamps(0);	相当于添加可空的 TIMESTAMP 类型的 created_at 和 updated_at
$table->timestampsTz(0);	相当于添加指定时区的可空的 TIMESTAMP 类型的 created_at 和 updated_at
$table->tinyIncrements('id');	相当于自动递增 UNSIGNED TINYINT
$table->tinyInteger('votes');	相当于 TINYINT
$table->unsignedBigInteger('votes');	相当于 UNSIGNED BIGINT
$table->unsignedDecimal('amount', 8, 2);	相当于 UNSIGNED DECIMAL ,可以指定总位数和小数位数
$table->unsignedInteger('votes');	相当于 UNSIGNED INTEGER
$table->unsignedMediumInteger('votes');	相当于 UNSIGNED MEDIUMINT
$table->unsignedSmallInteger('votes');	相当于 UNSIGNED SMALLINT
$table->unsignedTinyInteger('votes');	相当于 UNSIGNED TINYINT
$table->uuid('id');	相当于 UUID
$table->year('birth_year');	相当于 YEAR

数据类型结构

*Blueprint类中的方法方法  <-> 数据库数据类型
*
*/
// 数字
increments();// int(10) unsigned primarykey auto_increment
bigInteger();// bigint(20)
unsignedBigInteger();// bigint(20) unsigned
integer();// int(11)
unsignedInteger();// int(10) unsigned
mediumInteger();// mediumint(9)
unsignedMediumInteger()// mediumint(8) unsigned
smallInteger();// smallint(6)
tinyInteger();// tinyint(4)
boolean();// tinyint(1)
decimal();// deciaml 长度和小数位长度
unsignedDecimal();// decimal(8, 2) unsigned
double();// double
float();// double(8, 2)
binary();// blob
boolean();// 相当于BOOLEAN 其实也就是tinyint(1)
// 字符串
char();// char(255)
uuid();// char(36)
string();// varchar(255)
remember_token();// varchar(100)
ipAddress();// varchar(45)
macAddress();// varchar(17)
text();// text
longText();// longtext
mediumText();// mediumText
enum();// enum()
lineString();// linestring
multiLineString();// multilnestring
// 时间
year();// year(4)
date();// date
dateTime();// datetime
time();// 不带时区的time
timeTz();// 带时区的time
timestamp();// timestamp
// 特殊
point();// point
multiPoint();// multipoint
Polygon();// polygon
multiPolygon();// multipolygon

创建填充器

  1. 创建

    php artisan make:seeder 
    
    <?php
    
    namespace Database\Seeders;
    
    use Illuminate\Database\Seeder;
    use Illuminate\Support\Facades\DB;
    class n1Seeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return
         */
        public function run()
        {
            // 定义数组
            $data=[
                'parper_name'=>"五年高考,三年模拟",
                'total_score'=>23,
            ];
            // 写入数据
            DB::table('paper')->insert($data);
        }
    }
    
    

// 使用工厂函数添加数据
/**

   * 运行数据库填充
   
   *

   * @return void
   
   */
   
  public function run()
   
  {
   
      DB::table('users')->insert([
   
          'name' => str_random(10),
   
          'email' => str_random(10).'@gmail.com',
   
          'password' => bcrypt('secret'),
   
      ]);
   
  }
执行

?```php 
php artisan db:seed --class=文件名

表单

1. 表单提交

表单提交需要加==@csrf== 防止csrf攻击

或者在middleware中的VenifyCsrfToken.php中添加白名单

image-20210423191100136

2. 表单验证

$this->validata($request,[
    "name" => 'required|min:2|max:30', // 不能为空 最小二,最大三十
    'age' => 'required|interger' // 不能为空,整型
    'eamil'=>'required|email' // 不能为空 并且是邮箱
    confirmed // 验证两个字段是否相同
    

还有一个报错捕获,我没写

3. laravel的验证码

  1. 🔍 搜索captcha
  2. 使用命令行下载 composer require mews/captcha
  3. 使用命令进行配置 php artisan vendor:publish

artisan命令

设置自定义命令

php artisan make:command HelloMessage --command=Hello:info

tinker命令行

交互式的数据库命令行

什么用都没有

服务容器

1. 可以在任何地方使用,相当于解耦
interface Food
{
   public function weight();
}

class Apple implements Food
{
   public function __construct($weight)
   {
       return $this->weight = $weight;
   }
   public function weight()
   {
       return $this->weight();
   }
}
// 绑定
app()->bind('weight', function () {
   return new Apple("100");
});

facade

Contracts

ajax请求的响应

  1. 返回json

      // 两种方法可以转换json
       return json_encode($data);
       return response()->json($data);
    

注:php是不能直接发回boolean类型的数据的

  1. 跳转响应(重定向)

    return redirect(路由);
    

回话控制

  1. Session::put("name","value");
    
  2. Session::get("name");
    Session::all();
    
  3. Session::forget("name");
    Session::flush();
    
  4. 判断

    Session::has("name");
    

缓存控制

配置

Laravel 为不同的缓存系统提供了统一的 API。缓存配置位于 config/cache.php。在该文件中你可以指定在应用中默认使用哪个缓存驱动。Laravel 开箱支持主流的缓存后端如 Memcached Redis 等。

缓存配置文件还包含其他文档化的选项,确保仔细阅读这些选项。默认情况下,Laravel 被配置成使用文件缓存(file 驱动),这会将序列化数据和缓存对象存储到文件系统。对于大型应用,建议使用内存缓存如 Memcached 或 APC,你甚至可以为同一驱动配置多个缓存配置。

  1. 设置缓存

    存在,覆盖

    Cache::put("key","value",$minutes);
    

    存在,不覆盖

    Cache::add("key","value",$minutes);
    
  2. 删除缓存

    Cache::forever("key","value");
    
  3. 获取缓存

    Cache::get("name");
    

联表查询

跟数据库一样

关联模型

  1. 1对1

    // 第一个表
    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class article extends Model
    {
        // 定义关联的数据库表
        protected $table = 'flx';
        //禁用时间字段
        public $timestamps = false;
    	// 通过下面的方法进行关联
        public function article2(){
            return $this->hasOne("App\Models\article2","id","author_id");
        }
    }
    // 第二个表
    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class article2 extends Model
    {
          // 定义关联的数据库表
          protected $table = 'flx2';
          //禁用时间字段
          public $timestamps = false;
    
    }
    
    // 通过地下这种方式调用
        public function  one()
        {
            $data = \App\Models\article::find(1);
            echo $data; // 第一个表
            echo $data->article2; //第二个表
            .... 下面可以动态获取属性
         }
    }
    
  2. 1对多

    //hasMany
    //belongsto
    
  3. 多对多

    基本理解:

    多对多基本使用id来进行关联

    一对多使用属性进行关联

    $this->belongsToMany(Student::class,"course_student","course_id","student_id","course_id","student_id");
    参数说明
    1. 关联的表的模型
    2. 中间表名
    3. 本模型外键
    4. 关联模型外键
    5. 中间表本模型外键
    5. 中间表关联模型外键
    

model各种参数说明

1. g u a r d e d 属 性 , guarded属性, guardedfillable属性

g u a r d e d 属 性 一 般 是 和 guarded属性一般是和 guardedfillable对应的,不是一起存在但是互相使用,他们都是laravel的批量赋值方法create()的,一个设置属性参数,有点这个意思。

在create方法收集数据赋值的时候

$flight = App\Flight::create(['name' => 'Flight 10']);

$fillable就像是可以被赋值属性的“白名单”,还可以选择使用$guarded$guarded属性包含你不想被赋值的属性数组。所以不被包含在其中的属性都是可以被赋值的,因此,$guarded方法就像“黑名单”。当然,你只能同时使用其中一个——而不是一起使用:

$fillable属性里面的字段被填上,说明这个字段是可以赋值的,其他的所有属性不能被赋值

$guarded属性里面的字段被填上,说明这个字段不可以赋值,其他的所有属性都能被赋值

所有$guarded相对来说在模型中出现频率比那个高。

2.$dates属性

  protected $dates = [
    'start_time',
    'close_time',
    'created_at',
    'updated_at'
  ];

里面所包含的字段,就是当使用这个属性的时候,可以直接后面跟着carbon类时间操作的任何方法,例如一个模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 应该被调整为日期的属性
     *
     * @var array
     */
    protected $dates = ['created_at', 'updated_at', 'disabled_at'];
}

使用到这个属性disabled,那么这个属性在$dates里面是存在的,所以他后面可以直接跟getTimestamp()方法,来各种处理。getTimestamp()方法是取时间戳的,他是carbon类下的兄弟。

$user = App\User::find(1);
return $user->disabled_at->getTimestamp();

如果你在$dates里面将 disabled_at属性去除,OK,你在用getTimestamp()方法就不行了,失去了操作carbon类方法的能力

3.$attributes属性

默认给数据库里的一个字段赋值

  protected $attributes = [
    'user_limit' => 100,
  ];

默认给这个模型表的user_limit字段附上100的值

4.$timestamps属性

laravel默认会默认在create()方法创建添加数据的时候,将create_at字段更新,如果是进行修改操作,将会更新updated_at属性里面的值。

如果将

public $timestamps = false;

设为假的话,表示create方法执行时,不会对create_at和updated_at修改

hidden 和 visible

  1. 隐藏字段信息

    比如我的密码不能够在查询的时候显示出来

    protected $hidden = ['password'];
    
  2. 允许显示的

    protected $visible = ['first_name', 'last_name'];
    

    这里只能设置一个,不能同时,否则只会执行 $visible

  3. 临时暴露隐藏属性makeVisible(‘password’)

       $merchant=Merchant::first()->makeVisible('password')->toArray();   print_r($merchant);
    
  4. 临时隐藏属性makeHidden(‘password’)

      $merchant=Merchant::first()->makeHidden('password')->toArray();  print_r($merchant);
    

  1. config文件一般是读取本文件的配置信息 ??

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 13:52:49  更:2021-09-27 13:53:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 5:35:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计