无限极分类原理与完成,添加二级导航

By admin in 4858.com on 2019年2月11日

明天看了看phpcms
写到二级导航时发现点难点,查询导航栏的音讯时重返的$r[arrchildid]与团结想象的不符,文档上实属重回子栏目id可是却有些不相同。

今日看了看phpcms
写到二级导航时发现点难点,查询导航栏的新闻时回来的$r[arrchildid]与和睦想象的不合,文档上实属再次来到子栏目id可是却有点分歧。

明日看了看phpcms
写到二级导航时意识点难点,查询导航栏的音讯时重临的$r[arrchildid]与温馨想象的不合,文档上实属重临子栏目id可是却有些分化。

前言

无限极分类是自我很久前学到知识,前几天在做一个品种时,发现对其定义有点模糊,所以前几日就来说说无限极分类。

首先来说说怎么是无限极分类。根据我的敞亮,就是对数码形成数次分类,就像一棵树一样,从根开首,到基本、枝干、叶子……

成功无限极分类,紧要选拔了两种办法,一是递归形式,二是迭代艺术。而关键利用无限极分类的地点有地址解析,面包屑导航等等。下边就来具体介绍二种办法的法则及贯彻形式。

始于的思绪:

先河的思路:

始发的思绪:

家谱树与子孙树

家谱树是无限极分类的表现方式之一,另一个是子孙树。一开头攻读无限极分类时,我日常弄混这两棵树,以往看来自然是领略很多。从中文的趣味也可以见到其中的界别。

家谱,以后广大地点都流行起修家谱,那怎么修家谱,依照我知道,就是给协调找一个祖先,一代代找上去,形成了一个连串,那样编篡而成的叫家谱。家谱树就与之类似,从某个节点起首向上寻找其父节点,再找父节点的父节点,直到找不到截至。依照那种寻找,形成的一个看似树状的布局,就称为家谱树。

而子孙树与其相反,子孙树类似于生物书中的遗传图,从某个节点起始摸索它的子节点,再找子节点的子节点,直到寻找达成。那样形成的树状结构就叫做子孙树。

从地点对家谱树与子孙树的叙说,将其更换为代码时,我的第一印象就是应用递归格局,家谱树,找父节点的父节点,子孙树,找子节点的子节点。完全符合递归思想。所以率先大家的话说利用递归格局成就家谱树与子孙树。

 1  <ul class="nav navbar-nav">
 2     <li class="active"><a href="{siteurl($siteid)}">首页</a></li>
 3        {pc:content action="category" catid="0" num="10" siteid="$siteid" order="listorder ASC"}
 4           {loop $data $r}
 5           {if $r[arrchildid]}
 6             <li class="dropdown">
 7               <a href="{$r[url]}" class="dropdown-toggle" child="{$r[arrchildid]}" data-toggle="dropdown">{$r[catname]}<b class="caret"></b></a>
 8                  <ul class="dropdown-menu">
 9                   {pc:content action="category" catid="$r[catid]" num="10" siteid="$siteid" order="listorder ASC" return="data2"}
10                     {loop $data2 $v}
11                       <li><a href="{$v[url]}">{$v[catname]}</a></li>
12                     {/loop}
13                   {/pc}
14                  </ul>  
15             </li>
18           {/if}
19         {/loop}
20      {/pc}
21 </ul>
 1  <ul class="nav navbar-nav">
 2     <li class="active"><a href="{siteurl($siteid)}">首页</a></li>
 3        {pc:content action="category" catid="0" num="10" siteid="$siteid" order="listorder ASC"}
 4           {loop $data $r}
 5           {if $r[arrchildid]}
 6             <li class="dropdown">
 7               <a href="{$r[url]}" class="dropdown-toggle" child="{$r[arrchildid]}" data-toggle="dropdown">{$r[catname]}<b class="caret"></b></a>
 8                  <ul class="dropdown-menu">
 9                   {pc:content action="category" catid="$r[catid]" num="10" siteid="$siteid" order="listorder ASC" return="data2"}
10                     {loop $data2 $v}
11                       <li><a href="{$v[url]}">{$v[catname]}</a></li>
12                     {/loop}
13                   {/pc}
14                  </ul>  
15             </li>
18           {/if}
19         {/loop}
20      {/pc}
21 </ul>
<ul class="nav navbar-nav">
<li class="active"><a href="{siteurl($siteid)}">首页</a></li>
{pc:content action="category" catid="0" num="10" siteid="$siteid" order="listorder ASC"}
{loop $data $r}
{if $r[arrchildid]}
<li class="dropdown">
<a href="{$r[url]}" class="dropdown-toggle" child="{$r[arrchildid]}" data-toggle="dropdown">{$r[catname]}<b class="caret"></b></a>
<ul class="dropdown-menu">
{pc:content action="category" catid="$r[catid]" num="10" siteid="$siteid" order="listorder ASC" return="data2"}
{loop $data2 $v}
<li><a href="{$v[url]}">{$v[catname]}</a></li>
{/loop}
{/pc}
</ul> 
</li>
{/if}
{/loop}
{/pc}
</ul>

递归格局

约莫思路:查询该文档下是还是不是有子栏目id,假如有则输出二级导航。代码中第5行是检测该栏目下是还是不是有子栏目id,不过自身发觉当没有子栏目时会重回当前栏目标id导致判断无法达标预期的成效,所以改变思路,代码如下:

约莫思路:查询该文档下是或不是有子栏目id,如若有则输出二级导航。代码中第5行是检测该栏目下是还是不是有子栏目id,不过本人发觉当没有子栏目时会重临当前栏目标id导致判断不能达标预期的法力,所以改变思路,代码如下:

约莫思路:查询该文档下是还是不是有子栏目id,如若有则输出二级导航。代码中第5行是检测该栏目下是还是不是有子栏目id,可是我发觉当没有子栏目时会重临当前栏目标id导致判断不可以完毕预期的功用,所以改变思路,代码如下:

家谱树的贯彻

为更清楚的执教,我先将即将分类的多寡贴在上边,是关于地点的数量:

$address = array(
    array('id'=>1  , 'address'=>'安徽' , 'parent_id' => 0),
    array('id'=>2  , 'address'=>'江苏' , 'parent_id' => 0),
    array('id'=>3  , 'address'=>'合肥' , 'parent_id' => 1),
    array('id'=>4  , 'address'=>'庐阳区' , 'parent_id' => 3),
    array('id'=>5  , 'address'=>'大杨镇' , 'parent_id' => 4),
    array('id'=>6  , 'address'=>'南京' , 'parent_id' => 2),
    array('id'=>7  , 'address'=>'玄武区' , 'parent_id' => 6),
    array('id'=>8  , 'address'=>'梅园新村街道', 'parent_id' => 7),
    array('id'=>9  , 'address'=>'上海' , 'parent_id' => 0),
    array('id'=>10 , 'address'=>'黄浦区' , 'parent_id' => 9),
    array('id'=>11 , 'address'=>'外滩' , 'parent_id' => 10)
    array('id'=>12 , 'address'=>'安庆' , 'parent_id' => 1)
    );

根据上文的介绍,对下面数据开展家谱树无限极分类,若是我们想要寻找大杨镇的家谱树,先找到与之相关的信息。

'id'=>5  , 'address'=>'大杨镇' , 'parent_id' => 4

可以看到它的父节点的id,即parent_id == 4,那么id==4的节点就是其父节点,由此找到和县:

'id'=>4  , 'address'=>'庐阳区' , 'parent_id' => 3

与地点类似,寻找id=3的节点,依次向上寻找,找到大杨镇的家谱

大杨镇 -> 庐阳区 -> 合肥 -> 安徽

那么怎么用代码来成功它呢?其实很粗略,只必要判定寻找的父id是还是不是与节点的id相等,即parent_id ?= id,相等就是要寻找的父节点,并把该节点的parent_id作为寻找的id,递归进行检索。如下边的流程图:

4858.com 1

递归方法求家谱树

下面就起来编制代码:

/**
 * 获取家谱树
 * @param   array        $data   待分类的数据
 * @param   int/string   $pid    要找的祖先节点
 */
function Ancestry($data , $pid) {
    static $ancestry = array();

    foreach($data as $key => $value) {
        if($value['id'] == $pid) {
            $ancestry[] = $value;

            Ancestry($data , $value['parent_id']);
        }
    }
    return $ancestry;
}

按照流程图,代码编写成功。注意下面存储结点的数组,即$ancestry,要添加静态化关键字static,否则每回递归都会将该数组开头化。当然也得以运用array_merge无限极分类原理与完成,添加二级导航。将每一遍回来的数组与上五回的展开统一。

追寻家谱的机要就是原则判断,寻找的parent_id非常某个节点的id值,鲜明该节点就是要寻找的父节点。

代码编写成功,来看望是或不是顺应大家的意料,来寻找大杨镇的家谱:

Ancestry($address , 4);

结果:

Array
(
    [0] => Array
        (
            [id] => 4
            [address] => 庐阳区
            [parent_id] => 3
        )
    [1] => Array
        (
            [id] => 3
            [address] => 合肥
            [parent_id] => 1
        )
    [2] => Array
        (
            [id] => 1
            [address] => 安徽
            [parent_id] => 0
        )
)

可以看出结果与我们预料相符。那么家谱树的递归方法就做到了,下边来讲子孙树的完毕。

 1  <ul class="nav navbar-nav">
 2     <li class="active"><a href="{siteurl($siteid)}">首页</a></li>
 3       {pc:content action="category" catid="0" num="10" siteid="$siteid" order="listorder ASC"}
 4          {loop $data $r}
 5            {if $r[arrchildid] != $r[catid]}
 6              <li class="dropdown">
 7                <a href="{$r[url]}" class="dropdown-toggle" child="{$r[arrchildid]}" data-toggle="dropdown">{$r[catname]}<b class="caret"></b></a>
 8                  <ul class="dropdown-menu">
 9                     {pc:content action="category" catid="$r[catid]" num="10" siteid="$siteid" order="listorder ASC" return="data2"}
10                       {loop $data2 $v}
11                         <li><a href="{$v[url]}">{$v[catname]}</a></li>
12                       {/loop}
13                      {/pc}
14                   </ul>  
15               </li>
16            {else}
17               <li><a href="{$r[url]}">{$r[catname]}</a></li>
18            {/if}
19         {/loop}
20       {/pc}
21 </ul>
 1  <ul class="nav navbar-nav">
 2     <li class="active"><a href="{siteurl($siteid)}">首页</a></li>
 3       {pc:content action="category" catid="0" num="10" siteid="$siteid" order="listorder ASC"}
 4          {loop $data $r}
 5            {if $r[arrchildid] != $r[catid]}
 6              <li class="dropdown">
 7                <a href="{$r[url]}" class="dropdown-toggle" child="{$r[arrchildid]}" data-toggle="dropdown">{$r[catname]}<b class="caret"></b></a>
 8                  <ul class="dropdown-menu">
 9                     {pc:content action="category" catid="$r[catid]" num="10" siteid="$siteid" order="listorder ASC" return="data2"}
10                       {loop $data2 $v}
11                         <li><a href="{$v[url]}">{$v[catname]}</a></li>
12                       {/loop}
13                      {/pc}
14                   </ul>  
15               </li>
16            {else}
17               <li><a href="{$r[url]}">{$r[catname]}</a></li>
18            {/if}
19         {/loop}
20       {/pc}
21 </ul>
<ul class="nav navbar-nav">
<li class="active"><a href="{siteurl($siteid)}">首页</a></li>
{pc:content action="category" catid="0" num="10" siteid="$siteid" order="listorder ASC"}
{loop $data $r}
{if $r[arrchildid] != $r[catid]}
<li class="dropdown">
<a href="{$r[url]}" class="dropdown-toggle" child="{$r[arrchildid]}" data-toggle="dropdown">{$r[catname]}<b class="caret"></b></a>
<ul class="dropdown-menu">
{pc:content action="category" catid="$r[catid]" num="10" siteid="$siteid" order="listorder ASC" return="data2"}
{loop $data2 $v}
<li><a href="{$v[url]}">{$v[catname]}</a></li>
{/loop}
{/pc}
</ul> 
</li>
{else}
<li><a href="{$r[url]}">{$r[catname]}</a></li>
{/if}
{/loop}
{/pc}
</ul>

子孙树的贯彻

如故采纳方面的数额,子孙树是从父节点开首,向下寻找其子孙节点,而形成的一个树状图形。

一旦寻找id=0的子孙节点,那么就要留意有所parent_id=0的节点,这么些节点都以id=0的子节点。然后,把parent_id=0节点的id作为查询id继续向下询问,直到查不到任何子节点截止。如下:

4858.com 2

子孙树

流程图如下:

4858.com 3

子孙树流程图

其流程与家谱树类似,不一致点,也是关键点就是条件语句的施行。家谱树判断的是时下节点的id是还是不是与上一个节点的parent_id相等;子孙树判断的是当前节点的parent_id与上一个节点的id相等,依照那种规格判断子孙树可以有七个子孙节点,而家谱树只可以存在一个祖辈。代码如下:

/**
 * 获取子孙树
 * @param   array        $data   待分类的数据
 * @param   int/string   $id     要找的子节点id
 * @param   int          $lev    节点等级
 */
 function getSubTree($data , $id = 0 , $lev = 0) {
    static $son = array();

    foreach($data as $key => $value) {
        if($value['parent_id'] == $id) {
            $value['lev'] = $lev;
            $son[] = $value;
            getSubTree($data , $value['id'] , $lev+1);
        }
    }

    return $son;
 }

在函数中自我添加了一个变量lev,为的是给存入的节点标注等级,方便探望子孙树的构造。下边来测试结果:

getSubTree($data , 0 , 0);

因篇幅有限,将结果开展一些处理:

foreach($tree as $k => $v) {
    echo str_repeat('--' , $v['lev']) . $v['address'] . '<br/>';
}

结果:

安徽
--合肥
----庐阳区
------大杨镇
--安庆
江苏
--南京
----玄武区
------梅园新村街道
上海
--黄浦区
----外滩

递归方式的家谱树与儿孙树相比较便于精通,只要对递归思想相比通晓,一步步写下去不是很难。比起递归方式,迭代艺术可能越来越令人难以精晓。上边就来介绍迭代方式的家谱树与子孙树编写。

认清得到到的子栏目id是还是不是等于该栏目id,等于则意味着并未子栏目,不对等则意味着有子栏目且显示子栏目

判断拿到到的子栏目id是还是不是等于该栏目id,等于则意味从未子栏目,不对等则表示有子栏目且突显子栏目

认清得到到的子栏目id是不是等于该栏目id,等于则意味从没子栏目,不对等则表示有子栏目且突显子栏目

迭代情势

如上所述是作者给大家介绍的PHPCMS V9
添加二级导航的思路详解,希望对我们持有扶助,要是大家有其余疑问请给本身留言,小编会及时过来大家的。在此也格外谢谢大家对台本之家网站的接济!

家谱树

完毕跌代格局的家谱树之前,首先说一下搜寻祖先节点的终止条件。即使叫无限极分类,它不是纯属的最好,只是理论的最好。

有如我国上下五千年历史,任一个大的姓氏,向上找其祖先,不是找到神农大帝就是找到黄帝,在往前就一向不历史记载了。所以在家谱树的搜寻中也有终止条件,就是在分拣数据中再也找不到它的父节点时,表今后实例数据上,就是不设有parent_id < 0的节点。

那也是成功迭代的主要,以其作为迭代条件,对数码举办巡回判断,并把每一趟找到的节点的parent_id重新作为迭代条件,直到不满足迭代条件。流程图如下:

4858.com 4

家谱树迭代流程

理清流程,今后始于形成代码编写:

function Ancestry($data , $pid) {
    $ancestry = array();

    while($pid > 0) {
        foreach($data as $v) {
            if($v['id'] == $pid) {
                $ancestry[] = $v;

                $pid = $v['parent_id'];
            }
        }
    }

    return $ancestry;
}

迭代口径$pid>0,当pid>0时证实还有祖先存在,可以持续迭代,否则表达没有祖先,迭代为止。$pid = $v['parent_id']是迭代一而再开展的主要,每趟找到祖先节点,就将祖先节点的父id传递给pid,举办下三次迭代。

运转那些函数,结果与应用递归格局的结果一致。

您可能感兴趣的稿子:

  • 选拔PHPCMS搭建wap手机网站
  • phpcms模块开发之swfupload的行使介绍
  • linux服务器下PHPCMS v9
    安全体署详解
  • php笔记之:初探PHPcms模块开发介绍
  • PHPCMS的应用小结
  • CodeIgniter使用phpcms模板引擎
  • phpcms的归类名称和品种称号的调用
  • phpcms手机内容页面添加上一篇和下一篇
  • PHPCMS手机站伪静态设置详细教程
  • PHPCMS忘记后台密码的化解办法
  • 解决phpcms更换javascript的幻灯片代码调用图片难点
  • phpcms中的评论样式修改章程
  • 哪些给phpcms v9增添类似于phpcms
    2008中的关键词表
  • PHPCMS蒙受会员投稿审核无效的解决格局
  • Ajax完毕phpcms
    点赞功能实例代码
  • PHPCMS2008广告模板SQL注入漏洞修复
  • phpcms配置列表页以及拿到文章公布时间
  • phpcms
    v9禁止提交音讯到官网方法详解

子孙树的兑现

动用迭代艺术形成子孙树,更为复杂,须求使用的栈的构思。在进展迭代的进度中,将每一遍搜寻的id入栈,找到一个节点,就将该节点从原数据中删去,当寻找到叶子节点时,即不存在子孙节点时,就将该叶子节点对应的id从栈中弹出,再找找栈顶id的子孙节点,直到栈清空截止,迭代得了。上边用一个例证来表达:

$address = array(
    array('id'=>1  , 'address'=>'安徽' , 'parent_id' => 0),
    array('id'=>2  , 'address'=>'江苏' , 'parent_id' => 0),
    array('id'=>3  , 'address'=>'合肥' , 'parent_id' => 1),
    array('id'=>4  , 'address'=>'庐阳区' , 'parent_id' => 3),
    array('id'=>5  , 'address'=>'大杨镇' , 'parent_id' => 4),
    array('id'=>6  , 'address'=>'南京' , 'parent_id' => 2),
    array('id'=>7  , 'address'=>'玄武区' , 'parent_id' => 6),
    array('id'=>8  , 'address'=>'梅园新村街道', 'parent_id' => 7),
    array('id'=>9  , 'address'=>'上海' , 'parent_id' => 0),
    array('id'=>10 , 'address'=>'黄浦区' , 'parent_id' => 9),
    array('id'=>11 , 'address'=>'外滩' , 'parent_id' => 10)
    array('id'=>12 , 'address'=>'安庆' , 'parent_id' => 1)
    );

追寻id=0的子孙节点,id=0入栈,寻找到该节点,为

array('id'=>1  , 'address'=>'安徽' , 'parent_id' => 0)

那时栈为[0],并且将该节点从原数据中剔除,再将id=1入栈,寻找id=1的子孙节点,找到为:

array('id'=>3  , 'address'=>'合肥' , 'parent_id' => 1),

此时栈[0][1],将该节点删除,id=3入栈,寻找id=3的子孙节点,找到:

array('id'=>4  , 'address'=>'庐阳区' , 'parent_id' => 3)

[0][1][3],将该节点删除,id=4入栈,寻找id=4的子孙节点,找到:

array('id'=>5  , 'address'=>'大杨镇'       , 'parent_id' => 4),

[0][1][3][4],将该节点删除,id=5入栈,栈[0][1][3][4][5],并物色id=5的子节点,遍历后未找到,于是将id=5出栈,再一次寻找id=4的子孙节点,依次展开。最终成功全体迭代。

里面,栈的状态如下:

[0]
[0][1]
[0][1][3]
[0][1][3][4]
[0][1][3][4][5]
[0][1][3][4]
[0][1][3]
[0][1]
[0][1][12]
[0][1]
[0]
……

代码如下:

function getSubTree($data , $id = 0) {
    $task = array($id);                       # 栈 任务表
    $son = array();

    while(!empty($task)) {
        $flag = false;                           # 是否找到节点标志
        foreach($data as $k => $v) {

            # 判断是否是子孙节点的条件 与 递归方式一致
            if($v['parent_id'] == $id) {
                $son[] = $v;                     # 节点存入数组
                array_push($task , $v['id']);   # 节点id入栈
                $id = $v['id'];               # 判断条件切换
                unset($data[$k]);               # 删除节点
                $flag = true;                   # 找到节点标志
            }
        }

        # flag == false说明已经到了叶子节点 无子孙节点了
        if($flag == false) {
            array_pop($task);                   # 出栈
            $id = end($task);                   # 寻找栈顶id的子节点
        }
    }
    return $son;
}

此间找到节点后务必把该节点从原数据中删除,否则会造成每回都找到该节点,形成无限迭代的bug。在此地运用数组函数array_push与array_pop模拟进栈与出栈操作。

采纳迭代完毕子孙树比较复杂,且本身没有测试过这一个与递归格局何人的频率高,然则使用迭代成功家谱树显明比起递归方法功能高。

应用

面包屑导航

说完了无限极分类的贯彻原理与格局,以后以来说在网站中对无限极分类的施用。最常用的就是面包屑导航了。

怎样是面包屑导航,那个名叫来自刘勇话轶事”汉赛尔和格莱特”,具体哪些故事就不叙述了,有趣味的可以去谷歌(谷歌)时而。面包屑导航的功力就是告诉访问者他们脚下在网站中的地点以及怎么样回到。下图就是一个卓越的面包屑导航。

4858.com 5

面包屑导航

面包屑是一个典型家谱树的施用,不要看它是从左到右,分类级数越来越低,就觉得它是子孙树应用,要明了子孙树是唯恐存在七个支行,而面包屑导航必要的是一条基本。

4858.com ,将地点家谱树代码做肯定修改,就可见形成面包屑导航。大家选用递归方式的家谱树。代码如下:

function Ancestry($data , $pid) {
    static $ancestry = array();

    foreach($data as $key => $value) {
        if($value['id'] == $pid) {

            Ancestry($data , $value['parent_id']);

            $ancestry[] = $value;               
        }
    }
    return $ancestry;
}

要是先举办递归调用,在递总停止再将找到的节点存入数组中,就可以使祖先节点排列在数组前列,子孙节点排列在数组后列,方便开展提取数据。

简化演示步骤,不从数据库中取出数据,改为模拟数据:

$tmp = array(
    array('cate_id'=1 , 'name'=>'首页' , 'parent_id'=>'0'),
    array('cate_id'=2 , 'name'=>'新闻中心' , 'parent_id'=>'1'),
    array('cate_id'=3 , 'name'=>'娱乐新闻' , 'parent_id'=>'2'),
    array('cate_id'=4 , 'name'=>'军事要闻' , 'parent_id'=>'2'),
    array('cate_id'=5 , 'name'=>'体育新闻' , 'parent_id'=>'2'),
    array('cate_id'=6 , 'name'=>'博客' , 'parent_id'=>'1'),
    array('cate_id'=7 , 'name'=>'旅游日志' , 'parent_id'=>'6'),
    array('cate_id'=8 , 'name'=>'心情' , 'parent_id'=>'6'),
    array('cate_id'=9 , 'name'=>'小小说' , 'parent_id'=>'6'),
    array('cate_id'=10 , 'name'=>'明星' , 'parent_id'=>'3'),
    array('cate_id'=11 , 'name'=>'网红' , 'parent_id'=>'3')
    );

只要用户点进明星导航,那么在网站突显的导航为:

$tree = Ancestry($tmp , 10);
foreach ($tree as $key => $value) {
    echo $value['name'] . '>';
}

4858.com 6

面包屑导航

防备设置父类为子类

在网站建立中,只怕会遭逢用户展开编制时出现误操作,将某个栏目标父节点设置成了该栏目的子节点,举办如此的安装后会导致数据库中的数据丢失,因而在拓展多少更新在此以前应当专注那一点。

运用家谱树,就可见幸免暴发那种错误。在用户提交表单时,我们将即将修改栏目标父节点的家谱树取出,并对家谱树举办遍历,要是发现该家谱树中发现了要修改的节点,就表明是错误操作。有点绕,举个例证来表达:

修改栏目新闻中心的父节点为娱乐新闻,就把嬉戏消息的家谱树取出来:

玩耍音讯 音讯主旨 首页

在该家谱树中窥见要修改的节点,音信中央,那么评释出现了不当。具体代码如下:

$data = Ancestry($tmp , 3);
foreach ($data as $key => $value) {
    if($value['cate_id'] == 3) {
        echo  'Error';
        break;
    }
}

结语

对无限极分类的讲授就写到那儿,希望可以给对无限极分类存在虚张声势的同桌肯定的灵感。在下才疏学浅,可能在叙述中存在错漏,希望观望的同学可以指出。

并且在此,感谢布尔教育的刘道成,即燕十八老师,从他的教学视频中学到很多,这一次再也看无限极分类,燕先生的视频给了自家无数协理。再度谢谢燕老师。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有