Ready Test? Go, Go, Go !!!
 

关注测试,也关注成长

公告
  • 关注软件测试自动化,性能测试。
    目前负责医疗软件功能测试以及
    测试过程改进

日历
<2005年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910
统计
  • 随笔 - 22
  • 文章 - 0
  • 评论 - 87
  • 引用 - 0

导航

常用链接

留言簿(17)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

原文作者:UPS   Kylin项目小组

准备工作
:

下载struts menu, 解压其中的示例包(struts-menu里面有些库没有提供,但示例里面有) 

步骤

1,新建一个tomcat工程

2,添加webProject支持

未标题-1.jpg

3,增加struts支持
未标题-2.jpg

4,增加jstl支持

未标题-3.jpg

5, 拷贝必要的jar库文件到dbMenu\WEB-INF\lib

       log4j-1.2.8.jar

velocity-1.4.jar

velocity-tools-view-1.0.jar

struts-menu-2.3.jar 

6,创建menu-config.xml文件在dbMenu\WEB-INF目录。内容如下:

<?xml version="1.0" encoding="UTF-8" ?>

<MenuConfig>

  
<Displayers>
    
<Displayer   name="DropDown"
                 type
="net.sf.navigator.displayer.DropDownMenuDisplayer"/>
    
<Displayer   name="Simple"
                 type
="net.sf.navigator.displayer.SimpleMenuDisplayer"/>
    
<Displayer   name="CoolMenu"
                 type
="net.sf.navigator.displayer.CoolMenuDisplayer"/>
    
<Displayer   name="CoolMenu4"
                 type
="net.sf.navigator.displayer.CoolMenuDisplayer4"/>
    
<Displayer   name="MenuForm"
                 type
="net.sf.navigator.example.PermissionsFormMenuDisplayer"/>
    
<Displayer   name="ListMenu"
                 type
="net.sf.navigator.displayer.ListMenuDisplayer"/>
    
<Displayer   name="TabbedMenu"
                 type
="net.sf.navigator.displayer.TabbedMenuDisplayer"/>
    
<Displayer   name="Velocity"
                 type
="net.sf.navigator.displayer.VelocityMenuDisplayer"/>
  
</Displayers>
  
</MenuConfig>

7,修改struts-config.xml 文件,增加如下部分

   <plug-in className="net.sf.navigator.menu.MenuPlugIn">
      
<set-property property="menuConfig"
        value
="/WEB-INF/menu-config.xml"/>
   
</plug-in>

8,拷贝必要的文件

       Images/*.*

       Scripts/        menuExpandable.js xtree.js

       Styles/     menuExpandable.css   global.css   xtree.css

       Templates/xtree.html

       dbMenu\WEB-INF\classes\globalMacros.vm   (这个文件好像必须要最后拷贝,否则会自动没了why???)

10, 拷贝tld文件到dbMenu\WEB-INF

       struts-menu.tld
      
struts-menu-el.tld 

11, 不知道什么原因,需要修改web.xml文件中的version=2.3

<web-app version="2.3">

       Web.xml中增加

<context-param>
        
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
        
<param-value>TrackerRes</param-value>
    
</context-param>

11,创建数据库

       仿造如下代码创建数据库

    <sql:update>
        
CREATE TABLE menu_item (
           id BIGINT 
not null
,
           parent_name 
VARCHAR(30
),
           name 
VARCHAR(30
),
           title 
VARCHAR(30
),
           description 
VARCHAR(50
),
           location 
VARCHAR(255
),
           target 
VARCHAR(10
),
           onclick 
VARCHAR(100
),
           onmouseover 
VARCHAR(100
),
           onmouseout 
VARCHAR(100
),
           
image VARCHAR(50
),
           altImage 
VARCHAR(30
),
           tooltip 
VARCHAR(100
),
           roles 
VARCHAR(100
),
           page 
VARCHAR(255
),
           width 
VARCHAR(5
),
           height 
VARCHAR(5
),
           forward 
VARCHAR(50
),
           action 
VARCHAR(50
),
           
primary key
 (id)
        )
</sql:update>

12,填写数据库
未标题-4.jpg

13,创建index.jsp文件

<%@ page contentType="text/html; charset=UTF-8" %>


<%@ taglib uri="/WEB-INF/struts-menu.tld" prefix="menu" %>
<%@ taglib uri="/WEB-INF/struts-menu-el.tld" prefix="menu-el" %>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<%@ taglib uri="/WEB-INF/fmt.tld" prefix="fmt" %>
<%@ taglib uri="/WEB-INF/sql.tld" prefix="sql" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    

<%@ page import="java.util.Map,
                 javax.servlet.jsp.jstl.sql.Result,
                 net.sf.navigator.menu.MenuComponent,
                 net.sf.navigator.menu.MenuRepository
"%>

                 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
<title>menu test</title>
   
    
    
<link rel="stylesheet" type="text/css" media="screen" href="styles/global.css" />
    
<link rel="stylesheet" type="text/css" media="screen" href="styles/menuExpandable.css"/>
    
<script type="text/javascript" src="scripts/menuExpandable.js"></script>
    
<link rel="stylesheet" type="text/css" media="all"    href="styles/xtree.css"/>
    
<script type="text/javascript" src="scripts/xtree.js"></script>      
    
<script type="text/javascript">

        
/* Function for showing and hiding elements that use 'display:none' to hide */
        function toggleDisplay(targetId) {
            
if (document.getElementById) {
                target 
=
 document.getElementById(targetId);
                
if (target.style.display == "none"
){
                    target.style.display 
= ""
;
                } 
else
 {
                    target.style.display 
= "none"
;
                }
            }
        }
    
</script>

    
</head>
<body>

<sql:setDataSource driver="sun.jdbc.odbc.JdbcOdbcDriver"  user="" password=""
 url
="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\Program Files\\eclipse302\\workspace\dbMenu\\dm.mdb"
 var
="mydb" />

<sql:transaction dataSource="${mydb}">

    
<sql:query var="menus">
        SELECT 
* FROM dm order by id;
    
</sql:query>


</sql:transaction>
 
    
<%
        
// I had issues using the existing repository - creating a new one
        
//
 seems to solve the problem.  If you figure out how to use the default
        
//
 Repository and keep your menus from duplicating themselves - please
        
// let me know!


        MenuRepository repository 
= new MenuRepository();
        
//
 Get the repository from the application scope - and copy the
        
// DisplayerMappings from it.

        MenuRepository defaultRepository = (MenuRepository)
                application.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);
        repository.setDisplayers(defaultRepository.getDisplayers());

        Result result 
= (Result) pageContext.getAttribute("menus"
);
        Map[] rows 
=
 result.getRows();
        
for (int i=0; i < rows.length; i++
) {
            MenuComponent mc 
= new
 MenuComponent();
            Map row 
=
 rows[i];
            String name 
= (String) row.get("name"
);
            mc.setName(name);
            String parent 
= (String) row.get("parent_name"
);
            System.
out.println(name + ", parent is: " +
 parent);
            
if (parent != null
) {
                MenuComponent parentMenu 
=
 repository.getMenu(parent);
                
if (parentMenu == null
) {
                    System.
out.println("parentMenu '" + parent + "' doesn't exist!"
);
                    
// create a temporary parentMenu

                    parentMenu = new MenuComponent();
                    parentMenu.setName(parent);
                    repository.addMenu(parentMenu);
                }

                mc.setParent(parentMenu);
            }
            String title 
= (String) row.get("title"
);
            mc.setTitle(title);
            String location 
= (String) row.get("location"
);
            mc.setLocation(location);
            repository.addMenu(mc);
        }
        pageContext.setAttribute(
"repository"
, repository);
    
%>




menu test
<hr>

<a href="tabbedMenu.jsp?home">static Tab Menu </a>

<hr>

<a href="dbtabbedMenu.jsp?home"> Database Driven Tab Menu </a>

<hr>

<a href="xmlForm.jsp"> static Xml Roles Menu </a>

<hr>

<a href="myRolesForm.jsp"> dababase driven Roles Menu </a>

<hr>

<h1>Database Driven Menu</h1>

<hr>
    
<div class="dynamicMenu">
        
<menu:useMenuDisplayer name="ListMenu" repository="repository">
            
<menu:displayMenu name="DatabaseMenu"/>
            
<menu:displayMenu name="StandaloneMenu"/>
            
<menu:displayMenu name="niupi"/>
        
</menu:useMenuDisplayer>
    
</div>
<hr>
    
<div class="dynamicMenu tree">
    
<script type="text/javascript">
        
<menu:useMenuDisplayer name="Velocity" config="/templates/xtree.html"
            repository
="repository">
          
<c:forEach var="menu" items="${repository.topMenus}">
            
<menu-el:displayMenu name="${menu.name}"/>
          
</c:forEach>
        
</menu:useMenuDisplayer>
    
</script>
    
</div>
    
<hr>

</body>
</html>

14,效果图:
未标题-5.jpg

上边部分是listview样式显示的效果

下边部分是xtree样式显示的效果

==================================
关于其中遇到的问题,如果你知道答案的话一定要告诉我哦^_^先谢谢啦

posted on 2005-06-17 21:19 Cinderella 阅读(11902) 评论(25)  编辑  收藏 所属分类: 程序设计
评论:
  • # re: 使用struts-menu_详细(1)实现动态菜单  read Posted @ 2005-07-06 16:04
    能把你的实例代码,和文件给我发一份吗????
    c.tld fmt.tld sql.tld

    谢谢拉

    xiuyanzh@21cn.com  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  jdskyy Posted @ 2005-07-22 14:13
    测试多次都没有成功,能得到你运行成功的代码吗

    jdskyy@hotmail.com  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  zcl Posted @ 2005-08-04 17:35
    henhao  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单   Posted @ 2005-08-06 09:43
    dbMenu\WEB-INF\classes\globalMacros.vm (这个文件好像必须要最后拷贝,否则会自动没了why???)
    ================

    原因是web-inf下的东西是经过编译构件后产生的,你源代码里面没有这个文件,而直接拷贝到该目录下,当重新编译的时候,系统会先删除该目录下的所有文件,然后再产生编译后的文件。
    你可以拷贝该文件到源代码的根目录 ,这样编译后就会在web-inf\classes目录看到该文件啦:)  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  davidy Posted @ 2005-08-10 13:34
    主人一点专业精神也没有,我照你说做了,根本不成功.错误的.
    把你整个完整的工程,代码贴出来,证明一下啊.浪费我时间.
    <menu:displayMenu name="DatabaseMenu"/>
    错误信息是:
    2005-08-10 13:29:37 net.sf.navigator.taglib.DisplayMenuTag[http-8080-Processor25] - No menu in repository with name: StandaloneMenu

    要贴就贴对的出来,不要不负责任!!!!!!  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  小王 Posted @ 2005-08-14 16:52
    我运行之后,总提示如下错误:不知这是为什么?
    type Exception report

    message

    description The server encountered an internal error () that prevented it from fulfilling this request.

    exception

    javax.servlet.ServletException: javax.servlet.jsp.JspException: Error initializing Velocity: org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'templates/xtree.html'
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:821)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
    org.apache.jsp.admin.left_jsp._jspService(left_jsp.java:108)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:298)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
    edu.xxcb.jxpg.util.MyEncodingFilter.doFilter(MyEncodingFilter.java:26)


    root cause

    javax.servlet.jsp.JspException: Error initializing Velocity: org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'templates/xtree.html'
    net.sf.navigator.displayer.VelocityMenuDisplayer.displayComponents(VelocityMenuDisplayer.java:128)
    net.sf.navigator.displayer.VelocityMenuDisplayer.display(VelocityMenuDisplayer.java:99)
    net.sf.navigator.taglib.DisplayMenuTag.doStartTag(DisplayMenuTag.java:130)
    org.apache.jsp.admin.left_jsp._jspx_meth_menu_displayMenu_0(left_jsp.java:162)
    org.apache.jsp.admin.left_jsp._jspx_meth_menu_useMenuDisplayer_0(left_jsp.java:133)
    org.apache.jsp.admin.left_jsp._jspService(left_jsp.java:96)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:298)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
    edu.xxcb.jxpg.util.MyEncodingFilter.doFilter(MyEncodingFilter.java:26)


    root cause

    org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'templates/xtree.html'
    org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:458)
    org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:341)
    org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:831)
    org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:813)
    org.apache.velocity.runtime.RuntimeSingleton.getTemplate(RuntimeSingleton.java:285)
    org.apache.velocity.app.Velocity.getTemplate(Velocity.java:469)
    net.sf.navigator.displayer.VelocityMenuDisplayer.displayComponents(VelocityMenuDisplayer.java:124)
    net.sf.navigator.displayer.VelocityMenuDisplayer.display(VelocityMenuDisplayer.java:99)
    net.sf.navigator.taglib.DisplayMenuTag.doStartTag(DisplayMenuTag.java:130)
    org.apache.jsp.admin.left_jsp._jspx_meth_menu_displayMenu_0(left_jsp.java:162)
    org.apache.jsp.admin.left_jsp._jspx_meth_menu_useMenuDisplayer_0(left_jsp.java:133)
    org.apache.jsp.admin.left_jsp._jspService(left_jsp.java:96)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:298)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
    edu.xxcb.jxpg.util.MyEncodingFilter.doFilter(MyEncodingFilter.java:26)


    note The full stack trace of the root cause is available in the Apache Tomcat/5.0.24 logs.

      回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  Cinderella Posted @ 2005-08-15 17:30
    在templats文件夹下面有一个名为xtree.html,其内容如下
    ## displayMenu is defined in WEB-INF/classes/globalMacros.vm
    #macro( menuItem $menu $level )
    ## set title
    #set ($title = $displayer.getMessage($menu.title))
    #set ($node = $menu.name)
    #if ($level == 0)
    var $node = new WebFXTree('$title'#if($menu.url),'$!menu.url'#end);
    #else
    var $node = new WebFXTreeItem('$title'#if($menu.url),'$!menu.url'#end);
    ${menu.parent.name}.add($node);
    #end
    #end

    #displayMenu($menu 0)
    document.write($menu.name);
      回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  kjj Posted @ 2005-08-15 23:45
    虽然代码里有一些错误,但也不是你们说的那么严重
    #错误一 :<sql:query var="menus">
    SELECT * FROM dm order by id;
    </sql:query>

    应为 <sql:query var="menus">
    SELECT * FROM menu_item order by id;
    </sql:query>

    最后大家要把数据源部分换成自己的数据库参数
    <sql:setDataSource driver="sun.jdbc.odbc.JdbcOdbcDriver" user="" password=""
    url="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\Program Files\\eclipse302\\workspace\dbMenu\\dm.mdb"
    var="mydb" />
    我运行了哈,呵呵,出来了!  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  sdf Posted @ 2005-08-16 21:31
    sdfsfdsdf  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  betty Posted @ 2005-08-16 21:32
    错误信息是:
    2005-08-10 13:29:37 net.sf.navigator.taglib.DisplayMenuTag[http-8080-Processor25] - No menu in repository with name: StandaloneMenu
    这个信息是你表里没有StandaloneMenu 这个内容,楼主贴出来的表里的内容也得照填.我运行是运行了,但是不稳定.时好时坏,不知道怎么回事  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  champagne Posted @ 2005-08-21 11:30
    请教楼主,为什么我的菜单好像根本不运行menuExpandable.js呢?
    根本显示不出图片

    另外汉字也显示不了!!


    紧急求教!!!!!!!!!!!!!!!!!!

    我的邮箱hanxb2001@163.com  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  champagne Posted @ 2005-08-21 11:37
    我的开发环境是JBuilder2005,是在Struts中使用Struts-Menu的。
    Struts-Menu.war应用拿到JBuilder2005中就运行就不正常!
    现在是菜单出来了,但是不是可收缩、展开的,而是直接都展开,费了好几天劲也解决不了,求助各位兄弟!!!!!!

    本人是个JavaScript盲,也不想学了,只要能够用就行了。
      回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  闪来闪去的馒头 Posted @ 2005-09-08 13:53
    效果图是蛮漂亮的,不过实现起来怎么这么复杂啊~~  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  闪来闪去的馒头 Posted @ 2005-09-08 13:54
    不知道用dtree是不是容易些  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  波波 Posted @ 2005-09-09 15:02
    唉,失败,总是没有成功!
    能不能把你的代码发到我邮箱?谢谢,兄弟!
    zbwy1984@163.com  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  闪来闪去的馒头 Posted @ 2005-09-09 15:09
    不好意思,偶也木用过,只是随便这么一说  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  zouyan Posted @ 2005-11-04 10:00
    其实代码只有一点小小的错误,我运行出来了,我把错误总结一下:

    错误一: dbMenu\WEB-INF\classes\globalMacros.vm (这个文件好像必须要最后拷贝,否则会自动没了why???)

    应该把globalMacros.vm文件放在src源文件的根目录下,放在classes目录下每次源文件编译的时候就会把globalMacros.vm文件删除掉,

    错误二:<web-app version="2.3">

    不需要加版本号,直接就是:<web-app>

    错误三:
    <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
    <%@ taglib uri="/WEB-INF/fmt.tld" prefix="fmt" %>
    <%@ taglib uri="/WEB-INF/sql.tld" prefix="sql" %>

    这几个tld文件好像不是最新的,最好是这样写
    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
    <%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
    <%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %>

    错误四:<sql:query var="menus">
    SELECT * FROM dm order by id;
    </sql:query>

    应改为 <sql:query var="menus">
    SELECT * FROM menu_item order by id;
    </sql:query>

    最后大家要把数据源部分换成自己的数据库参数
    <sql:setDataSource driver="sun.jdbc.odbc.JdbcOdbcDriver" user="" password=""
    url="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\Program Files\\eclipse302\\workspace\dbMenu\\dm.mdb"
    var="mydb" />

    注意:var只是一个数据库的别名而已。

    <sql:transaction dataSource="${mydb}">
    这里的dataSource="${mydb}"一定要与别人保持一致  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  看不过去! Posted @ 2005-12-24 00:25
    拜托,这也算原创?  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  wen4516 Posted @ 2006-04-30 21:25
    <c:forEach var="menu" items="${repository.topMenus}">
    <menu-el:displayMenu name="${menu.name}"/>
    </c:forEach>


    这一句能否不用jstl实现。。。。  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  李锋 Posted @ 2006-05-01 19:49
    我也要一份啊!!!
    我的邮箱是:li_fengjobs@163.com  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  Jimmy Posted @ 2006-05-25 16:01
    错误都不是一样的.我这里运行错误是这样的
    java.sql.SQLException: No suitable driver
    搞了两天都没解决....气死我了...
    还有一个就是dataSource="${mydb}"我这里这样写还提示有错,把$去掉才没提示有错.这是为何..<c:forEach var="menu" items="${repository.topMenus}">这里也是一样的..我真是不懂.本来想学学Struts-menu的,这样一弄,都不知道怎么做了,以前没用过.有人帮帮我吗..  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  Jimmy Posted @ 2006-05-25 16:02
    jdzywang@163.com我的邮箱,有人帮我的话请发到这里..
    ありがとう  回复  更多评论   

  • # 用struts  楷子狐 Posted @ 2008-01-10 19:44
    我们公司也有用Struts的,我不是很懂,不过还好,做测试还能应付。  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  qpyong Posted @ 2008-04-04 21:08
    @davidy
    你不要看就不浪费你时间啦,,, 看了还说风凉话!!!  回复  更多评论   

  • # re: 使用struts-menu_详细(1)实现动态菜单  撒旦撒 Posted @ 2014-07-17 15:56
    中!国!共!产!党!万!岁  回复  更多评论   


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


网站导航:
 
 
Copyright © Cinderella Powered by: 博客园 模板提供:沪江博客