ThinkPHP8.x

06-01 1379阅读

一.phpEnv配置安装

1.学习基础

ThinkPHP8.x:

。前端基础:HTML5/CSS(必须)、JavaScript(可选、但推荐有);

。后端基础:PHP基础,版本不限,但不能太老,至少PHP5.4以上语法,TP8是兼容PHP8.x的;

。数据库基础:MySQL数据库,掌握了常规的SQL语句。

。编码思维基础:MVC、MVVM、设计模式(单例、观察者等)有简单认知即可;

2. 软件获取

phpEnv:

官方网站:https://www:phpenv.cn/

(专业优雅强大的PHP集成环境)

下载最新版本,自动安装后(默认C盘,可选),界面如下

ThinkPHP8.x

ThinkPHP8.x

ThinkPHP8.x

简单配置:

。应用软件->设置->开启CDN加速(方便我们后续安装各种软件);

。安装 PHP8.2和 MySQL8,选择 Apache (部署的时候可以选nginx);

。然后点击 启动服务 ,允许各种允许访问即可;

在浏览器输入:localmst(或者点击主页),即可访问PHP探针。【点击网站->创建项目列表】

ThinkPHP8.x

ThinkPHP8.x

ThinkPHP8.x

创建站点:

。点击 主页 下 网站,添加一个虚拟网站,以便后续学习测试:

。可以选择自定义的目录,我教学方便,就默认了;

。添加后,会写入hosts,这样我们输入 www.tp.com 域名后就可以访问了

。默认会给你一个index.php,显示结果为:php8.2info

ThinkPHP8.x

ThinkPHP8.x

02.ThinkPHP8.x配置安装

1. ThinkPHP8.x安装【手册->基础->安装】

主要特性:(来自手册:https://doc.thinkphp.cn/v8_0/preface.html)

  • 支持PHP8强类型、支持6.x无缝升级、语义化版本策略、升级PSR规范依赖版本;

  • 安装方式:

    • 仅在windows教学,Linux或其它平台对照手册执行即可;
    • 键盘:win + R,输入cmd,输入composer,判断是否已经安装;
    • 如果没有安装composer,则:https://getcomposer.org/Composer-Setup.exe (来自手册);
    • 切换至你项目的根目录,比如第一节课创建的 www.tp.com 文件夹的上一层 www;
    • 输入安装命令:composer create-project topthink/think www.tp.com;
    • 注意:被安装的文件夹必须是空的,先要删除里面的内容;
    • 各种超时,可以先修改成国内源,比如阿里:
    • composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
    • 查看是否成功:composer config -g -l

      ThinkPHP8.x

      ThinkPHP8.x

      ThinkPHP8.x

      ThinkPHP8.x

      2. 启动程序

      • IDE载入

        • 开发工具任意,因为我们在浏览器测试即可,我这里选择了VS Code,备选如下:
          • phpStorm
          • sublime Text4
          • Zend Stduio
          • 载入项目后,在IDE的终端输入内置服务器命令:php think run,启动Web服务;
          • 访问方式为:www.tp.com:8000 ,默认端口8000,当然也有80端口,不过被占用了;
          • 此时,我们发现,phpEnv还没启动呢,怎么就可以访问了呢?
          • 官方手册 -> 命令行 -> 启动内置服务器,有讲,这是内置的Web服务器,其它服务没有;
            • 所以学习使用时,推荐开启着,比如数据库连接等服务还需要。

              进入命令行下面,执行下面指令:php think run

              ThinkPHP8.x

              在浏览器中输入地址::http://localhost:8000/

              会看到欢迎页面。恭喜你,现在已经完成ThinkPHP8.0的安装!

              ThinkPHP8.x

              • 删除广告

                • ThinkPHP8.x目前非常的商业化,打开后,广告糊一脸,我们先把这个去掉。
                • 在app/controller/index.php中的index方法,自定义return结果即可。
                • 或者执行phpinfo()函数,来检测php版本。

                  ThinkPHP8.x

                  ThinkPHP8.x

                  03. 编码规范.目录.配置

                  1. 编码规范

                  • 完全版参考手册,这里说重点:
                    • TP8遵循PSR-2命名规范、PSR-4自动加载规范;
                    • 类名和文件名保持一致,驼峰式命名(首字母大写)如:Index,BaseController
                    • 方法和函数名用驼峰式命名(首字母小写)如:index(),hello()
                    • 数据表和字段用蛇式命名(两个单词中间下划线)如:think_name,user_name
                    • 更多对照手册【下图】

                      ThinkPHP8.x

                      2. 目录结构

                      • 对于初学者,一个个说是干啥的,没有意义,这里说重点:
                        • app目录是应用目录,我们开发程序就在这个目录
                        • config是配置目录,顾名思义,配置程序状态
                        • public是公共目录,对外访问目录,运行程序默认执行此目录的index.php
                        • 剩下的,后续学到一个,讲一个。

                          3. 配置定义

                          • 默认情况下,程序出错会显示:页面出错!请稍候再试~
                          • 这种情况,一般是应用部署好后,万一出错给用户看的;
                          • 如果我们自己在开发阶段,需要开启调试模式,来提示具体的错误信息:
                            • 在根目录有一个文件:.example.env,改成 .env ,也就是去掉点前面;
                            • 然后在配置信息的第一行:APP_DEBUG = true 即可,false则不开启。

                              ThinkPHP8.x

                              .example.env 文件重构前的错误提示或者APP_DEBUG = false

                              ThinkPHP8.x

                              ThinkPHP8.x

                              .env 文件重构后的错误提示:

                              ThinkPHP8.x

                              • 调试模式开启后,可以发现右下角会出现trace调试工具小图标:
                                • 包含了丰富的调试内容:具体自点查看。

                                  04. URL访问模式

                                  1. 单应用URL

                                  http://serverName/index.php/控制器/操作/参数/值…
                                  
                                  • 注意:这里服务器启动是 php think run 的内置服务器,

                                    下节课会探讨外置服务器(例:PHPEnv);

                                  • 结构分析:

                                    • serverName就是我们的:www.tp.com:8000;

                                    • index.php 是入口文件,带上 / ;【http://localhost:8000/index.php/ 】

                                    • 控制器是app\controller\Index.php中的 Index 这个名称,也就是类名;

                                    • 操作是类里面的方法名,比如:index(默认方法),hello(普通方法);

                                    • 默认方法可以省略,会直接方法,其他普通方法需要键入方法名:

                                      • http://www.tp.com:8000/index.php/Index (默认执行index操作)
                                      • http://www.tp.com:8000/index.php/Index/index (完整路径)
                                      • http://www.tp.com:8000/index.php/Index/test (普通方法,必须完整路径)
                                      • 系统默认自带的hello方法,是针对后续路由课程的,在路由文件设置过导致无效;

                                      • 我们在config/app.php中将路由关闭:“with_route” => false,

                                        • http://www.tp.com:8000/index.php/Index/hello (执行默认参数值)
                                        • http://www.tp.com:8000/index.php/Index/hello/name/World(修改参数值)
                                        • 参数不够直观,尤其多参数的时候,也是支持传统方案的:

                                          • http://www.tp.com:8000/index.php/Index/hello?name=World (问号键值对)

                                            ThinkPHP8.x

                                            ThinkPHP8.x

                                            *ps:*很郁闷,这边with_route => true 或 with_route => false ,http://localhost:8000/index.php/Index/hello/都没报错

                                            跟下面这段话矛盾:

                                            【-系统默认自带的hello方法,是针对后续路由课程的,在路由文件设置过导致无效;

                                            -我们在config/app.php中将路由关闭:“with_route” => false,】

                                            with_route => true的情况,如下图:

                                            ThinkPHP8.x

                                            2. 多应用URL

                                            http://serverName/index.php/应用/控制器/操作/参数/值…
                                            
                                            • 如果开启多应用的话,URL比单应用多一个 应用 路径,其它一致;
                                            • 由于我们教学,都在单应用上,暂时不刻意演示,如果后续有机会,放到最后;
                                            • ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c28988e0e13148f5b1633cc42d4a0f7a.png

                                              05. 内.外置服务器

                                              1. 启动内置

                                              • 在手册命令行 -> 启动内置服务器,有 php think run 启动的服务器介绍;
                                              • 启动后直接输入:127.0.0.1:8000 或 localhost:8000 或 www.tp8.com:8000 访问;
                                              • 停止内置服务器,在命令行使用 ctrl + c

                                                2. 启动phpEnv

                                                • 不管是本地的外置服务器集成环境phpEnv,还是以后要部署到远程服务器,都需要配置;

                                                • 这里需要配置的重点就是伪静态,我们不启动内置服务器,只用外置访问试试;

                                                • 注意:这里外置服务器,在第一课我们已经创建了 端口为 80 的 www.tp8.com;

                                                • 现在,直接访问试试?但出现了如下图的错误:

                                                • 我们在 www.tp.com 目录下创建一个index.html或index.php索引文件,访问后:

                                                • ThinkPHP8.x

                                                • ThinkPHP8.x

                                                  3. 配置目录

                                                  • 在第一节课,我们创建的启动目录是 www.tp.com ,但目前知道这个目录下没有 index.php;
                                                  • 在手册的 基础 -> 目录结构 中 public 目录 解释为:WEB目录(对外访问目录);
                                                  • 并规范到:在实际项目部署中,确保只将 public 对外访问;
                                                  • 所以,我们将phpEnv站点配置目录设置为:www.tp.com/pubic 即可;
                                                  • 至于http.conf、伪静态和.htaccess等配置信息,默认情况下支持都用,后续需要配置再说;
                                                  • ThinkPHP8.x
                                                  • ThinkPHP8.x

                                                    06. 控制器的定义

                                                    1. 定义方式

                                                    • 控制器:顾名思义MVC中的C,即逻辑控制定义;
                                                    • 默认在app\controller下编写对应的控制器类文件,如果想改默认目录:
                                                      // 访问控制器层名称
                                                      "controller_layer"      => "controller",
                                                      

                                                      ThinkPHP8.x

                                                      • 类名和文件名大小写保持一致,并采用驼峰式(首字母大写);

                                                        // app\controller\User.php
                                                        namespace app\controller;
                                                        class User
                                                        {
                                                            public function index()
                                                            {
                                                                return "用户";
                                                            }
                                                            
                                                            public function login()
                                                            {
                                                                return "登录成功!";
                                                            }
                                                        }
                                                        
                                                        • User类创建两个方法 index(默认)和 login,访问 URL 如下:
                                                        • http://www.tp.com:8000/Index.php/user/ 【后面的index方法是默认的,可以省略】
                                                        • http://www.tp.com:8000/Index.php/user/login

                                                          ThinkPHP8.x

                                                          ThinkPHP8.x

                                                          ThinkPHP8.x

                                                        • 那么如果创建的是双字母组合,比如 class HelloWorld,访问 URL 如下:

                                                        • http://www.tp.com:8000/Index.php/helloworld

                                                        • http://www.tp.com:8000/Index.php/hello_world

                                                          namespace app\controller;
                                                          class HelloWorld
                                                          {
                                                              public function index()
                                                              {
                                                                  return "index";
                                                              }
                                                          }
                                                          

                                                          ThinkPHP8.xThinkPHP8.x

                                                          2. URL重写

                                                          • URL重写可以省去 index.php 入口文件的键入,默认情况下内置服务器支持重写;

                                                            http://www.tp.com:8000/User

                                                          • 而外置服务器,比如phpEnv,省略了入口文件,则出现如下问题:

                                                            ThinkPHP8.x

                                                          • 查看手册,根据它URL重写的修改方案(Apache),需要修改.htaccess最后一行:

                                                            #RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]  Apache替换成下面一行
                                                            RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
                                                            

                                                            ThinkPHP8.x

                                                            ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/187dd3ee08b842eeac899563650a7785.png)
                                                            • 备注:不同的环境、服务器等等都会有千奇百怪的问题,努力搜索解决即可;

                                                            • 如果实在解决不了,请就用 php think run 内置服务器就了,省事。

                                                            • 到时候部署到真实服务器环境,再折腾。。。

                                                              3. 配置渲染

                                                              • 如果你想避免引入同类名时的冲突,可以 config\route.php 设置控制器后缀:

                                                                // 是否使用控制器后缀
                                                                // 此时,User.php 就必须改成 UserController.php,并类名也需要增加后缀
                                                                "controller_suffix"  => true,
                                                                

                                                                ThinkPHP8.x

                                                                • ThinkPHP 直接采用方法内 return 返回的方式直接就输出了;

                                                                • 如果需要使用 json 输出,直接采用 json 函数;

                                                                  // json输出,不同浏览器美化样式不同,我这里用的FireFox
                                                                  public function json()
                                                                  {
                                                                  	return json(["name" => "王二狗", "age" => 25, "gender" => "男"]);
                                                                  }
                                                                  
                                                                • 不推荐使用 die、exit 等 PHP 方法中断代码执行,推荐助手函数 halt();

                                                                  halt("中断测试");
                                                                  

                                                                  07. 基础和空控制器

                                                                  1. 基础控制器

                                                                  • 一般来说,创建控制器后,推荐继承基础控制器来获得更多的功能方法;

                                                                  • 基础控制器仅仅提供了控制器验证功能,并注入了think\App和think\Request;

                                                                  • 这两个对象后面会有章节详细讲解,下面我们继承并简单使用一下;

                                                                    namespace app\controller;
                                                                    use app\BaseController;
                                                                    class User extends BaseController
                                                                    {
                                                                        public function index()
                                                                        {
                                                                            // 返回实际路径
                                                                            return $this->app->getBasePath();
                                                                            // 返回当前方法名
                                                                            return $this->request->action();
                                                                        }
                                                                    }
                                                                    

                                                                    ThinkPHP8.x

                                                                    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4bfb3afb3b684d29adcb5de493433030.pngThinkPHP8.x

                                                                    ThinkPHP8.x

                                                                    http://www.tp8.com/user/index

                                                                    http://www.tp8.com/user/

                                                                    这里index可以省略。

                                                                    2. 空控制器

                                                                    • 空控制器一般用于载入不存在的控制器时,进行错误提示;

                                                                      class Error
                                                                      {
                                                                          public function __call(string $name, array $arguments)
                                                                          {
                                                                              return "当前控制器不存在!".$name;
                                                                          }
                                                                      }
                                                                      

                                                                      ThinkPHP8.x

                                                                      ThinkPHP8.x

                                                                      ThinkPHP8.x

                                                                      ThinkPHP8.x

                                                                      注意: __call是固定方法,可以直接打下划线,这样子编辑器中会提示。(phpstorm软件中)

                                                                      08. 创建数据表及填充

                                                                      1. 创建数据表

                                                                      • 我们直接使用phpEnv自带的MySQL操作软件:HeidiSQL,简称HS;

                                                                      • 登录的时候,注意修改root和密码后,保存,下次方可直接打开;

                                                                      • 首先,我们创建一个数据库:demo,用于测试:

                                                                        登入账号:root 密码:root

                                                                        ThinkPHP8.x

                                                                        ThinkPHP8.x

                                                                        ThinkPHP8.x

                                                                        ThinkPHP8.x

                                                                        ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8118a755b676470bbe6a6bf4b158cb80.png

                                                                        ThinkPHP8.x

                                                                        2. 创建用户表

                                                                        • 设置好数据库后,我们创建一个user表,包含id、name、age、gender、details等字段;

                                                                          ThinkPHP8.x

                                                                          ThinkPHP8.x

                                                                          ThinkPHP8.x

                                                                        • 然后,我们填充一些数据,方便查询测试:

                                                                          ThinkPHP8.x

                                                                        • 最后,我们通过SQL语句来测试一下:

                                                                          ThinkPHP8.x

                                                                          09. 连接数据库和查询

                                                                          1. 连接数据库

                                                                          • 我们可以在 config\database.php 配置文件中设置与数据库的连接信息:

                                                                            • 如果是一般性数据库连接,在 ‘’connections‘’ 配置区设置即可;

                                                                            • 如果是本地测试,它会优先读取 .env 配置,然后再读取 database.php 的配置;

                                                                              # .env文件,部署服务器,请禁用我
                                                                              APP_DEBUG = true   【**不用开启调试模式**】
                                                                              DB_TYPE = mysql
                                                                              DB_HOST = 127.0.0.1
                                                                              DB_NAME = demo
                                                                              DB_USER = root
                                                                              DB_PASS = 123456
                                                                              DB_PORT = 3306
                                                                              DB_CHARSET = utf8
                                                                              DEFAULT_LANG = zh-cn
                                                                              
                                                                            • 如果禁用了 .env 配置,则会读取数据库连接的默认配置:

                                                                              // 数据库连接配置信息
                                                                              "connections"     => [
                                                                                  "mysql" => [
                                                                                      // 数据库类型
                                                                                      "type"            => env("DB_TYPE", "mysql"),
                                                                                      // 服务器地址
                                                                                      "hostname"        => env("DB_HOST", "127.0.0.1"),
                                                                                      // 数据库名
                                                                                      "database"        => env("DB_NAME", "tp8"),
                                                                                      // 用户名
                                                                                      "username"        => env("DB_USER", "root"),
                                                                                      // 密码
                                                                                      "password"        => env("DB_PASS", "root"),
                                                                                      // 端口
                                                                                      "hostport"        => env("DB_PORT", "3306"),
                                                                              

                                                                              ThinkPHP8.x

                                                                              ThinkPHP8.x

                                                                              2. PHP获取数据

                                                                              • 我们暂时没有详细学习此类语法,可以简单用一些了解一下即可:

                                                                                // 引入Db数据库类
                                                                                use think\facade\Db;
                                                                                class User extends BaseController
                                                                                {
                                                                                    public function get()
                                                                                    {
                                                                                        // 连接user表,查询
                                                                                        $user = Db::table("user")->select();
                                                                                        // 输出数据
                                                                                        return json($user);
                                                                                    }
                                                                                }
                                                                                

                                                                                ThinkPHP8.xThinkPHP8.xThinkPHP8.x

                                                                                ps:测试,这里删除.env,database.php中数据库未配置数据的情况

                                                                                ThinkPHP8.x

                                                                                ThinkPHP8.x

                                                                                删除了.env,database.php中数据库配置好数据的情况

                                                                                ThinkPHP8.x

                                                                                ThinkPHP8.x

                                                                                本地测试使用.env,database.php在服务器段使用配置好的默认值。

                                                                                10. 构造器之数据查询

                                                                                1. table方法

                                                                                • Db类旗下有一个 table 静态调用的方法,参数为完整的表名(前缀都不能省略);

                                                                                • 如果希望只查询一条数据,可以使用 find() 方法,需指定 where 条件:

                                                                                  // 通过ID查询指定的数据
                                                                                  // find 方法查询结果不存在,返回 null,否则返回结果数组
                                                                                  $user = Db::table("user")->where("id", 1)->find();
                                                                                  

                                                                                  查询最后一个sql语句是什么。

                                                                                  ThinkPHP8.x

                                                                                  ThinkPHP8.x

                                                                                • 想要了解执行的原生SQL是什么,可以注释掉 return 直接通过 trace 查看;

                                                                                • 使用 findOrEmpty() 方法也可以查询一条数据,但在没有数据时返回一个空数组:

                                                                                  // 没有数据返回空数组
                                                                                  $user = Db::table("user")->where("id", 11)->findOrEmpty();
                                                                                  

                                                                                  ThinkPHP8.xThinkPHP8.x

                                                                                • 使用 findOrFail() 方法同样可以查询一条数据,在没有数据时抛出一个异常:

                                                                                  // 没有数据抛出异常
                                                                                  $user = Db::table("user")->where("id", 11)->findOrFail();
                                                                                  

                                                                                  ThinkPHP8.x

                                                                                • 想要获取多列数据,可以使用 select() 方法:

                                                                                  // 查询所有数据
                                                                                  $user = Db::table("user")->select();
                                                                                  
                                                                                • select() 方法默认返回 Collection 对象的数据集,可以通过 toArray() 方法转换成数组:

                                                                                  // 用中断函数,来检测返回值
                                                                                  $user = Db::table("user")->select();
                                                                                  halt($user);
                                                                                  // 转换成数组
                                                                                  $user = Db::table("user")->select()->toArray();
                                                                                  halt($user);
                                                                                  

                                                                                  ThinkPHP8.x

                                                                                  ThinkPHP8.x

                                                                                  ThinkPHP8.x

                                                                                  ThinkPHP8.x

                                                                                  • 多列数据也可以参与 where() 方法的筛选:

                                                                                    // 多列筛选
                                                                                    $user = Db::table("user")->where("age", 14)->select();
                                                                                    

                                                                                    返回的是query可查询对象:

                                                                                    ThinkPHP8.x

                                                                                    返回的是query可查询对象*Collection** 对象的数据集:

                                                                                    ThinkPHP8.x

                                                                                    2. 链式查询

                                                                                    • 我们发现通过指向符号 “->” 多次连续调用方法称为:链式查询;
                                                                                    • 当 Db::table(“user”) 时,返回查询对象(Query),即可连缀数据库对应的方法;
                                                                                    • 当返回查询对象(Query)时,就可以继续调用链式方法,where() 也是链式方法;
                                                                                    • 而 where() 被调用后,依旧返回(Query),可以再次链式调用;
                                                                                    • 在手册 数据库 -> 查询构造器 -> 链式操作 可以了解所有可链式的方法:table、where等;
                                                                                    • 直到遇到 find() 或 select() 返回数组或数据集时,结束查询;

                                                                                      11. 表前缀之扩展查询

                                                                                      1. 表前缀

                                                                                      • 一般来说,为了保持表名统一性和防止冲突,都会给表加上一个前缀,以下划线结束;

                                                                                        • 比如:tp_user,这里的 tp_ 就是表前缀,所有;

                                                                                        • 我们修改MySQL中表名,然后刷新程序,报错;

                                                                                        • 当然,你可以传递 Db::table(“tp_user”),但没必要;

                                                                                        • 首先,我们可以来配置统一前缀:

                                                                                          • 在 .env 文件中 添加:DB_PREFIX = tp_

                                                                                          • 如果部署环境 database.php 中 设置

                                                                                            "prefix" => env("DB_PREFIX", "tp_"),
                                                                                            
                                                                                          • 然后,使用 Db::name(“user”) 方法即可:

                                                                                            // 此时,tp_ 表名的前缀可以省略
                                                                                            $user = Db::name("user")->select();
                                                                                            

                                                                                            2. 扩展查询

                                                                                            • 通过 value() 方法,可以查询指定字段的值(单个),没有数据返回 null ;

                                                                                              // value() 方法查询单个列值
                                                                                              $user = Db::name("user")->where("id", 3)->value("name");
                                                                                              
                                                                                            • 通过 colunm() 方法,可以查询指定列的值(多个),没有数据返回空数组;

                                                                                              // colunm() 方法查询多个列值
                                                                                              $user = Db::name("user")->column("name");
                                                                                              // 通过id 作为索引
                                                                                              $user = Db::name("user")->column("name,age", "id");
                                                                                              
                                                                                            • 当大量数据需要 批处理 时,比如给所有用户更新数据,就不能一次性全取出来,一批一批的来;

                                                                                              // 批量处理
                                                                                              Db::name("user")->chunk(2, function ($users) {
                                                                                                  foreach ($users as $user) {
                                                                                                      dump($user);
                                                                                                  }
                                                                                                  echo 1;
                                                                                              });
                                                                                              // 通过获取最后的SQL语句,发现用的是LIMIT 2
                                                                                              return Db::getLastSql();
                                                                                              
                                                                                            • 另一种处理大量数据:游标查询,为了解决内存开销,每次读取一行,并返回到下一行再读取;

                                                                                              // 批量处理2
                                                                                              $users = Db::name("user")->cursor();
                                                                                              // PHP生成器
                                                                                              // halt($user);
                                                                                              foreach ($users as $user) {
                                                                                                  dump($user);
                                                                                              }
                                                                                              

                                                                                              按 Win + R 输入 cmd,运行 netstat -ano | findstr :3306 检查端口是否被占用。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码