主页 > 后端 > codeigniter >
来源:未知 时间:2014-10-20 11:30 作者:xbdadmin 阅读:次
[导读] -------------------------------------------------------------------------------------------------------------------------------------------------- 授课过程中如果涉及到文件夹或目录时,可使用缩进进行演示: applicat...
-------------------------------------------------------------------------------------------------------------------------------------------------- 授课过程中如果涉及到文件夹或目录时,可使用缩进进行演示: application |-----libraries |-----xxx_helper.php system |-----libraries |-----url_helper.php ----------------------------------------------------------------------------------------------------------------------------------------------------- 一、什么是框架? 二、框架的优缺点分析及为什么要选择框架三、主流MVC框架介绍: 1、thinkphp 2、zendframework 3、ci 4、yii 四、CI框架特性介绍: 1、轻量级:核心系统的类库非常小 2、采用了最流行的MVC架构模式 3、生成干净的对搜索引擎友好化的url http://www.kuxiu.net/index.php/common/login/ 4、功能非常强大: 拥有全范围的类库,可完成一个项目的大多数通用功能,包括: 读取数据库、发送电子邮件、数据确认、保存 session 、对图片的操作,以及支持 XML-RPC 数据传输等 5、不需要模板引擎: 虽然CI框架自带了一个可选的模板解析器程序,但不要求你必须使用模板; 虽然模板引擎的代码比较清晰,但这会带来一个性能问题,因为伪代码要先被转换成PHP才能运行。我们的目标是性能最大化, 所以我们选择不使用专用的模板引擎。 当然,我们也可以使用ci框架自带的模板引擎,也可以整合第三方的模板引擎到ci框架中:smarty模板引擎 6、中文化的文档全面: 虽然是一款国外的框架,但是中文化的文档也是非常全面,便于我们查阅 五、MVC模式: 视图、 模型: 控制器 六、CI框架执行流程深入分析: 第一步:入口文件: //加载引导文件,http://www.kuxiu.net/system/core/CodeIgniter.php文件 require_once BASEPATH.'core/CodeIgniter.php'; 第二步:require_once BASEPATH.'core/CodeIgniter.php';中 //加载公共的函数库 require(BASEPATH.'core/Common.php'); require(APPPATH.'config/constants.php');//常量文件 /* 配置类,加载配置文件时使用,如: $this->config->load(); $this->config->item(); $this->config->set_item(); */ $CFG =& load_class('Config', 'core'); $URI =& load_class('URI', 'core'); $RTR =& load_class('Router', 'core'); $OUT =& load_class('Output', 'core'); $SEC =& load_class('Security', 'core'); $IN =& load_class('Input', 'core'); require BASEPATH.'core/Controller.php';//系统基类控制器文件 return CI_Controller::get_instance(); //在扩展系统基控制器时使用:MY_Controller.php if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')){ require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';//如:MY_Controller.php } $class = $RTR->fetch_class();//当前请求的控制器,如:common $method = $RTR->fetch_method();//当前请求的控制器中的方法,如:index $CI = new $class();//实例化当前请求的控制器类对象 关于hook的资料:就是在系统引导流程中插入自己的代码,而不用修改核心代码 貌似可以在 控制器之前(或者其他时候) 执行自己的代码,执行某个对象的方法或者某个函数。我现在把需要在所有控制器中都执行的代码移到hook中了。应该就是这么用的吧? 虽然很神,但是实际上运用hook的情况不多(因为ci已经解决了大部分你可能会遇到的问题)。当使用扩展无法达到目的时,才会考虑钩子。 hook在你执行controller之前执行,举一个例子吧,有一次,项目要上线,但是服务器时间怎么调也不正确。(因为要存订单时间),没办法,一时调不好服务器,就写了一个钩子设置时区。(只是作为临时方案) 1、index.php 作为前端控制器,初始化运行 CodeIgniter 所需要的基本资源。 2、Router 检查 HTTP 请求,以确定谁来处理请求。 3、如果缓存(Cache)文件存在,它将绕过通常的系统执行顺序,被直接发送给浏览器。 4、安全(Security)。应用程序控制器(Application Controller)装载之前,HTTP 请求和任何用户提交的数据将被过滤。 5、控制器(Controller)装载模型、核心库、辅助函数,以及任何处理特定请求所需的其它资源。 6、最终视图(View)渲染发送到 Web 浏览器中的内容。如果开启缓存(Caching),视图首先被缓存,所以将可用于以后的请求。 七、URL调度模式: 1、如何修改默认执行的控制器和方法: application/config/routes.php中配置如下项: $route['default_controller'] = "common";//默认执行的控制器 八、model详解: 1、模型类的命名规范:主需要首字母大写即可,建议采用 User_model 形式 2、引用模型的两种方式: $this->load->model("user_model");//引用user_model模型 $this->load->model("User_model");//应用user_model模型,这两种方式是等价的 九、实例化模型的执行流程: $this->load->model("user_model");//引用user_model模型 十、CI框架中session与cookie类库的使用:cookie登陆、session登陆 十一、CI框架中文件处理类库及图像处理类库的使用:文件上传、缩略图、水印功能 十二、CI框架与smarty模板引擎的无缝整合:在项目中的应用 提示:虽然模板引擎的代码比较清晰,但这会带来一个性能问题,因为伪代码要先被转换成PHP才能运行。我们的目标是性能最大化, 所以我们选择不使用专用的模板引擎 十三、CI框架与UEditor编辑器的无缝整合:在项目中的应用(路径问题) 十四、CI框架与报表类库的无缝整合:在项目中的应用(报表的导入导出) 十五、导入机制和配置文件加载流程介绍 十六、配置文件: 1、主配置文件:application/config/config.php,已自动加载,无需手动启用 分析:配置项目被存储在一个叫$config[]的数组里面,你可以添加自己的配置项目到这个文件中 2、加载单个自定义的配置文件: $this->config->load("thumb_settings");//配置文件的文件名,不带.php扩展名 3、加载多个自定义配置文件: 如果需要加载多个自定义配置文件,一般情况下他们会被合并为一个数组;如果在不同的配置文件中存在同名的索引,那么将会发生冲突;为了避免这个问题,你可以将第二个参数设置为true、这样可以使每个配置文件中的内容存储在一个单独的数组中,数组的索引就是配置文件的名称 $this->config->load("thumb_settings",true); //相当于如下方式: $this->config['thumb_settings'] = $thumb_settings; //参数3用来屏蔽当配置文件不存在时产生的错误信息 $this->config->load("thumb_settings",false,true); 4、如何获取配置文件中的配置项: //加载配置文件: $this->config->load("thumb_settings");//缩略图相关的配置文件 //当视图获取的配置项不存在时,将返回false $this->config->item("config_thumb");//缩略图的相关配置项 5、如何动态设置一个配置项: //动态设置生成的缩略图的名字 $this->config->set_item("new_image",time.().$this->file_ext); 6、思考一个问题:配置项是否可以为数组呢? 7、配置类辅助函数: $this->config->site_url();//网站URL 如何将url路径中的index.php屏蔽? $config['index_page'] = 'index.php';//如:http://www.kuxiu.net/index.php/ $config['index_page'] = '';//如:http://www.kuxiu.net/ $this->config->base_url();//返回站点的根目录 提示:在生成images、css、js等的url时非常实用 $this->config->system_url();//该函数用来得到system文件夹的url 十七、分页类的使用: //加载分类类库 $this->load->pagination("pagination"); 十八、数据库的增删改查: 普通查询: 1、$this->db->database();//加载数据库实例化对象 2、$query=$this->db->query($sql);//执行查询,返回结果集;注意:query是普通数据库操作类中的方法,快捷操作类继承自普通数据库操作类,所以快捷操作类中也有query方法,query方法返回一个结果集对象 3、$object_array=$query->result();//返回一个对象数组;result是结果集类中的方法 foreach($object_array as $object){ echo $object->name; } 4、$data_array=$query->result_array();//返回一个二维关联数组;result_array()是结果集类中的方法,主要用来将结果集转换为二维关联数组 foreach($data_array as $row){ echo $row['name']; } 5、$object=$query->row();//返回一个对象; 6、$row=$query->row_array();//返回一维数组 7、$query->num_rows();//返回查询到的记录数 8、$this->db->affected_rows(); //返回受影响的记录数 9、$this->db->insert_id();//返回最新插入记录的id 快捷查询: 插入数据: $this->db->insert("user",$data); 分析:参数1:表名,不带前缀,因为在配置文件中设置过数据表的前缀了 参数2:包含数据的关联数组 缺点:$data关联数组中的键名要与user表中字段名一一对应,缺一不可 注意:$this->db->insert_batch(); 更新数据: $this->db->update("user",$data,条件); 分析:参数1:表名,同上 参数2:包含数据的关联数组 参数3:更新条件,有两种形式: 数组形式:array("id"=>4) 键值对形式:"id=4" 删除数据: $this->db->delete("user",条件);//条件同上 查询数据: $query=$this->db->get();//返回结果集 //参数2:每页记录数 参数3:开始位置; $query=$this->db->get("user",$pagesize,$limit); $data_array=$query->result_array();//将结果集转化为数组 $this->db->get_where("user",$where,$limit,$pagesize);//查询结果集,条件同上 //在执行查询之前,我们可以随意设置查询的字段及条件 $this->db->select("username,realname,password");//字段间以逗号相隔 $this->db->select_max("id");//查询最大id $this->db->select_min("id");//查询最小id $this->db->select_avg("score");//平均值 $this->db->select_sum("score");//总值 //主要用来设置表名,如果使用了此函数,在$this->db->get();函数中就无需表名了 $this->db->from("user"); $this->db->where();//传递给本函数的所有值都会被自动转义,以便生成安全的查询 条件形式: 简单的键值对: $this->db->where('name', $name); 自定义键值对: $this->db->where('name !=', $name); $this->db->where('id <', $id); 关联数组: $where=array("username"=>$username,"password"=>$password) 字符串格式: $where = "name='Joe' AND status='boss' OR status='active'"; $this->db->where($where); 注意:条件中可以包含运算符 $this->db->or_where(); $this->db->where_in(); $this->db->or_where_in(); $this->db->where_not_in(); $this->db->or_where_not_in(); $this->db->group_by(); $this->db->distinct(); $this->db->having(); $this->db->order_by(); $this->db->limit(10); $this->db->count_all_results("user"); 分析:此函数允许你获得某个特定的Active Record查询所返回的结果数量。可以使用Active Record限制函数,例如 where(), or_where(), like(), or_like() 等等。范例: $this->db->set();//它可以用来代替那种直接传递数组给插入和更新函数的方式 案例: $this->db->set('name', $name); $this->db->insert('mytable'); //生成: INSERT INTO mytable (name) VALUES ('{$name}') $this->db->empty_table(); $this->db->truncate(); 链式查询:链式方法允许你以连接多个函数的方式简化你的语法 $this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20); $query = $this->db->get(); 十九、辅助函数的加载: //单个辅助函数文件的加载 $this->load->helper("url");//辅助函数文件的名字 //多个辅助函数文件的加载 $this->load->helper(array( "url", "pagination", "image_lib" )); //一旦你载入了想要用到辅助函数文件,可以用标准的函数调用方法来使用里面的函数。 base_url();// $this->base_url()是错误的写法 1、如何扩展系统原有的helper函数库? 在application/helpers/ 文件夹下建立一个文件,命名为:MY_原系统函数库名.php 2、如何设置默认扩展文件名的前缀? 找到application/config/config.php配置文件 修改$config['subclass_prefix'] = 'MY_';即可 3、如何修改数据表的前缀? 找到application/config/database.php配置文件 修改$db['default']['dbprefix'] = 'gt_';//数据表的前缀 二十、如何设置url路由及url后缀
$config['uri_protocol'] = 'PATH_INFO';//路由形式,如:http://www.kuxiu.net/common/index?x=a&y=b $config['url_suffix'] = '';//url后缀,如:http://www.kuxiu.net/common/index.html
二十一、总结: 7、系统加载类库:core/Loader.php ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- <?php 1、在讲解文件所在目录方面的问题时: application |-----core |-----MY_Controller.php system |-----core |-----Controller.php 思路: 一、目前在企业中使用比较多的框架有如下几种: 1、zendframework框架:此框架由zend公司开发并负责维护,入门比较困难一点,但是据说功能很强悍,属于一款偏重量级的MVC框架 2、Yii框架:又称为 "易框架",在外企使用居多 3、thinkphp框架:是国人开发的一款框架,由于它的注释和使用文档都是中文,所以很受国人的喜欢 4、codeigniter框架:简称CI框架,是国外一款流行的框架,跟前面的框架比较,ci框架是最轻量级的,也是最容易上手的 二、我们选择这款框架来学习,主要有以下几点原因: 1、ci是一个轻量级的框架,关于轻量级,可从两方面来理解: 1、体积小,解压后不到4M,zendframework解压后60M左右 2、占用资源少:ci应用程序在运行的时候,只是将正常运行所必须的几个核心类库载入到了内存中,其它类库在请求的时候才会加载,这样就达到了资源的最小化,这跟那些需要很多资源的框架是不一样的,有些框架在运行的时候,会将所有的类库首先载入内存中,而不管这些类库是否能够用的到,如:cakephp 3、但是这个轻量级,并不影响它开发大型的web应用程序,为什么这么说呢? 首先,它自身所提供的类库,已经能够帮助我们完成web应用程序中的大部分功能 再者,ci框架在整合第三方类库方面也有独到的优势,几乎不需要进行任何配置 2、整合第三方类库简单,几乎不需要进行任何配置 3、不需要使用模板引擎技术 大家知道,php原生态的语法结构执行效率是最高的,因为跟使用了模板引擎技术的程序相比较,它少了一个编译的过程 三、下面,我们就来进行ci框架的安装: ci框架的安装,我们只需要按照如下步骤进行操作就可以了 1、官网:http://www.codeigniter.com 去下载ci框架最新的版本,目前最新版本为2.1.3 中文网站:http://www.codeigniter.org.cn 2、下载完毕后,解压,并将其复制粘贴到程序的主目录(d:/wamp/xmall/),然后再将其重命名为"myshop",那么"myshop" 就作为ci项目名称存在了 3、为我们的ci项目搭建一个虚拟主机: 首先,找到httpd.conf配置文件,开启虚拟主机的配置 然后,找到httpd-vhosts.conf配置文件,进行虚拟主机的配置 最后,找到hosts配置文件,为我们的ci项目添加dns映射 4、在浏览器中输入 http://www.myshop.com/index.php 回车,如能看到如下欢迎界面,则表示我们的ci项目安装成功了 四、ci框架的目录结构分析: 了解ci框架的目录结构,有助于帮助我们快速建立起对ci框架的一个整体认识 打开"myshop"项目,有如下文件和目录 使用协议说明文档、英文版的用户手册,这两项不是项目所必须的,可暂时将其删除 myshop |-----system 框架程序目录 |-----core 框架的核心程序 |-----CodeIgniter.php 引导性文件 |-----Common.php 加载基类库的公共函数 |-----Controller.php 基控制器类文件:CI_Controller |-----Model.php 基模型类文件:CI_Model |-----Config.php 配置类文件:CI_Config |-----Input.php 输入类文件:CI_Input |-----Output.php 输出类文件:CI_Output |-----URL.php URL类文件:CI_URl |-----Router.php 路由类文件:CI_Router |-----Loader.php 加载类文件:CI_Loader |-----helpers 辅助函数 |-----url_helper.php url相关的辅助函数,如:创建url的辅助函数 |-----captcha_helper.php创建图形验证码的辅助函数 |-----libraries 通用类库 |-----Pagination.php 通用分页类库 |-----Upload.php 通用文件上传类库 |-----Image_lib.php 通用图像处理类库 |-----Session.php 通用session类库 |-----language 语言包 |-----database 数据库操作相关的程序 |-----DB_active_rec.php 快捷操作类文件(ActiveRecord) |-----fonts 字库 |-----application 项目目录 |-----core 项目的核心程序 |-----helpers 项目的辅助函数 |-----libraries 通用类库 |-----language 语言包 |-----config 项目相关的配置 |-----config.php 项目相关的配置文件 |-----database.php 数据库相关的配置文件 |-----autoload.php 设置自动加载类库的配置文件 |-----constants.php 常量配置文件 |-----routes.php 路由配置文件 |-----controllers 控制器目录 |-----welcome.php 控制器文件,继承CI_Controller |-----models 模型目录 |-----welcome_model.php 模型文件,继承CI_Model |-----views 视图目录 |-----welcome.php 视图模板文件,默认后缀名为.php |-----cache 存放数据或模板的缓存文件 |-----errors 错误提示模板 |-----hooks 钩子,在不修改系统核心文件的基础上扩展系统功能 |-----third_party 第三方库 |-----logs 日志 |-----index.php 入口文件 五、ci框架中的url路由规则: 浏览器中输入 http://www.myshop.com/index.php/welcome/index/ 回车时,默认情况下会找到 application |-----controllers |-----welcome.php 控制器文件,并执行其中的index方法 |-----admin 子目录 |-----category.php 控制器文件 到底是不是呢?我们打开welcome.php控制器文件,并在index方法中添加一些代码,运行输出,证明确实如我们所料 我们可以将浏览器中的url归纳如下:http://域名/入口文件/控制器/方法/参数列表 当输入网址回车时,默认情况下会直接从controllers目录下寻找控制器文件, 如果我们的控制器文件放在controllers目录下的子目录中,又该如何访问呢? 例如:在controllers目录建立一个admin子目录,然后呢,在admin子目录下创建一个category.php控制器文件 那么,我们在访问category.php控制器文件中的addcategory方法时,在浏览器中怎样访问呢? 我们可以这样来访问: http://www.myshop.com/index.php/admin/category/addcategory/ 即:http://域名/入口文件/controllers下的子目录/控制器/方法/参数列表 我们在浏览器中输入http://www.myshop.com/index.php 后面没有跟 "控制器/方法/参数列表" 回车时,默认情况下也会执行welcome.php控制器中的index方法。 这是因为ci框架为我们指定了一个默认的控制器和方法 默认控制器的设置在 "application/config/routes.php" 配置文件中进行设置的,我们可以重新设置默认的控制器 六、项目的部署:我们在实际部署大型项目时,还可以建立一些子目录及文件来帮助我们更好的管理我们的项目 1、子目录及入口文件的创建 controllers |-----admin 后台控制器 |-----home 前台控制器 models |-----admin 后台模型文件 |-----home 前台模型文件 views |-----admin 后台模板文件 |-----category 后台商品分类模块相关的模板文件 |-----addcategory.html |-----public 后台公共模板文件 |-----top.html |-----left.html |-----footer.html |-----home 前台模板文件 core |-----MY_Controller.php 扩展后的控制器文件,继承CI_Controller public 素材文件 |-----images images文件 |-----admin 后台images文件 |-----home 前台images文件 |-----css css文件 |-----admin 后台css文件 |-----home 前台css文件 |-----js js文件 |-----admin 后台js文件 |-----home 前台js文件 uploads 上传附件 admin.php 后台入口文件:访问后台控制器,都必须经过admin.php入口 index.php 前台入口文件:访问前台控制器,都必须经过index.php入口 2、将后台模板文件及素材文件部署到我们的ci项目中来 css文件中采用绝对路径 模板文件中采用绝对路径 3、建立后台控制器文件: application |-----controllers |-----admin |-----index.php index.php控制器文件 |-----user.php 用户控制器文件 控制器的命名规范 $this->load->view("admin/index.html");//将后台模板文件显示出来 4、将前后台素材文件的路径写到常量文件中:application/config/constants.php define("IMG_PATH","http://www.myshop.com/public/images/"); //images路径 define("CSS_PATH","http://www.myshop.com/public/css/"); //css路径 define("JS_PATH","http://www.myshop.com/public/js/"); //js路径 直接在控制器中获取常量的值: $data['img_path']=IMG_PATH; $data['css_path']=CSS_PATH; $data['js_path']=JS_PATH; 将$data数组传递给模板文件: $this->load->view("admin/index.html",$data);//参数2:关联数组 5、也可以将素材文件的路径放到application/config/config.php配置文件中 $config['img_path']="http://www.myshop.com/public/images/"; $config['js_path']="http://www.myshop.com/public/css/"; $config['js_path']="http://www.myshop.com/public/js/"; 在控制器中获取application/config/config.php配置文件中的配置项: $data['img_path']=$this->config->item("img_path"); $data['css_path']=$this->config->item("css_path"); $data['js_path']=$this->config->item("js_path"); 将$data数组传递给模板文件 $this->load->view("admin/index.html",$data);//参数2:关联数组 6、建立后台模型文件: application |-----models |-----admin |-----user_model.php 用户模型文件 模型文件的命名规范 如何在控制器中调用模型文件: //1、实例化后台的user_model类对象,对象名称为user_model //2、将user_model实例化对象作为控制器的user_model属性 //3、因此,我们可以在控制器中通过 $this->user_model 来获取user_model类对象,继而可以调用对象中的方法 $this->load->model("admin/user_model"); $this->user_model->adduser(); 7、数据库操作: 数据表的创建:gt_users 导入一些数据 查询用户:首先在model中连接数据库,$this->load->database();然后我们可以在模型类的方法中查询所有的数据 在ci框架中操作数据库可分为两种方式 (1)方式一:普通查询:通过sql语句及db类的query()方法来完成,如下所示: 下面,我们先通过第一种方式来完成用户管理系统 //insert、delete、update操作返回布尔true或false //select操作成功时返回结果集对象,失败时返回布尔值false $query=$this->db->query($sql); //通过结果集对象的方法将结果集转化为数据或对象 $data_array=$query->result_array();//将结果集转换为二维关联数组 $row_array=$query->row_array();//将结果集转换为一维关联数组 //获取查询到的行数 $num=$query->num_rows(); //db类中insert_id():返回最后一次插入数据的id $id=$this->db->insert_id(); //分页类库的载入: $this->load->library("pagination");//载入system/libraries/pagination.php分页类库 //分页配置: $config['base_url']="http://www.myshop.com/index.php/user/userlist/"; $config['total_rows']=200;//总记录数,可从数据库获取 $config['per_page']=10;//每页显示的记录数 $config['...']="...";//其他配置 //初始化配置,使得分页配置生效 $this->pagination->initialize($config); //创建默认风格的分页代码 $pages=$this->pagination->create_links();//$content['pages'] //limit的值 $limit=($page-1)*$config['per_page']; //注意:传递给模板文件的数据都必须放到关联数组中,会将关联数组中元素做为变量 $this->load->view("login.html",$content);//相当于extract($content) //将分页配置信息放到application/config/pagination.php配置文件中 //载入pagination.php配置文件 $this->config->load("pagination"); //获取配置选项 $per_page=$this->config->item("per_page");//每页显示的记录数 链式操作:可采用链式操作 $data_array=$this->db->query($sql)->result_array(); $row_array=$this->db->query($sql)->row_array(); (2)方式二:快捷查询:主要通过快捷操作类来进行数据库操作(ActiveRecord) 什么是快捷操作类:主要用来将sql语句的拼接放到类的方法中来完成。 下面,我们再使用第二种方式来完成用户管理系统 //查询操作 $this->db->get("users",10,20);//参数2:每页显示的记录数 参数3:开始查询位置 $this->db->get_where("users",array('id'=>1),10,20);//参数3:每页显示的记录数 //案例1:在函数内部帮助我们自动拼接sql语句 $this->db->select("*");//1、返回一个db类实例化对象 2、将实例化对象作为模型类的db属性 $this->db->from("users"); $this->db->where("id",3); $this->db->order_by("id","desc"); $this->db->get(); //案例2: $this->db->select("*"); $this->db->where("id",3); $this->db->order_by("id","desc"); $this->db->get("users"); $this->db->count_all_results();//获取查询到的总记录数 //插入操作: $this->db->insert("users",$data_array);//参数1:表名 参数2:关联数组 //更新操作: $this->db->update("users",$data_array,$where);//参数1:表名 参数3:关联数组 //删除操作: $this->db->delete("users",$where);//参数1:表名 参数2:关联数组 //关于$where条件分析: 单条件时:使用键值对形式的条件 做比较时:使用运算符格式的条件 多条件时:使用关联数组的格式 链式操作: //将结果集转化为二维关联数组 $data_array=$this->db->select('title')->from('mytable')->where('id', $id)->limit($limit, $pagesize)->get()->result_array(); //将结果集转化为一维关联数组 $row_array=$this->db->select('title')->from('mytable')->where('id', $id)->get()->row_array(); ?> |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com