使用PHP维护文件系统
PHP有很多与文件系统相关的函数,不仅可以帮助你打开文件,还可以显示目录内容、移动文件等。很多人甚至使用PHP写出了基于Web的文件治理器。
首先需要提醒一些关于文件路径的东西:在Windows你可以在文件路径中使用斜线“/”或反斜线“”,而其他操作系统仅使用”/”。出于兼容性考虑,以下实例使用“/”的表示方法:
下面的简单脚本显示了一个基本的目录列表。注释在代码中并解释了每一步:
<? /* 在变量 $dir_name中给出希望访问的目录完整路径*/
$dir_name = "/home/me/";
/* 创建句柄,打开给定目录的结果*/
$dir = opendir($dir_name);
/* 启动一段文本添加到将要放置列表元素(文件名)的地方 */
$file_list = "<ul>";
/* 使用while语句,读取所打开目录的所有元素。假如文件名既非“.”及“..”则在列表中输出文件名*/
while ($file_name = readdir($dir)) {
if (($file_name != ".") && ($file_name != "..")) {
$file_list .= "<li>$file_name";
}
}
/* 终结列表 */
$file_list .= "</ul>";
/* 关闭打开的目录句柄并结束PHP代码段*/
closedir($dir);
?>
<!-- Start your HTML -->
<HTML>
<HEAD>
数据库从最初的数据文件的简单集合发展到今天的大型数据库治理系统已经成为我们日常生活中不可缺少的组成部分。假如不借助数据库的帮助,许多简单的工作将变得冗长乏味,甚至难以实现。尤其是象银行、院校和图书馆这样的大型组织更加依靠数据库系统实现其正常的运作。再看互联网上,从搜索引擎到在线商场,从网上聊天到邮件列表,都离不开数据库。
目前,市面上的数据库产品多种多样,从大型企业的解决方案到中小企业或个人用户的小型应用系统,可以满足用户的多样化需求。这里,我们所要向大家介绍的MySQL数据库是众多的关系型数据库产品中的一个,相比较其它系统而言,MySQL数据库可以称得上是目前运行速度最快的SQL语言数据库。除了具有许多其它数据库所不具备的功能和选择之外,MySQL数据库是一种完全免费的产品,用户可以直接从网上下载数据库,用于个人或商业用途,而不必支付任何费用(推荐下载站点http://www.mysql.com)。
总体来说,MySQL数据库具有以下主要特点:
1. 同时访问数据库的用户数量不受限制;
2. 可以保存超过50,000,000条记录;
3. 是目前市场上现有产品中运行速度最快的数据库系统;
4. 用户权限设置简单、有效。
如今,包括Siemens和Silicon Graphics这样的国际知名公司也开始把MySQL作为其数据库治理系统,这就更加证实了MySQL数据库的优越性能和广阔的市场发展前景。
本文将重点向读者介绍MySQL数据库的一些基本操作,包括如何与数据库建立连接,假如设置数据库,以及如何执行基本的命令等。希望能够对读者学习和把握MySQL数据库有所助益。
入门
一般来说,我们访问MySQL数据库时,首先需要使用telnet远程登录安装数据库系统的服务器,然后再进入MySQL数据库。MySQL数据库的连接命令如下:
mysql -h hostname -u username -p[password]
或者:
mysql -h hostname -u username --password=password
其中,hostname为装有MySQL数据库的服务器名称,username和password分别是用户的登录名称和口令。
假如MySQL数据库安装和配置正确的话,用户在输入上述命令之后会得到如下系统反馈信息:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 49 to server version: 3.2 3-beta-log
Type help for help.
mysql>
这样,用户就成功进入了MySQL数据库系统,可以在mysql>命令提示符之后输入各种命令。下面,我们列出一些MySQL数据库的主要治理命令供读者参考,用户也可以通过在命令符之后输入help,h或?得到以下命令的简单说明。
mysql> help
help (h) 显示命令帮助
? (h) 作用同上
clear (c) 清除屏幕内容
connect (r) 重新连接服务器,可选参数为 db(数据库)和 host(服务器)
exit () 退出mysql数据库,作用与quit命令相同
go (g) 将命令传送至mysql数据库
print (p) 打印当前命令
quit (q) 退出mysql数据库
status (s) 显示服务器当前信息
use (u) 打开数据库,以数据库名称作为命令参数
上述命令主要用于MySQL数据库的系统治理,假如用户需要对某个具体的数据库进行操作,可以使用use命令进入该数据库,格式如下:
mysql> use dbname;
这里需要提醒读者注重的一点就是MySQL数据库要求使用者在所有命令的结尾处使用“;”作为命令结束符。
数据类型和数据表
从本质上说,数据库就是一种不断增长的复杂的数据组织结构。在MySQL数据库中,用于保存数据记录的结构被称为数据表。而每一条数据记录则是由更小的数据对象,即数据类型组成。因此,总体来说,一个或多个数据类型组成一条数据记录,一条或多条数据记录组成一个数据表,一个或多个数据表组成一个数据库。我们可以把上述结构理解为如下形式:
Database < Table < Record < Datatype
数据类型分为不同的格式和大小,可以方便数据库的设计人员创建最理想的数据结构。能否正确的选择恰当的数据类型对最终数据库的性能具有重要的影响,因此,我们有必要首先对数据类型的有关概念进行较为具体的介绍。
<?PHP
//xml中的元素
class XMLTag
{
var $parent;//父节点
var $child;//子节点
var $attribute;//本节点属性
var $data;//本节点数据
var $TagName;//本节点名称
var $depth;//本节点的深度,根节点为1
function XMLTag($tag='')
{
$this->attribute = array();
$this->child = array();
$this->depth = 0;
$this->parent = null;
$this->data = '';
$this->TagName = $tag;
}
function SetTagName($tag)
{
$this->TagName = $tag;
}
function SetParent(&$parent)
{
$this->parent = &$parent;
}
function SetAttribute($name,$value)
{
$this->attribute[$name] = $value;
}
function AppendChild(&$child)
{
$i = count($this->child);
$this->child[$i] = &$child;
}
function SetData($data)
{
$this->data= $data;
}
function GetAttr()
{
return $this->attribute;
}
function GetProperty($name)
{
return $this->attribute[$name];
}
function GetData()
{
return $this->data;
}
function GetParent()
{
return $this->parent;
}
function GetChild()
{
return $this->child;
}
function GetChildByName($name)
{
$total = count($this->child);
for($i=0;$i<$total;$i++)
{
if($this->child[$i]->attribute['name'] == $name)
{
return $this->child[$i];
}
}
return null;
}
//获取某个tag节点
function GetElementsByTagName($tag)
{
$vector = array();
$tree = &$this;
$this->_GetElementByTagName($tree,$tag,$vector);
return $vector;
}
function _GetElementByTagName($tree,$tag,&$vector)
{
if($tree->TagName == $tag) array_push($vector,$tree);
$total = count($tree->child);
for($i = 0; $i < $total;$i++)
$this->_GetElementByTagName($tree->child[$i],$tag,$vector);
}
}
//xml文档解析
class XMLDoc
{
var $parser;//xml解析指针
var $XMLTree;//生成的xml树
var $XMLFile;//将要解析的xml文档
var $XMLData;//将要解析的xml数据
var $error;//错误信息
var $NowTag;//当前指向的节点
var $TreeData;//遍历生成的xml树等到的数据
var $MaxDepth;//本树最大的深度
var $encode;//xml文档的编码方式
var $chs;//字符转换
function XMLDoc()
{
//采用默认的ISO-8859-1
$this->parser = xml_parser_create();
xml_parser_set_option($this->parser,XML_OPTION_CASE_FOLDING,0);
xml_set_object($this->parser,&$this);
xml_set_element_handler($this->parser,'_StartElement','_EndElement');
xml_set_character_data_handler($this->parser,'_CData');
$this->stack = array();
$this->XMLTree = null;
$this->NowTag = null;
$this->MaxDepth = 0;
}
function LoadFromFile($file)
{
$this->XMLFile = fopen($file,'r');
if(!$this->XMLFile)
{
$this->error = '不能打开xml文件';
return false;
}
$this->XMLData = '';
$this->TreeData = '';
return true;
}
function SetXMLData($data)
{
if($this->XMLFile) fclose($this->XMLFile);
$this->XMLData = $data;
$this->TreeData = '';
}
//给树添加一个新的节点
function AppendChild(&$child)
{
if($this->XMLTree == null)
{
$child->depth = 1;
$this->XMLTree = &$child;
$this->NowTag = &$this->XMLTree;
}
else
{
$i = count($this->NowTag->child);
$this->NowTag->child[$i] = &$child;
$child->parent = &$this->NowTag;
$child->depth = $this->NowTag->depth+1;
unset($this->NowTag);
$this->NowTag = &$child;
}
$this->MaxDepth = ($this->MaxDepth < $this->NowTag->depth)?$this->NowTag->depth:$this->MaxDepth;
}
//产生一个新的节点
function &CreateElement($tag)
{
$element = new XMLTag($tag);
return $element;
}
function _StartElement($parser,$element,$attribute)
{
$tag = new XMLTag();
$tag->TagName = $element;
$tag->attribute = $attribute;
if($this->XMLTree == null)
{
$tag->parent = null;
$tag->depth = 1;
$this->XMLTree = &$tag;
$this->NowTag = &$tag;
}
else
{
$i = count($this->NowTag->child);
$this->NowTag->child[$i] = &$tag;
$tag->parent = &$this->NowTag;
$tag->depth = $this->NowTag->depth+1;
unset($this->NowTag);
$this->NowTag = &$tag;
}
$this->MaxDepth = ($this->MaxDepth < $this->NowTag->depth)?$this->NowTag->depth:$this->MaxDepth;
}
function _CData($paraser,$data)
{
$this->NowTag->data = $data;
}
function _EndElement($parser,$element)
{
$parent = &$this->NowTag->parent;
unset($this->NowTag);
$this->NowTag = &$parent;
}
//开始解析xml文档
function parse()
{
if($this->XMLFile)
{
$this->XMLData = '';
while(!feof($this->XMLFile))
{
$this->XMLData .= fread($this->XMLFile,4096);
}
}
fclose($this->XMLFile);
if($this->XMLData)
{
//$this->JudgeEncode();
if (!xml_parse($this->parser, $this->XMLData))
{
$code = xml_get_error_code($this->parser);
$col = xml_get_current_column_number($this->parser);
$line = xml_get_current_line_number($this->parser);
$this->error = "XML error: $col at line $line:".xml_error_string($code);
return false;
}
}
xml_parser_free($this->parser);
return true;
}
//确定编码方式
function JudgeEncode()
{
$start = strpos($this->XMLData,'<?xml');
$end = strpos($this->XMLData,'>');
$str = substr($this->XMLData,$start,$end-$start);
$pos = strpos($str,'encoding');
if($pos !== false)
{
$str = substr($str,$pos);
$pos = strpos($str,'=');
$str = substr($str,$pos+1);
$pos = 0;
while(empty($str[$pos])) $pos++;
$this->encode = '';
while(!empty($str[$pos]) && $str[$pos] != '?')
{
if($str[$pos] != '"' && $str[$pos] != "'")
$this->encode .= $str[$pos];
$pos++;
}
}
$this->chs = new Chinese('UTF-8',$this->encode);
}
//根据节点名称修改某个节点的值
function ChangeValueByName($name,$name,$value)
{
return $this->_ChangeValueByName($this->XMLTree,$name,$value);
}
function _ChangeValueByName($tree,$name,$value)
{
if(is_array($tree->attribute))
{
while (list($k,$v) = each($tree->attribute))
{
if($k = 'name' && $v = $name)
{
$tree->data = $value;
return true;
}
}
}
$total = count($tree->child);
for($i = 0;$i<$total;$i++)
{
$result = $this->_ChangeValueByName($tree->child[$i],$name,$value);
if($result == true) break;
}
return $result;
}
//根据节点名称修改树中某个节点的属性
function ChangeAttrByName($name,$attr,$value)
{
return $this->_ChangeAttrByName($this->XMLTree,$name,$attr,$value);
}
function _ChangeAttrByName(&$tree,$name,$attr,$value)
{
if(is_array($tree->attribute))
{
while(list($k,$v) = each($tree->atttibute))
{
if($k == 'name' && $v == $name)
{
$tree->attribute[$attr] = $value;
return true;
}
}
}
$total = count($tree->child);
for($i = 0;$i<$total;$i++)
{
$result = $this->_ChangeAttrByName($tree->child[$i],$name,$attr,$value);
if($result == true) break;
}
return $result;
}
//获取根节点
function GetDocumentElement()
{
return $this->XMLTree;
}
//遍历生成的xml树,重新生成xml文档
function WalkTree()
{
$this->TreeData = '';
$this->_WalkTree($this->XMLTree);
return $this->TreeData;
}
//递归遍历
function _WalkTree($tree)
{
$this->TreeData .= '<'.$tree->TagName.' ';
if(is_array($tree->attribute))
{
while(list($key,$value) = each($tree->attribute))
{
$this->TreeData .="$key="$value" ";
}
}
$this->TreeData .= '>'.$tree->data;
$total = count($tree->child);
for($i=0;$i<$total;$i++)
{
$this->_WalkTree($tree->child[$i]);
}
$this->TreeData .= '</'.$tree->TagName.">n";
}
//获取错误信息
function GetError()
{
return $this->error;
}
//获取树的最大深度
function GetMaxDepth()
{
return $this->MaxDepth;
}
//将xml树写入xml文件
function WriteToFile($file,$head='')
{
$fp = fopen($file,'w');
if(!$fp)
{
$this->error = '无法打开写入文件';
return false;
}
if(empty($this->TreeData)) $this->WalkTree();
$head = empty($head)?'<?xml version="1.0" standalone="yes" encoding="gb2312"?>':$head;
fwrite($fp,$head);
fwrite($fp,$this->TreeData);
fclose($fp);
return true;
}
}
?>
<?
// 本人不熟悉XML,可能注解对XML的描述有误
// 这只是个思想,要实现的话应该略加修整,可以把一些不常用条件查询的数据用XML保存
// 如虚拟社区的 用户资料,一般只有用户自己或其他用户指定了他的USERNAME才会显示
// 剩下每次都要开启、查询、解释数据集、关闭数据库的消耗。
define("enter",chr(13).chr(10));
class DATA_XML //关键!!!一个自定义类
{
var $parser; //XML解释器
var $tags; //XML标签
var $on; //
var $root; // 根元素
var $Data = array(); // 元素数组
function DATA_XML($filename,$root) //类初始函数 filename文件名,root根元素
{
$this->root = $root; // 初始根元素
$this->parser = xml_parser_create();//创建解释对象
xml_set_object(&$this->parser,&$this);//设置对象
xml_set_element_handler($this->parser,"tag_on","tag_off");//设置元素管理函数
xml_set_character_data_handler($this->parser,"getdata"); //设置数据管理事件
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); //要求严格区分大小写
if( file_exists($filename) ) //找到文件吗?
{//找到
$fp = fopen($filename,"r"); // 只读打开
$c = fread($fp,filesize($filename)); //读取数据
fclose($fp);//关闭
$this->parse($c); //设置解释对象
}
else
{
echo "ooooo"; //!?!好象是调试时用的,去掉 else好了
}
}
function parse($data)//解释函数
{
xml_parse($this->parser,$data);
}
function tag_on($parser,$tag,$attributes)//发现元素触发函数
{
$this->on = true; // 已经触发过
$this->tags = $tag;
//echo $tag;
}
function tag_off($parser,$tag) //元素结素函数
{
$this->on = false; // 元素结素
}
function getdata($parser,$cdata) //取出元素
{
if($this->on && $this->tags!=$this->root)
{//验证一下比较好,(现在是否为元素的开始,并且不是根元素?)
$this->Data[$this->tags]=trim($cdata);
// 关键啊!!用标签做数组表,并给这个数组元素付上数据
//echo trim($cdata);
//echo $this->tags;
//echo "n";
}
}
function check($str)
{//检查字符
if( strlen($str)<1 )//如果是空字符
return ' ';//返回 ' '
else
return $str;//否则原路返回(不然XML好象会不做结束标记)
}
function saveas($filename)//另存为
{
$c='<?xml version="1.0" encoding="gb2312"?>'.enter;
//这个不用说了吧,enter是define("enter",chr(13).chr(10));
$c.="<".$this->root.">".enter;
//首先设定一下根元素
for( reset($this->Data);$i=key($this->Data);next($this->Data))
{//开始举出所有数据啦
$c.= "<".$i.">".$this->check($this->Data[$i])."</".$i.">".enter;
// 用数组表名做元素标签,并加上数据内容
}
//echo $c;
$c.="</".$this->root.">".enter;//结束标签
$fp = fopen( $filename , "w" );//写入文件
fwrite($fp,$c);
fclose($fp);
}
};
/*新键一个XML文件
$xml = new DATA_XML(路径."arm.xml","DATA"/*根元素*/);
$xml->Data["UserName"]="关羽";
$xml->Data["Nick"]="关云长";
$xml->saveas( 路径."arm.xml");
unset( $xml );
// 读取一个文件
$xml = new DATA_XML(路径."arm.xml","DATA");
echo $xml->Data["Nick"];//显示一下?
$xml->Data["Nick"]="关老爷";//UPDATE
$xml->Data["Master"]="刘备";//INSERT INTO
$xml->saveas(路径."arm.xml");//另存为覆盖本身
*/
?>
当处理基于XML应用程序时,开发者经常需要建立XML编码数据结构。例如,Web中基于用户输入的XML状态模板,服务器请求XML语句,以及基于运行时间参数的客户响应。
尽管XML数据结构的构建比较费时,但假如使用成熟的PHP DOM应用程序接口,一切都会变得简单明了。本文将向你介绍PHP DOM应用程序接口的主要功能,演示如何生成一个正确的XML完整文件并将其保存到磁盘中。
创建文档类型声明
一般而言,XML声明放在文档顶部。在PHP中声明十分简单:只需实例化一个DOM文档类的对象并赋予它一个版本号。查看程序清单A:
程序清单 A
<?php
// create doctype
$dom = new DOMDocument("1.0");
// display document in browser as plain text
// display document in browser as plain text
// for readability purposes
header("Content-Type: text/plain");
// save and display tree
echo $dom->saveXML();
?>
请注重DOM文档对象的saveXML()方法。稍后我再具体介绍这一方法,现在你只需要简单熟悉到它用于输出XML文档的当前快照到一个文件或浏览器。在本例,为增强可读性,我已经将ASCII码文本直接输出至浏览器。在实际应用中,可将以text/XML头文件发送到浏览器。
如在浏览器中查看输出,你可看到如下代码:
<?xml version="1.0"?>
添加元素和文本节点
XML真正强大的功能是来自其元素与封装的内容。幸运的是,一旦你初始化DOM文档,很多操作变得很简单。此过程包含如下两步骤:
对想添加的每一元素或文本节点,通过元素名或文本内容调用DOM文档对象的createElement()或createTextNode()方法。这将创建对应于元素或文本节点的新对象。
通过调用节点的appendChild()方法,并把其传递给上一步中创建的对象,并在XML文档树中将元素或文本节点添加到父节点。
以下范例将清楚地演示这2步骤,请查看程序清单B。
程序清单 B
<?php
// create doctype
$dom = new DOMDocument("1.0");
// display document in browser as plain text
// for readability purposes
header("Content-Type: text/plain");
// create root element
$root = $dom->createElement("toppings");
$dom->appendChild($root);
// create child element
$item = $dom->createElement("item");
$root->appendChild($item);
// create text node
$text = $dom->createTextNode("pepperoni");
$item->appendChild($text);
// save and display tree
echo $dom->saveXML();
?>
这里,我首先创建一个名字为<toppings>的根元素,并使它归于XML头文件中。然后,我建立名为<item>的元素并使它归于根元素。最后,我又创建一个值为“pepperoni”的文本节点并使它归于<item>元素。最终结果如下:
<?xml version="1.0"?>
<toppings>
相关文章
- 下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
Jupyter Notebook读取csv文件出现的问题及解决
这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06- 有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
- ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。  ...2017-07-06
- 有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
php无刷新利用iframe实现页面无刷新上传文件(1/2)
利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25使用insertAfter()方法在现有元素后添加一个新元素
复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31- 要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
- 又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
- 大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
使用percona-toolkit操作MySQL的实用命令小结
1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24如何使用php脚本给html中引用的js和css路径打上版本号
在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24jQuery 1.9使用$.support替代$.browser的使用方法
jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31- 今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23