设计网站时,经常需要做图标响应,例如用户点击图标,后台响应用户的操作。本文对图像分区响应的设计方式进行介绍。
图像响应一般是通过在图像上设置超链接实现的,代码示例如下:
<a href="这里写链接地址 "> //设置超链接
<img src="图片名称.图片格式" > //定义图像
</a>
例如图像示例如下:
图标示例
这种情况,没有对图像分区处理,因此只要点击页面中的任意位置(包括图像上的任意位置或者页面的空白处),均会跳转到对应的链接。
但是有时候一张图,可能在用户点击不同的位置,需要不同的响应,此时需要进行分区响应,具体代码示例如下:
<img src="图像名称.图片格式" usemap="#名称1"> //定义图像,以及图像的名称
<map name="名称1"> //引用前文中的图像
<area href="链接地址1" shape="rect" coords="a1,b1,a2,b2"> //定义图像区域的超链接和在图像中的像素位置
<area href="链接地址2" shape="rect" coords="c1,d1,c2,d2">//同上
</map>
其中,shape表示图像区域的形状,例如rect/circle等等。图像中某个图像分区的位置可以通过前文form实现,例如:
<form>
<input type="image" src="图像名称.图片格式">
</form>
当显示图像之后,可以点击图像的任意位置,此时链接处会显示该点击位置在图像中的像素位置,例如:
像素位置
TML是一种用来描述网页的标记性语言。学习HTML可能并不难,主要是要记一些HTML标签和标签代表的含义。下面PHP程序员雷雪松根据使用的情况,整理出平时常用的HTML标签。
HTML基础之HTML常用标签-PHP程序员雷雪松的博客
<!--<!DOCTYPE> 是HTML5声明,<!DOCTYPE> 必须是 HTML 文档的第一行,位于 <html> 标签之前。<!DOCTYPE>是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令。-->
<!DOCTYPE html>
<html>
<!-- head标签是所有头部元素的容器。head标签内的元素可包含脚本、样式表和提供页面的元信息等等。以下标签都可以添加到 head 部分:title、base、link、meta、script 以及style。头部的内容不会显示在浏览器的。 -->
<head>
<!-- 设置字符集,如果字符集不对,可能导致乱码。一般建议utf-8国际编码 -->
<meta http-equiv="Content-Type" content="text/html; charset=gb2312或utf-8或gbk" />
<!-- SEO相关标签,title定义文档的标题,百度建议一般不要超过32位,meta定义页面关键词和页面的描述-->
<title>网页标题</title>
<meta name="keywords" content="PHP程序员,技术博客,个人博客,雷雪松" />
<meta name="description" content="PHP程序员,雷雪松(Raykaeso)的博客是一个优秀的个人技术博客。PHP程序员雷雪松的博客记录了Linux学习,PHP开发与编程,Web前端开发,MySQL学习和教程,NoSQL数据库教程以及个人的人生经历和观点。" />
<link rel="stylesheet" type="text/css" href="main.css" />
<script type="text/javascript" src="main.js"></script>
</head>
<!-- 正文部分,所有在浏览器上可见的内容必须写在body标签内部 -->
<body>
</body>
</html>
a、布局标签
div标签定义文档中的分区或节(division/section),可以把文档分割为独立的、不同的部分,主要用于布局。
aside标签的内容可用作文章的侧栏,<span style="color: #ff0000;">html5新增标签</span>。
header标签定义页面的头部(介绍信息),<span style="color: #ff0000;">html5新增标签</span>。
section标签定义文档中的节(section、区段)。比如章节、页眉、页脚或文档中的其他部分,<span style="color: #ff0000;">html5新增标签</span>。
footer 标签定义文档或节的页脚,通常包含文档的作者、版权信息、使用条款链接、联系信息等等,<span style="color: #ff0000;">html5新增标签</span>。
article标签规定文章独立的其他内容,比如:标题、内容、评论,<span style="color: #ff0000;">html5新增标签</span>。
b、文本标签
h1-h6标签可定义标题
p标签定义段落
b/strong标签加粗
em标签来表示强调的文本,斜体
strong标签表示重要文本
u标签下划线
s标签删除线
br标签表示回车换行
hr标签表示水平线
span标签被用来组合文档中的行内元素。
blockquote标签表示块引用
pre标签可定义预格式化的文本,保持原有格式的一种标签。
sub标签下标,
sup>标签上标
表示一个空格
©表示版权符
<表示<
>表示>
c、a标签定义超链接,指定页面间的跳转。链接可以指向外部链接或者页面内部id锚点,可以在当前页面打开,新开窗口。
<a href="指向的链接地址或者网址#ID名" target="_blank|_self|_top|_parent">百度</a>
d、多媒体标签
img标签主要在网页中插入图像,可以定义图片替换文本、显示宽度和高度、是否带边框,建议等比例设置,否则图像会变形。
<img src="图片地址" alt="替换文本,图片打不开的时候显示" width="图片宽度" height="高度" border="0" />
audio标签定义声音,比如音乐或其他音频流。<span style="color: #ff0000;">html5新增标签</span>。
<audio src="someaudio.wav">您的浏览器不支持 audio 标签。</audio>
video标签定义视频,比如电影片段或其他视频流。<span style="color: #ff0000;">html5新增标签</span>。
<video src="movie.ogg" controls="controls">您的浏览器不支持 video 标签。</video>
e、序列化标签
ul和li无序列表标签
<ul>
<li>HTML</li>
<li>JS</li>
<li>PHP</li>
</ul>
ol和li有序列表标签,可以使用type属性规定有序列表符号的类型。1 按数字有序排列,为默认值,(1、2、3、4);a 按小写字母有序排列,(a、b、c、d);A 按字母大写有序排列,(A、B、C、D)。i 按小写罗马字母有序,(i, ii, iii, iv);I 按小写罗马字母有序,(I, II, III, IV)。
<ol>
<li>HTML</li>
<li>JS</li>
<li>PHP</li>
</ol>
dl标签定义了定义列表(definition list),dl标签用于结合 dt(定义列表中的项目)和 dd(描述列表中的项目)。
<dl>
<dt>计算机</dt>
<dd>用来计算的仪器 ... ...</dd>
</dl>
f、表格标签
table标签和tr标签,th标签和td标签,合并单元格。
<table width="100%" height="193" border="1" cellpadding="0" cellspacing="0" bordercolor="#FF0000" bgcolor="#000000" background="">
<tr>
<th>标题</th>
<th>标题</th>
</tr>
<tr>
<!-- 合并横向单元格 -->
<td colspan="2" nowrap="nowrap">&nbsp;</td>
</tr>
<tr>
<td></td>
<!-- 合并纵向单元格 -->
<td rowspan="2"> </td>
</tr>
<tr>
<td height="16"> </td>
</tr>
</table>
g、表单标签
form标签定义提交方式、提交地址、表单字符集以及如何对其进行编码,需要提交的表单一定要放在form标签内。
<form id="form1" name="form1" method="post|get" enctype="multipart/form-data" action="提交到的地址"></form>
input标签用于搜集用户信息
<input name="userName" type="text" maxlength="5" size="100" value="asdfasdfasfd" />
密码,输入的字符会被掩码(显示为星号或原点)
<input name="pwd" type="password" maxlength="5" size="100" value="" />
文件类型的表单,上传文件时,form表单一定要设置为enctype="multipart/form-data"
<input type="file" name="file" />
隐藏表单
<input type="hidden" name="country" value="China" />
提交
<input type="submit" name="Submit" value="提交" disabled="disabled" />
重置
<input type="reset" name="Submit2" value="重置" />
radio单选
<input name="sex" type="radio" value="1" />男
<input name="sex" type="radio" value="2" checked="checked" />女
checkbox多选
<input name="skill" type="checkbox" value="1" checked="checked" />PHP
<input name="skill" type="checkbox" value="2" />前端
<input name="skill" type="checkbox" value="2" />数据库
<span style="color: #ff0000;">注:checked="checked"可以简写成checked</span>
label标签为input元素定义标注,如果您点击label元素文本,就会触发此input控件。
textarea标签,设置文本区内的可见行数和宽度
<textarea name="content" cols="30" rows="10">大段文本输入框</textarea>
button标签定义一个按钮
提交按钮
<button type="submit" value="提交">提交</button>
重置按钮
<button type="reset" value="重置">重置</button>
select标签和option标签下拉列表
单选菜单列表框
<select name="user">
<option value="1">ray</option>
<option value="2" selected="selected">raykaeso</option>
</select>
多选列表下拉框,shift加鼠标单击,可以连续选择多个选择,CTRL+鼠标点击,可以点击多个。
<select name="user" size="10" multiple="multiple">
<option value="1">雷雪松</option>
<option value="2" selected="selected">ray</option>
<option value="3">raykaeso</option>
</select>
注:selected="selected"可简写成selected,表示选中
a、HTML标签和属性是不区分大小写的,建议HTML标签和属性都小写,属性值必须用双引号包围。
b、HTML标签都是以开始标签起始,以结束标签终止。大部分HTML标签都是成对出现的,称为双标签,比如:p标签、div标签,也有的HTML标签在开始标签中结束的标签,称为单标签,比如:hr标签、br标签。大多数 HTML 元素可拥有属性,文本内容都是写在开始标签与结束标签之间。
c、HTML标签之间尽量缩进与换行,每行代码不要过长,方便阅读和维护。
d、HTML标签使用必须符合标签嵌套规则。禁止a标签嵌套a标签,p标签嵌套div标签。
e、建议不使用HTML已经废弃的或者不赞成使用的标签,少使用table布局、iframe框架嵌套以及flash播放器。
来源:PHP程序员雷雪松的博客 -HTML基础之HTML常用标签(http://www.leixuesong.cn/2045)
译者 | 弯月
设计一个能够支持数亿用户的系统并非易事,对软件架构师来说是一个很大的挑战。
以下是本文涵盖的一些主题:
从最简单的开始:一个服务器搞定一切。
可扩展性的艺术:向外扩展,向上扩展。
扩展关系数据库:主从复制、主主复制、联合、分片、反规范化和 SQL 调优。
使用哪个数据库:NoSQL 还是 SQL?
高级概念:缓存、CDN、geoDNS.等。
本文不打算讨论高性能计算中常见的问题,例如容错、可靠性、高可用性等。
下面,我们开始。
下图是我设计的一个最基本的应用。最简单的方法是将整个应用程序部署在一个服务器上。这可能也是我们大多数人入门时期采用的方式。
一个网站(包括 API)在Apache(或 Tomcat)之类的Web服务器上运行。
一个Oracle(或 MySQL)之类的数据库。
同一台物理机器上同时拥有网络服务器和数据库服务器
但是,这样的架构存在以下缺点:
如果数据库出现故障,系统就会出现故障。
如果网络服务器出现故障,整个系统就会出现故障。
在这种情况下,我们没有故障转移和冗余。一旦服务器宕机就会导致整个系统宕机。
使用 DNS 服务器解析主机名和 IP 地址
在上图中,为了获取托管系统的服务器IP地址,用户(或客户端)需要连接到 DNS系统。在获得 IP 地址后,请求将直接发送到我们的系统。
每次访问网站时,计算机都会执行 DNS 查找。
通常,域名系统(Domain Name System,DNS)服务器都会使用托管公司提供的付费服务,无需在自己的服务器上运行。
可扩展性的艺术
由于数据量、工作量(例如交易数量)以及用户数量的增加等多种原因,我们的系统必须具备可扩展性。
可扩展性通常意味着能够通过添加更多资源来处理更多用户、客户端、数据、事务或请求,同时还不会影响用户体验。
我们必须决定如何扩展系统。在我们的这个例子中,有以下两种扩展类型:向上扩展(scale-up)和向外扩展(scale-out)。
向上扩展 vs 向外扩展
向上扩展:向现有服务器添加更多内存和 CPU
向上扩展也称为“垂直扩展”,指的是系统的资源最大化,以扩展其处理不断增加的负载的能力。例如,我们可以通过添加内存和CPU来增强服务器的能力。
如果我们的服务器拥有8GB内存,则只需更换或添加硬件就可以轻松升级到32GB甚至128GB。
垂直扩展的方法有很多,如下所示:
通过向 RAID 阵列添加更多硬盘来增加 I/O 容量。
通过使用固态硬盘(SSD)来改善 I/O 的访问时间。
使用具有更多处理器的服务器。
通过升级网络接口或安装其他接口来提高网络吞吐量。
通过增加内存来减少 I/O 的操作。
对于小型系统来说,垂直扩展是一个不错的选择,因为硬件升级的成本较低,但这种方式也有如下限制:
不可能无限扩展单个服务器的能力。主要取决于操作系统以及服务器的内存总线宽度。
在升级系统的内存时,必须关闭服务器,因此,如果系统只有一台服务器,停机是不可避免的。
功能强大的计算机通常比流行的硬件贵很多。
向上扩展不仅适用于硬件,同时也适用于软件,例如,优化查询和应用程序代码。
随着用户数量的增长,一台服务器是远远不够的。这时,我们需要考虑将单个服务器分成多个服务器。
随着用户数据增长,一台服务器永远都不够
这种架构有以下优点:
Web 服务器和数据库服务器可以分别调优;
Web 服务器需要更好的 CPU,而数据库服务器则需要更多内存;
Web 层和数据层可以使用单独的服务器,并独立地扩展。
向外扩展也称为“横向扩展”,我们可以向资源池添加更多实体(机器、服务)。水平扩展比垂直扩展更难实现,因为我们需要在构建系统之前考虑好。
通常,水平扩展的初始成本较高,因为即使是最基本的功能也需要多台服务器来处理,但后期的回报更丰富。因此,我们需要权衡利弊。
增加服务器数量意味着需要维护的资源也更多。
需要修改系统的代码,以实现在多台服务器上的并行处理和工作负载分摊。
负载均衡器是一种专门的硬件或软件组件,可将流量分散到服务器集群中,以提高系统(包括但不限于应用程序、网站或数据库)的响应能力和可用性。
使用负载均衡器来平衡所有节点之间的流量
通常,负载均衡器位于客户端与服务器之间,接收传入的网络和应用程序流量,并通过各种算法在多个后端服务器之间分配流量。所以,它也可以用在多种地方,例如;Web 服务器与数据库服务器之间,以及客户端与 Web 服务器之间。
HAProxy 和 NGINX 是两种流行的开源负载均衡软件。
负载均衡技术是一种保证容错的方法,可按如下方式提高可用性:
如果服务器 1 离线,所有流量都将路由到服务器 2 和服务器 3。网站不会离线。此时你需要向服务器池添加一个健康的新服务器,以平衡负载。
当流量快速增长时,你只需要在 Web 服务器池中添加更多服务器,负载均衡器就会将流量路由到新的服务器上。
负载均衡器采用各种策略和工作分配算法来优化负载的分配,如下所示:
轮转:在这种情况下,每个服务器按先进先出 (FIFO) 的顺序接收请求。
最少连接数:请求将被定向到连接数量最少的服务器。
最快响应时间:请求将被定向到响应时间最快(最近或频繁)的服务器。
加权:更强大的服务器收到的请求比较弱的服务器更多。
IP Hash:在这种情况下,根据计算的客户端 IP 地址的哈希值将请求重定向到服务器。
平衡多个服务器间请求的最直接的方法是使用硬件设备:
直接向共享 IP 添加服务器,或删除服务器。
可以根据需要进行负载平衡。
软件负载平衡比硬件负载平衡器更为廉价。这里的负载均衡在第 4 层(网络层)和第 7 层(应用层)运行。
第 4 层:负载均衡器使用网络层的 TCP 协议提供的信息。这一层的负载均衡在选择服务器时通常不会查看请求内容。
第 7 层:可以根据查询字符串、cookie 或任何头部信息平衡请求,也可以使用源地址、目标地址等常规的层信息来平衡请求。
扩展关系数据库
在简单的系统中,我们可以使用Oracle 或 MySQL之类的关系型数据库来保存数据项。但是关系数据库系统有其自身的挑战,尤其是当我们需要扩展它们时。
有许多技术可以扩展关系数据库:主从复制、主主复制、联合、分片、非规范化和 SQL 调优。
复制指的是一种将相同数据的多个副本存储在不同的机器上的技术。
联合(或功能分区)会按功能拆分数据库。
分片是一种与分区相关的数据库架构模式,可以将不同的数据放在不同的服务器上,不同的用户可以访问不同的数据。
反规范化可以将数据写入多个表,从而避免昂贵的连接,以牺牲部分写入性能为代价来提高读取性能。
SQL 调优。
主从复制
主从复制技术能够将数据从一台数据库服务器(主服务器)复制到一台或多台数据库服务器(从服务器),如下图所示。
主节点更新
更新数据时,客户端需要连接到主服务器。
接着,数据会被复制到从服务器,直到所有数据在服务器之间保持一致。
这种方法仍然存在一些瓶颈:
如果主服务器由于某种原因宕机,仍然可以通过从服务器读取数据,只不过无法写入新数据了。
我们需要额外的算法来将从服务器提升为主服务器。
下面是一些解决方案,可以实现只有一台服务器处理更新请求的情况。
同步解决方案:数据修改事务需要等到所有服务器都接受后才提交(分布式事务),因此不会在故障转移时丢失数据。
异步解决方案:提交 -> 延迟 -> 复制到的其他服务器,因此在故障转移时可能会丢失一些数据更新。
如果同步解决方案太慢,则可以改为异步解决方案。
每个数据库服务器都可以与其他服务器同时担任主服务器。在某个时间点,所有主服务器进行同步,以确保它们保存了正确以及最新的数据。
节点读写数据库
主主复制的优势在于:
如果某个主服务器出现故障,其他数据库服务器可以正常运行,而且还可以担负起主服务器的责任。当数据库服务器重新上线后,可以通过复制来更新数据。
主站可以位于多个物理站点,并且可以分布在整个网络中。
但服务器的更新能力受限于主服务器。
联合(或功能分区)会按功能拆分数据库。例如,你可以拥有三个数据库,分别用于论坛、用户和产品,这样就可以减少每个数据库的读写流量,从而减少复制延迟。
按功能拆分数据库
更小的数据库可以将更多的数据保存在内存中,这样可以改善缓存的局部性,进而提高缓存命中率。由于没有单一的中央主序列化写入,你可以实现并行写入,从而提高吞吐量。
分片(也称为数据分区)是一种将大数据库分成许多小块的技术,每个数据库只能管理数据的一个子集。
在理想情况下,每个用户都使用不同的数据库节点。这种方式助于提高系统的可管理性、性能、可用性和负载均衡。
每个用户只需与一台服务器对话,因此可以快速获得服务器的响应。
服务器之间的负载均衡更好,例如,如果我们有五台服务器,则每台服务器只需处理 20% 的负载。
在实践中,有许多不同的技术可以将数据库分解为多个小块。
这种技术会将不同的行放入不同的表中。例如,如果我们将用户的个人资料存储在一个表中,则可以将ID小于1000的用户存储在一个表中,同时将ID大于1001且小于2000的用户存储在另一个表中。
不同行放入不同表中
在这种情况下,我们根据服务器中保存的与特定功能相关的表来划分数据。例如,如果我们正在构建一个类似 Instagram 的系统,我们需要在数据库中存储与用户、上传的照片以及他们关注的人相关的数据,我们可以将用户个人资料信息放在一个数据库服务器上,将好友列表放在另一个服务器上,而第三个服务器上则保存照片。
把划分数据存储在相应的表中
如果想以松散耦合的方式解决这个问题,则需要创建一个查找服务,该服务知道当前的分区模式,并拥有一份每个实体到其所属的数据库分片的映射。
当数据存储的扩展超出单个存储节点的可用资源,或者需要通过减少数据存储的竞争来提高性能时,我们就可以采用这种方法。但请记住,分片技术存在以下一些常见问题:
多表连接会变得更加昂贵,并且在某些情况下无法实现。
分片会损害数据库参照完整性。
数据库架构变更可能会变得非常昂贵。
数据分布不均匀,有些分片的负载很高。
反规范化会以牺牲部分写入性能为代价来提高读取性能。数据的冗余副本会被写入多个表,以避免昂贵的多表连接。
当数据的分布采用联合和分片等技术之后,跨数据中心的管理连接会进一步增加复杂性。反规范化可以规避这种复杂的连接。
在大多数系统中,读取的次数大大超过了写入的次数,比例为 100:1,甚至 1000:1。因此,每当读取涉及复杂的数据库连接时,就可能会非常昂贵,并在磁盘操作上花费大量时间。
有些关系数据库,比如 PostgreSQL 和 Oracle 支持物化视图,它们会存储冗余信息,并保持冗余副本一致。
在数据库领域,有两种主要的解决方案:SQL 和 NoSQL。二者的构建方式、存储信息的类型以及使用的存储方法都不同。
关系数据库以行和列的形式存储数据。每一行包含关于一个实体的所有信息,每一列包含所有的单独数据点。
最流行的关系数据库包括 MySQL、Oracle、MS SQL Server、SQLite、Postgres 以及 MariaDB等。
NoSQL又称为非关系数据库。这些数据库通常分为五个主要类别:键值数据库、图数据库、列数据库、文档数据库以及 Blob 数据库。
数据存储在键值对数组中。“键”是链接到“值”的属性名称。常见的键值存储包括 Redis、Voldemort 和 Dynamo。
在这些数据库中,数据存储在文档中(而不是表中的行和列),并且这些文档归类成集合。每个文档可以具有完全不同的结构。
常见的文档数据库包括 CouchDB 和 MongoDB。
列式数据库中,没有“表”,只有列,它们是行的容器。与关系数据库不同,我们不需要预先知道所有的列,每一行也不必具有相同的列数。
列式数据库最适合分析大型数据集,常见的有 Cassandra 和 HBase。
这些数据库常用于存储关系最适合用图表示的数据。数据保存在拥有节点(实体)、属性(关于实体的信息)和线(实体之间的连接)的图结构中。
常见的图数据库包括 Neo4J 和 InfiniteGraph。
Blob 数据库就好像文件的键/值存储,可通过API访问,如 Amazon S3、Windows Azure Blob Storage、Google Cloud Storage、Rackspace Cloud Files 或 OpenStack Swift 等。
数据库技术的选择没有统一的标准。这就是为什么许多企业同时使用 SQL 和 NoSQL 数据库来满足不同需求的原因。
如何选择?
以上,我们谈到了数据层的扩展,下面我们来看看Web层的扩展。为了扩展Web层,我们需要将用户会话(状态)的数据存储在关系数据库或 NoSQL 等数据库中,将用户会话(状态)的数据移出 Web 层。这也称为无状态架构。
无状态系统很简单
不要使用有状态的架构。
我们必须尽可能选择无状态架构,因为状态的实现限制了可扩展性,降低了可用性,并增加了成本。
在上述情况下,负载均衡器的效率最高,因为它可以选择任何服务器来处理请求。
高级概念
负载均衡可以帮助你在数量不断增加的服务器上进行水平扩展,但缓存能够更好地利用现有资源,在后续请求期间更快地提供数据。
如果数据不在缓存中,则从数据库中获取,然后将其保存到缓存中并从中读取
通过向服务器添加缓存,我们可以避免直接从服务器读取网页或数据,从而减少响应时间,并降低服务器的负载。这也有助于提升应用程序的可扩展性。
缓存可以应用于许多层,例如数据库层、Web 服务器层和网络层。
CDN 服务器保存着内容(如图像、网页等)的缓存副本,并选择地理位置最近的服务器处理请求。
使用CDN 可以缩短了用户的页面加载时间,因为数据都是从地理位置最近的服务器上加载的。这也有助于提高内容的可用性,因为数据存储在多个位置。
CDN 的使用缩短了用户的页面加载时间,因为数据是在最接近它的位置检索的
CDN 服务器向Web 服务器发出请求以验证缓存的内容,并在需要时更新缓存。缓存的内容通常是静态的,例如 HTML 页面、图像、JavaScript 文件、CSS 文件等。
当应用开始进军全球市场时,你需要在世界各地建立和运维数据中心,以确保产品可以全天候不间断地提供服务。传入的请求被路由到基于 GeoDNS 的“最佳”数据中心。
当应用走向全球
GeoDNS 是一项 DNS 服务,允许根据客户的位置将域名解析为 IP 地址。从亚洲连接的客户端获得的IP地址可能不同于从欧洲连接的客户端。
通过迭代应用本文中的技术,例如无状态架构、应用负载均衡器、尽可能多地使用缓存数据、支持多个数据中心、在 CDN 上托管静态资产、通过分片扩展数据库规模等。我们就可以轻松地将系统扩展到 1 亿用户。
缩放是一个迭代过程
原文链接:https://levelup.gitconnected.com/how-to-design-a-system-to-scale-to-your-first-100-million-users-4450a2f9703d
参考链接:
https://httpd.apache.org
http://tomcat.apache.org
https://www.oracle.com/database/
https://www.mysql.com
https://en.wikipedia.org/wiki/Domain_Name_System
https://www.facebook.com/note.php?note_id=10150468255628920
*请认真填写需求信息,我们会在24小时内与您取得联系。