JAVA涂鸦
关于JAVA的点点滴滴
posts - 50,  comments - 689,  trackbacks - 0

   树型菜单可以说是项目中应用最为广泛的运用。以前无论使用微软控件的树型,还是比较优秀的阿赖树型,都是将数据全部读出,然后再分级显示。这样如果数据量大,那么第一次显示将需要客户等待很长一段时间,降低了客户的体验度。如今使用ajax,事情变得简单了。

   此运用参考了《征服web2.0开发技术详解》的例子。

   我使用的平台是struts+spring+hibernate,但与ajax打交道的也就是struts。我无法将整个代码贴出来,因此把重要的前台ajax代码贴出来,至于后台的代码就看你自己所使用的技术了。

1、jsp页面

<% @ page language = " java "  contentType = " text/html; charset=GB2312 "   import = " java.util.*,com.wehave.oa.cecontract.model.TbJyhtflb " %>
< html >
< head >
< title > Insert title here </ title >
< link rel = " stylesheet "  href  =   " ../css/tree.css " >  
<script type="text/javascript" src="../js/tree_htfl.js"></script>
<script languge="javascript">
    function ShowDetail(ID,NAME,FLAG)
{
        window.parent.right.location 
="getContract.go?method=doGetContract&folderID=" +ID + "&&folderName="+NAME+"&&flag="+FLAG;
    }

</script>
</head>
<body bgcolor="#F6F9FF">
<tbody>
<table cellpadding="0" cellspacing="0" width="300" >
 
<div id="load" style="display:none"> <img src="../images/tree_loading.gif">Loading data..</div>
<ul class="tree">
<%  List treeList = (List)request.getAttribute("treefolder");
    Iterator it
=treeList.iterator();
    
while(it.hasNext()){
        out.println(it.next().toString());
    }

%>
</table>
</tbody>
</body>
</html>

2、tree_htfl.js 代码
function showHide( id )
{
  var el
= document.getElementById( id );
  var bExpand 
= true;
  var images 
= el.getElementsByTagName("IMG");
  
if (images[0].src.indexOf("tree_minus.gif")!=-1)
  
{
    bExpand 
= false;
    images[
0].src="../images/tree_plus.gif";
  }
else{
    images[
0].src="../images/tree_minus.gif";
  }

  var subs
=el.lastChild;
  
if(bExpand)
    subs.style.display
="block";
  
else
    subs.style.display
="none";
}


function getSubTree( id ,submitURL)
{
  var submitURL
=submitURL
  postXmlHttp( submitURL, 
'parseSubTree("'+id+'")' ,'load("'+id+'")');
}

function parseSubTree(id)
{
  var el
= document.getElementById( id );
  var ulElmt
= document.createElement("UL");
  ulElmt.innerHTML
=_xmlHttpRequestObj.responseText;
  el.appendChild(ulElmt);
  var images 
= el.getElementsByTagName("IMG");
  images[
0].setAttribute("src""../images/tree_minus.gif");
  images[
0].setAttribute("onclick"new Function("showHide('"+id+"')"));
  var aTag 
= el.getElementsByTagName("A");
  aTag[
0].setAttribute("onclick"new Function("showHide('"+id+"')"));
  var loadDiv
= document.getElementById( "load" );
  loadDiv.style.display
="none";
}


function load(id)
{
 var loadDiv
= document.getElementById( "load" );
 loadDiv.style.display
="block";
}


var _postXmlHttpProcessPostChangeCallBack;
var _xmlHttpRequestObj;
var _loadingFunction;

function postXmlHttp( submitUrl, callbackFunc ,loadFunc)
{
  _postXmlHttpProcessPostChangeCallBack 
= callbackFunc;
  _loadingFunction 
= loadFunc;
  
if(window.createRequest)
  
{
    
try{
      _xmlHttpRequestObj
=window.createRequest();
      _xmlHttpRequestObj.open(
'POST',submitUrl,true);
      _xmlHttpRequestObj.onreadystatechange
=postXmlHttpProcessPostChange;
      _xmlHttpRequestObj.send();
    }

    
catch(ee){}
  }

  
else if(window.XMLHttpRequest)
  
{
    _xmlHttpRequestObj
=new XMLHttpRequest();
    _xmlHttpRequestObj.overrideMimeType(
'text/xml');
    _xmlHttpRequestObj.open(
'POST',submitUrl,true);
    _xmlHttpRequestObj.onreadystatechange
=postXmlHttpProcessPostChange;
    _xmlHttpRequestObj.send(
"");
  }

  
else if(window.ActiveXObject)
  
{
    _xmlHttpRequestObj
=new ActiveXObject("Microsoft.XMLHTTP");
    _xmlHttpRequestObj.open(
'POST',submitUrl,true);
    _xmlHttpRequestObj.onreadystatechange
=postXmlHttpProcessPostChange;
    _xmlHttpRequestObj.send();
  }

}
;

function postXmlHttpProcessPostChange( )
{
  
if( _xmlHttpRequestObj.readyState==4)
  
{
      
if(_xmlHttpRequestObj.status==200){
        setTimeout( _postXmlHttpProcessPostChangeCallBack, 
2 );
    }
else{
        alert(_xmlHttpRequestObj.status);
    }

  }

  
if ( _xmlHttpRequestObj.readyState==1 )
  
{
    setTimeout( _loadingFunction, 
2 );
  }

}

3、action代码

/**
     * 展开第一层目录
     
*/

    
public ActionForward doGetFolderList(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest req,
            HttpServletResponse res)
{
        List list 
= treeCatalogService.getChildren("0");
        List TreeFolder
=new ArrayList();
        Iterator it
=list.iterator();
        
while(it.hasNext()){
            TbJyhtflb htfl
=(TbJyhtflb)it.next();
            String s
=treeCatalogService.renderTreeViewAjax(htfl);
            TreeFolder.add(s);
        }

        req.setAttribute(
"treefolder",TreeFolder);
        
return mapping.findForward("foldertree");
    }

    
    
/**
     * 展开下级目录
     
*/

    
public ActionForward doGetSubFolderList(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest req,
            HttpServletResponse res)
{
        String parentID 
= req.getParameter("parentID"); //获得id的值
        if (parentID!=null&&!parentID.equals(""))//如果不为null和空
            res.setContentType("text/html;charset=GB2312");
            List list 
= treeCatalogService.getChildren(parentID);
            Iterator it
=list.iterator();
            
try {
                PrintWriter out
= res.getWriter();
                
while(it.hasNext()){
                    TbJyhtflb htfl
=(TbJyhtflb)it.next();
                    out.println(treeCatalogService.renderTreeViewAjax(htfl));
                }

                out.close();
            }
catch(Exception e){
                e.printStackTrace();
            }

        }

        
return null;
    }

4、service层代码
/**
     * 函数说明:展开目录
     * 参数说明: 目录对象
     * 返回值:展开目录的HTML代码
     
*/

    
public String renderTreeViewAjax(TbJyhtflb htfl) {
        StringBuffer content 
= new StringBuffer();
        String ID
=htfl.getTbJyhtflbZlId();
        String NAME
=htfl.getTbJyhtflbMc();
        String FLAG
=htfl.getTbJyhtflbLb();
        content.append(
"<li id='"+ID+"'>");
        
if (treeCatalogDAO.canExpand(ID))
            content.append(
"<img src=../images/tree_plus.gif onClick=\"getSubTree('"+ID+"')\">");
        
else
            content.append(
"<img src=../images/tree_blank.gif>");
        content.append(
"<img src=../images/tree_folder.gif><a href=\"javascript:ShowDetail('"+ID+"','"+NAME+"','"+FLAG+"')\"");
        
if (treeCatalogDAO.canExpand(ID)){
            String submitURL
="getFolderList.go?method=doGetSubFolderList&parentID="+ID;
            content.append(
" onClick=\"getSubTree('"+ID+"',submitURL)\"");
        }

        content.append(
">"+NAME+"</a>");
        
        content.append(
"</li>");
        
return content.toString();
    }

5、tree.css代码:
    p{
        font
-family:arial;
        
    }

    a
{
        color:#
000;
        font
-family:arial;
        font
-size:0.8em;
    }

    
    .tree
{
        margin:0px;
        padding:0px;
    }

    .tree ul
{    /*子结点*/
        margin
-left:20px;    /* Left spacing */
        padding
-left:0px;
    }

    .tree li
{    /* 结点 */ 
        list
-style-type:none;
        vertical
-align:middle;
        
    }

    .tree li a
{    /* 结点连接 */
        color:#
000;
        text
-decoration:none;
        font
-family:arial;
        font
-size:0.8em;
        padding
-left:2px;
    }

代码基本就是这样了,希望对大家有用。
posted on 2006-07-24 10:03 千山鸟飞绝 阅读(13856) 评论(54)  编辑  收藏 所属分类: Ajax

FeedBack:
# re: 运用ajax技术的树型菜单
2006-07-24 12:41 | cctv
能共享一下源文件吗?li98311@etang.com非常感谢  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-07-24 13:03 | Shooper.Java
# re: 运用ajax技术的树型菜单
2006-07-26 16:07 | inber
希望能看一下你的展示程序,如果可能能发份代码吗:)
inber520@yahoo.com.cn  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-07-26 17:58 | Vycon
可以发给我一份源代码吗?多谢了!

vycon@163.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-07-27 09:05 | 千山鸟飞绝
不知道大家需要的源码是什么,是《征服》里源码吗?

因为我这是项目中的代码,所以不可能是一个很完整的可以直接copy下来就运行的,但我还是将最重要的代码给贴出来了。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-07-31 14:54 | 呵呵
可否把tree.css的代码发上来?谢谢  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-07-31 16:37 | zJun's帛罗阁
是怎么构造树的呢?是在tree_ajax.js和tree_htfl.js中吗?哪里可以找到这两个文件呢,这两个文件所有的内容就是文章中提供的js文件的内容吗?最好能提供这两个文件的代码。现在这样看有点摸不着头脑。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-08-01 09:14 | 千山鸟飞绝
我重新修改了一下,提交了tree.css代码。
另外tree_ajax.js是不需要的,我已经删除。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-08-15 11:10 | 新新人类
把你代码能否共享一下,谢谢

wuxj888@yahoo.com.cn  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-08-16 10:48 | ccyy
ccyy978@126.com
谢谢楼主  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-08-31 04:05 | 糊里糊涂啊糊里糊涂
感谢,研究下先

service层代码 里边包含了太多的 html 了吧?这样想要修改下样式还要对service里边动刀,感觉不太妥当!  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-09-04 15:34 | dingqf
dingqf@sttri.com.cn
谢谢搂住,我要生成个5k个节点的树!  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-09-07 13:14 | kerbs
ajax没推出之前,也用过这样显示,这样显示的问题是点击展开菜单的时候,如数据量大用户还是要等一段时间。
而全部读出分级显示只是第一次等待而已,以后则很快。各有利弊吧  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-09-13 13:37 | 千山鸟飞绝
这样显示的问题是点击展开菜单的时候,如数据量大用户还是要等一段时间。
================================
这是数据量相当大才会出现这种情况。如果一个子目录下都有这么多信息,那么整个目录一起读取将会等待多久呢。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-09-13 13:38 | 千山鸟飞绝
service层代码 里边包含了太多的 html 了吧?这样想要修改下样式还要对service里边动刀,感觉不太妥当!
=============================
确实是这样,希望大家共同研究。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-10-07 10:10 | 哈哈哈
《征》作者原来是images[0].setAttribute("onclick", "showHide('"+id+"')")这样写的,是不对的。

应该是images[0].setAttribute("onclick", new Function("showHide('"+id+"')"))。

以上大家注意了  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-10-08 14:39 | 千山鸟飞绝
@哈哈哈

《征》所用的方法适合firefox这类浏览器。而如果要兼容IE浏览器就必须new Function了。

  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-11-24 13:22 | 213123
123123123  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2006-12-21 11:16 | cory
能否发一下源码  qq522540@gmail.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-01-28 11:06 |
可否发一封给我啊,wangguan_xd@126.com。先谢过了!  回复  更多评论
  
# re: 运用ajax技术的树型菜单[未登录]
2007-03-23 08:18 | 幽幽
楼主,可否也给我一份代码,树的

谢谢了

aprilsuny@163.com 非常感谢!希望你能看到  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-03-24 09:06 | 千山鸟飞绝
因为这是写在项目中的代码,所以无法给大家。

等下次那天有空,做个单独的DEMO,让大家下载。

我的这个树是参考了《征服web2.0开发技术详解》书中的例子。大家也可以去看看这本书。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-06-05 11:36 | jick
这个还不错,谢了。不过有没更先进一点的啊。
如果有,帮忙发过来。yinhui.java@163.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-06-08 13:58 | 天路
谢谢,学习中

wfjvip@126.com

请共享一份。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-06-12 11:32 | 卧石荷花
好东西,楼主分享一份
hehua513@163.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-06-12 11:32 | 卧石荷花
谢谢  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-08-14 15:14 | pn2007
能否发一份源码?谢谢! sailsoft@tom.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单[未登录]
2007-08-28 14:48 | java爱好者
楼主,
能否给我发一份源代码呀?
我很需要那,,,,,
希望能得到你的回复,,,,
先谢谢了。。。。。。
我的邮箱:wfj587@126.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-10-01 14:19 | 守望者
迫切希望楼主能整理下,共享下!谢谢
zhouliming-521@163.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单[未登录]
2007-10-19 16:26 | jacky
请发到我邮箱来 frank18@126.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-10-19 18:07 | 创世纪计算机
这种很不错,现在已经出来好几种了,各有所长~  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-10-21 16:03 | rjw
我也迫切需要 可以的话发我一份 rennuoting@126.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-11-18 16:09 | jon
我也需要 可以的话发我一份 joney_110@163.com   回复  更多评论
  
# re: 运用ajax技术的树型菜单
2007-12-09 19:28 | 猎人
能给我发一份源代码吗?谢谢了
nxzn2008@hotmail.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-02-06 21:00 |
请问一下要把《征服》的代码放到IE下为什么就不能使用动态树了呢?我已经加了new Function()了,但是还是只能在firefox下使用,而不能在IE下使用,请问大家有没有碰到这种情况的 啊?谢谢指教一下。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-02-06 21:02 |
在这里主要是不理解:String submitURL="getFolderList.go?method=doGetSubFolderList&parentID="+ID;
这一句,在征服里面用的是treeview?parentID+ID,但是在整个war文件里面没有看到treeview为名的文件。劳烦各位帮帮忙解决一下。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-03-13 09:31 | satanc
function postXmlHttp( submitUrl, callbackFunc ,loadFunc)
{
_postXmlHttpProcessPostChangeCallBack = callbackFunc;
_loadingFunction = loadFunc;
if(window.createRequest)
{
try{
_xmlHttpRequestObj=window.createRequest();
_xmlHttpRequestObj.open('POST',submitUrl,true);
_xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
_xmlHttpRequestObj.send();
}
catch(ee){}
}
else if(window.XMLHttpRequest)
{
_xmlHttpRequestObj=new XMLHttpRequest();
_xmlHttpRequestObj.overrideMimeType('text/xml');
_xmlHttpRequestObj.open('POST',submitUrl,true);
_xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
_xmlHttpRequestObj.send("");
}
else if(window.ActiveXObject)
{
_xmlHttpRequestObj=new ActiveXObject("Microsoft.XMLHTTP");
_xmlHttpRequestObj.open('POST',submitUrl,true);
_xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
_xmlHttpRequestObj.send();
}
};

函数中没有增加对浏览器的判断,比如在IE7下树就打不开,  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-03-13 15:22 | 千山鸟飞绝
@satanc
ajax对ie7的兼容性确实不好。

这个树形,我已经改为适合ie7的结构了。下次更新一下。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-05-05 10:29 | hz
搂主能不能给我发一份有关jsp树型菜单的源码啊,不胜感谢!!!
boy_33@163.com
谢谢了!!!  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-05-10 22:56 | bbq
楼主能把实现整个树型菜单的代码发给我吗,小弟感激不尽!  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-05-10 22:57 | bbq
楼主能把实现整个树型菜单的代码发给我吗,小弟感激不尽!
bbqlove2008@163.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-05-28 11:14 | nevi
学习中,楼主能把实现整个树型菜单的代码发给我吗?感激不尽! 邮箱是:somethingtodo@163.com,谢谢了。  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-06-12 08:05 | xieamao
能否给我也发一份源代码,感激不尽。
邮箱:xpf7622@hotmail.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-06-23 14:30 | luoyexian
能否也给我一分源码.非常感谢e-mail:luoyexian@163.com
  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-06-24 15:55 | luoyexian
请问这段代码是怎么理解?我看不懂.可以解析下吗?
两个if是不是重叠了?
if (treeCatalogDAO.canExpand(ID))
content.append("<img src=../images/tree_plus.gif onClick=\"getSubTree('"+ID+"')\">");
else
content.append("<img src=../images/tree_blank.gif>");
content.append("<img src=../images/tree_folder.gif><a href=\"javascript:ShowDetail('"+ID+"','"+NAME+"','"+FLAG+"')\"");
if (treeCatalogDAO.canExpand(ID)){
String submitURL="getFolderList.go?method=doGetSubFolderList&parentID="+ID;
content.append(" onClick=\"getSubTree('"+ID+"',submitURL)\"");
}
content.append(">"+NAME+"</a>");
  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-07-15 16:20 | Cherry
能否也给我一分源码.非常感谢e-mail:cherryxiangyi@gmail.com
我尝试自己做,可是还有一些部分不明白,所以希望能看看你的源码加以研究,谢谢
  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-09-13 19:00 | chip
能否也给我一分源码.非常感谢e-mail:aixroot@163.com
  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2008-11-23 20:31 | 孙利超
能不能也给我一份那?
非常感谢 slchao123@163.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单[未登录]
2009-03-08 15:24 | echo
能不能给我发一份,我的邮箱是psyche19830113@163.com
谢谢!  回复  更多评论
  
# re: 运用ajax技术的树型菜单[未登录]
2009-03-19 23:24 | wade
调试了一下,下面这个方法有点错误:
==================================================
/** *//**
* 函数说明:展开目录
* 参数说明: 目录对象
* 返回值:展开目录的HTML代码
*/
public String renderTreeViewAjax(TbJyhtflb htfl) {
StringBuffer content = new StringBuffer();
String ID=htfl.getTbJyhtflbZlId();
String NAME=htfl.getTbJyhtflbMc();
String FLAG=htfl.getTbJyhtflbLb();
content.append("<li id='"+ID+"'>");
if (treeCatalogDAO.canExpand(ID))
content.append("<img src=../images/tree_plus.gif onClick=\"getSubTree('"+ID+"')\">");
else
content.append("<img src=../images/tree_blank.gif>");
content.append("<img src=../images/tree_folder.gif><a href=\"javascript:ShowDetail('"+ID+"','"+NAME+"','"+FLAG+"')\"");
if (treeCatalogDAO.canExpand(ID)){
String submitURL="getFolderList.go?method=doGetSubFolderList&parentID="+ID;
content.append(" onClick=\"getSubTree('"+ID+"',submitURL)\"");
}
content.append(">"+NAME+"</a>");

content.append("</li>");
return content.toString();
}
==============================================
正确的写法是:

/** *//**
* 函数说明:展开目录
* 参数说明: 目录对象
* 返回值:展开目录的HTML代码
*/
public String renderTreeViewAjax(TbJyhtflb htfl) {
StringBuffer content = new StringBuffer();
String ID=htfl.getTbJyhtflbZlId();
String NAME=htfl.getTbJyhtflbMc();
String FLAG=htfl.getTbJyhtflbLb();
content.append("<li id='"+ID+"'>");
if (treeCatalogDAO.canExpand(ID)) {
String submitURL="getFolderList.go?method=doGetSubFolderList&parentID="+ID;
content.append("<img src=../images/tree_plus.gif onClick=\"getSubTree('"+ID+"','"+submitURL+"')\">");
}
else {
content.append("<img src=../images/tree_blank.gif>");
}
content.append("<img src=../images/tree_folder.gif><a href=\"javascript:ShowDetail('"+ID+"','"+NAME+"','"+FLAG+"')\"");

content.append(">"+NAME+"</a>");

content.append("</li>");
return content.toString();
}  回复  更多评论
  
# re: 运用ajax技术的树型菜单[未登录]
2009-03-20 10:03 | wade
要代码的到这里下:
http://wei-jing.javaeye.com/blog/351995  回复  更多评论
  
# re: 运用ajax技术的树型菜单
2009-04-13 18:01 | 谢华锋
你好能发一份程序代码给我吗? 太谢谢了````邮箱地址xiehuafeng880530@163.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单[未登录]
2009-07-31 17:14 | a
mmh_hudy@126.com  回复  更多评论
  
# re: 运用ajax技术的树型菜单[未登录]
2011-08-29 13:32 | justin
能发一份源代码给我吗?谢谢楼主~bxiong@hp.com  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
正在阅读:



<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(35)

随笔档案

文章分类

文章档案

好友的blog

我的其他blog

老婆的Blog

搜索

  •  

积分与排名

  • 积分 - 773012
  • 排名 - 56

最新评论

阅读排行榜

评论排行榜