detree的使用心得

在执行d.add操作时
添加的一级菜单的顺序,决定了一级菜单的显示顺序

由于add操作的第2个参数,决定了谁是它的上级菜单,
所以不论一级菜单的子菜单在哪添加的,都能自动添加到对应的上一层的一级菜单中
但是add二级子菜单的顺序,也会影响到在一级菜单下的显示顺序
        d = new dTree('d');
        d.add(0,-1,'My example tree');
        d.add(12,0,'note 6','example01.html');
        d.add(9,0,'note 5','example01.html');
         d.add(1,0,'Node 1','example01.html');
        d.add(2,0,'Node 2','example01.html');

        d.add(8,1,'note 1 第2个二级菜单','example01.html');
        d.add(3,1,'note 1 第1个二级菜单','example01.html');
        d.add(4,0,'Node 3','example01.html');
        d.add(5,3,'第1个三级菜单','example01.html');
        d.add(6,5,'第1个四级菜单','example01.html');
        d.add(7,0,'Node 4','example01.html');

        d.add(11,9,'note 5 第2个二级菜单','example01.html');
        d.add(10,9,'note 5  第1个二级级菜单','example01.html');

        document.write(d);

add的参数设置情况
    第几个参数      参数别名       类型             功能 
        1          id          int         节点自身的id(唯一) 
       2          pid         int         节点的父节点id 
       3          name        string      节点显示在页面上的名称 
        4          url         string      节点的链接地址 
        5          title       string      鼠标放在节点上显示的提示信息 
        6          target      string      节点链接所打开的目标frame 
       7          icon        string      节点关闭状态时显示的图标 
        8          iconOpen    string      节点打开状态时显示的图标 
        9          open        boolean     节点第一次加载是否打开

后台的菜单权限查询

View Code
public List<?> getMenuListByUserId(String empId) {
        //根据登录用户的id,查找到当前雇员
        Employee emp = (Employee) this.getObject(Employee.class, empId);
        //如果是管理员,查出所有的菜单, 返回
        /**
         * 这里的排序很重要, 决定了各级菜单显示顺序
         * 在Menu菜单中有一个属性 mnOrder,对应于数据库表的mn_order字段,mn_order字段的值是数字,0,1,2,3,5,6...
         * 在一级菜单中的mn_order可以使用数字0,1,2,3,4,5...在二级菜单中也可以使用数字0,1,2,3,4,5...
         * 所有的菜单按照mn_order进行升序 排序,是表面上看着  一级菜单,二级菜单,三级菜单...菜单顺序是乱的
         * 这些菜单都是从0,1,2,3...这样的顺序排的,各级菜单掺杂在了一起
         * 
         * 对应detree而言    ,
         * 1. 因为add操作的第二个参数指定了当前菜单的上级菜单,所有各级菜单都会找到各自的上级菜单,菜单显示的结果表面上只是显示一级菜单,认为最初的显示的是一级菜单
         * 
         * 2. 由于一级菜单通过mn_order进行升序排序,所有一级菜单会按照自己的mn_order指定的数值大小进行显示,如果mn_order的数值变了,一级菜单显示顺序也就变了
         * 
         * 3. 对应一级菜单下面的二级菜单而言,不论二级菜单在哪定义的,都会找到自己的上级(即一级菜单)菜单,由于二级菜单也通过mn_order进行了排序,
         *       mn_order的顺序就决定了一级菜单下面二级菜单的显示顺序
         */
        if ("y".equals(emp.getIsAdmin())) {
            return this.findObjects("From Menu order by mnOrder");
        }
        
        String roleMnIds = "";
        //如果不是管理员,获取当前用户的所有角色,每个角色对应着不同的菜单,进而查出当前用户能看到的所有的菜单的id
        for (Object obj : emp.getRoles()) {
            Role role = (Role) obj;
            for (Object o : role.getMenus()) {
                Menu m = (Menu) o;
                roleMnIds += "'" + m.getMnId() + "',";
            }
        }
        if (roleMnIds.equals("")) {
            return null;
        }
        roleMnIds = roleMnIds.substring(0, roleMnIds.length() - 1);
        //根据菜单的id,查出所有的菜单的list 
        //这里排序order by mnOrder ,解释和上面的解释一样,很重要
        return this.findObjects("From Menu where mnId in(" + roleMnIds + ")  order by mnOrder");
    }

前台的代码显示:

View Code
<script type="text/javascript">
<!--

        d = new dTree('d');
        var isShow = true;
        <s:if test="#request.menuList.size > 50">
            isShow = false;
        </s:if>
        
        <s:iterator value="#request.menuList" id="obj" status="st">
            d.add('<s:property value="#obj.mnId"/>','<s:property value="#obj.parentMenu.mnId"/>','<s:property value="#obj.mnName"/>','<s:property value="#obj.mnUrl"/>','<s:property value="#obj.mnUrl"/>','contentFrame','','',isShow);
        </s:iterator>

        document.write(d);
        //-->
    </script>

menu菜单表设计:

 欢迎转载,转载请注明文章出处:http://www.cnblogs.com/wanggd

 

posted @ 2012-12-13 14:21  wanggd_blog  阅读(270)  评论(0)    收藏  举报