基于EasyUI Treegrid的权限管理资源列表

1. 前言

最近在开发系统权限管理相关的功能,主要包含用户管理,资源管理,角色管理,组类别管理等小的模块。之前的Web开发中也用过jQueryEasyUI插件,感觉这款插件简单易用,上手很快。以前用到的主要是Datagrid组件,这次为了区分资源的父子关系,打造更好的用户体验,遂探索一下Treegrid组件。

2.jQueryEasyUI简介

jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面。开发者不需要编写复杂的javascript,也不需要对css样式有深入的了解,开发者需要了解的只有一些简单的html标签。

EasyUI Treegrid树形网格:扩展自 $.fn.datagrid.defaults。通过 $.fn.treegrid.defaults 重写默认的 defaults。树形网格(treegrid)用于以网格形式显示分层数据。它是基于数据网格(datagrid)的,并结合了树视图(treeview)和可编辑网格。树形网格(treegrid)允许您创建可定制的、可异步展开的行,并以多列形式显示分层数据。

jQuery EasyUI官网:http://www.jeasyui.com/

jQuery EasyUI中文网:Treegrid:http://www.jeasyui.net/plugins/186.html

3.基于EasyUI Treegrid的权限管理资源列表

⑴ 引入EasyUI相关的js和css文件:

<script type="text/javascript" src="/assets/scripts/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="/assets/scripts/jquery-easyui-1.4.5/jquery.min.js"></script>
<script type="text/javascript" src="/assets/scripts/jquery-easyui-1.4.5/jquery.easyui.min.js"></script>
<link rel="stylesheet" type="text/css" href="/assets/scripts/jquery-easyui-1.4.5/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="/assets/scripts/jquery-easyui-1.4.5/themes/icon.css">

⑵ 在HTML标签中创建树形网格(treegrid):

<table id="tgTab" title="查询结果" class="easyui-treegrid" style="width:1080px;height:450px">
     <thead>
        <tr>
           <th data-options="field:‘name‘,width:160">资源名称</th>
           <th data-options="field:‘description‘,width:100">资源描述</th>
           <th data-options="field:‘code‘,width:100, align:‘center‘ ">标识码</th>
           <th data-options="field:‘type‘,width:50, align:‘center‘ ">类型</th>
           <th data-options="field:‘status‘,width:40, align:‘center‘ ">状态</th>
           <th data-options="field:‘gmtCreate‘,width:80,align:‘center‘ ">创建时间</th>
           <th data-options="field:‘gmtModified‘,width:80, align:‘center‘">最后修改时间</th>
           <th data-options="field:‘id‘,width:60,formatter:rowFormatter, align:‘center‘ ">操作</th>
        </tr>
     </thead>
</table>

⑶ Js初始化Treegrid资源列表:

  (function($){
       function pagerFilter(data){
                if ($.isArray(data)){
                    data = {
                        total: data.length,
                        rows: data
                    }
                }
                var dg = $(this);
                var state = dg.data(‘treegrid‘);
                var opts = dg.treegrid(‘options‘);
                var pager = dg.treegrid(‘getPager‘);
                pager.pagination({
                    onSelectPage:function(pageNum, pageSize){
                        opts.pageNumber = pageNum;
                        opts.pageSize = pageSize;
                        pager.pagination(‘refresh‘,{
                            pageNumber: pageNum,
                            pageSize: pageSize,
                            beforePageText: ‘第‘,  //页数文本框前显示的汉字
                            afterPageText: ‘页 共 {pages} 页‘,
                            displayMsg: ‘当前显示 {from} - {to} 条记录  共 {total} 条记录‘
                        });
                        dg.treegrid(‘loadData‘,state.originalRows);
                    },
                    beforePageText: ‘第‘,  //页数文本框前显示的汉字
                    afterPageText: ‘页 共 {pages} 页‘,
                    displayMsg: ‘当前显示 {from} - {to} 条记录  共 {total} 条记录‘
                });
                if (!state.originalRows){
                    state.originalRows = data.rows;
                }
                var topRows = [];
                var childRows = [];
                $.map(state.originalRows, function(row){
                    row._parentId ? childRows.push(row) : topRows.push(row);
                });
                data.total = topRows.length;
                var start = (opts.pageNumber-1)*parseInt(opts.pageSize);
                var end = start + parseInt(opts.pageSize);
                data.rows = $.extend(true,[],topRows.slice(start, end).concat(childRows));
                return data;
            }

            var appendMethod = $.fn.treegrid.methods.append;
            var loadDataMethod = $.fn.treegrid.methods.loadData;
            $.extend($.fn.treegrid.methods, {
                clientPaging: function(jq){
                    return jq.each(function(){
                        var state = $(this).data(‘treegrid‘);
                        var opts = state.options;
                        opts.loadFilter = pagerFilter;
                        var onBeforeLoad = opts.onBeforeLoad;
                        opts.onBeforeLoad = function(row,param){
                            state.originalRows = null;
                            onBeforeLoad.call(this, row, param);
                        };
                        $(this).treegrid(‘loadData‘, state.data);
                        $(this).treegrid(‘reload‘);
                    });
                },
                loadData: function(jq, data){
                    jq.each(function(){
                        $(this).data(‘treegrid‘).originalRows = null;
                    });
                    return loadDataMethod.call($.fn.treegrid.methods, jq, data);
                },
                append: function(jq, param){
                    return jq.each(function(){
                        var state = $(this).data(‘treegrid‘);
                        if (state.options.loadFilter == pagerFilter){
                            $.map(param.data, function(row){
                                row._parentId = row._parentId || param.parent;
                                state.originalRows.push(row);
                            });
                            $(this).treegrid(‘loadData‘, state.originalRows);
                        } else {
                            appendMethod.call($.fn.treegrid.methods, jq, param);
                        }
                    })
               }
     });
  })(jQuery);

  $(function(){
        $(‘#tgTab‘).treegrid({
                iconCls: ‘icon-ok‘,
                rownumbers: true,
                animate: true,
                collapsible: true,
                fitColumns: true,
                url: ‘../api/initResourcesList?type=-1‘,
                method: ‘get‘,
                idField: ‘id‘,
                treeField: ‘name‘,
                pagination: true,
                pageSize: 80,
                pageList: [80,120,160]
        }).treegrid(‘clientPaging‘);
  });

   function rowFormatter(value, row, index){
      //value为该条数据的field字段的值,row为该行(显示在页面)数据的所有信息,index当前行,单引号里面必须双引号,双引号里面必须单引号,里面再有就需转义
      return ‘<img id="update" src="/assets/images/layout/update.png" onclick="updateRes(‘+value+‘)"/>&nbsp;&nbsp;‘ +
                ‘&nbsp;&nbsp;<img id="delete" src="/assets/images/layout/delete.png" onclick="deleteRes(‘+value+‘)"/>‘;
  }

⑷ Java后台生成资源列表JSON数据:

/**
     * 将资源封装成资源树
     * @param list
     * @param parentId
     */
    @SuppressWarnings("deprecation")
    private List<Map<String,Object>> createTreeGridTree(List<UsersResource> list) {
    //存放转换后的资源树
    List<Map<String,Object>> treeGridList  =new ArrayList<Map<String,Object>>();  

    for (int i = 0; i < list.size(); i++) {
        Map<String, Object> map = null;
        UsersResource res = list.get(i);
        if (res.getParentId().equals(0)) {
        map = new HashMap<String, Object>();
        map.put("id", res.getId());
        map.put("name", res.getName());
        map.put("description", res.getDescription());
        map.put("code", res.getCode());
        if (res.getType() == 0) {
            map.put("type", "URL资源");
        } else if (res.getType() == 1) {
            map.put("type", "组件资源");
        } else {
            map.put("type", "虚拟根资源");
        }
        if (res.getStatus() == 0) {
            map.put("status", "隐藏");
        } else {
            map.put("status", "显示");
        }
        map.put("gmtCreate", res.getGmtCreate().toLocaleString());
        map.put("gmtModified", res.getGmtModified().toLocaleString());
        map.put("children", createTreeGridChildren(list, res.getId()));
        }
        if (map != null) {
        treeGridList.add(map);
        }
    }
    return treeGridList;
    }  

    /**
     * 递归设置资源树
     * @param list
     * @param parentId
     * @return childList
     */
    @SuppressWarnings("deprecation")
    private List<Map<String, Object>> createTreeGridChildren(List<UsersResource> list, int parentId) {
        List<Map<String, Object>> childList = new ArrayList<Map<String, Object>>();
        for (int j = 0; j < list.size(); j++) {
            Map<String, Object> map = null;
            UsersResource treeChild = list.get(j);
            if (treeChild.getParentId().equals(parentId)) {
                map = new HashMap<String, Object>();
                map.put("id", treeChild.getId());
                map.put("name", treeChild.getName());
        map.put("description", treeChild.getDescription());
        map.put("code", treeChild.getCode());
        if (treeChild.getType() == 0) {
            map.put("type", "URL资源");
        } else if (treeChild.getType() == 1) {
            map.put("type", "组件资源");
        } else {
            map.put("type", "虚拟根资源");
        }
        if (treeChild.getStatus() == 0) {
            map.put("status", "隐藏");
        } else {
            map.put("status", "显示");
        }
        map.put("gmtCreate", treeChild.getGmtCreate().toLocaleString());
        map.put("gmtModified", treeChild.getGmtModified().toLocaleString());
                map.put("children", createTreeGridChildren(list, treeChild.getId()));
            }  

            if (map != null) {
            childList.add(map);
            }
        }
        return childList;
    }  

    @GET
    @Path("initResourcesList")
    @Override
    public Object initResourcesList(String page, String rows, String name,
        String code, int type) {
    System.out.println("资源传参:page:"+ page +",rows:"+ rows +
        ",name:"+ name +",code:"+ code + ",type:"+ type);

    UsersResource usersRes = new UsersResource();
    usersRes.setName(name);
    usersRes.setCode(code);
    usersRes.setType(type);
    int recordNum = 0;  // 总记录数
    recordNum = usersResourceService.getUsersResourceTotalNumBySQL(usersRes);
    //System.out.println("资源总条数:" + recordNum);

    // *******分页******************
    int pageSize = 80;
    pageSize = Integer.parseInt(rows);
    int curPageNo = 1;
    curPageNo = Integer.parseInt(page); // 当前页号
    int startIndex = 0;  // 开始索引
    if (recordNum > 0) {
        if (curPageNo == 1) {
        startIndex = 0; // 开始索引
        } else {
        startIndex = curPageNo * pageSize - pageSize;  // 开始索引
        }
    }
    Map<String, Object> paramMap = new HashMap<String, Object>();
    paramMap.put("startIndex", startIndex);
    paramMap.put("pageSize", pageSize);
    paramMap.put("name", name);
    paramMap.put("code", code);
    paramMap.put("type", type);

    List<UsersResource> resourceList = new ArrayList<UsersResource>();
    resourceList = usersResourceService.searchUsersResourceBySQL(paramMap);

    Map<String, Object> result = new HashMap<String, Object>(2);
    JSONArray jsonArray = new JSONArray();

    List<Map<String,Object>> treeGridList  =new ArrayList<Map<String,Object>>();
    //调用方法实现树
    treeGridList = createTreeGridTree(resourceList);
    jsonArray = JSONArray.fromObject(treeGridList);

    result.put("total", recordNum);
    result.put("rows", jsonArray);
    //System.out.println("json:" + JSONObject.fromObject(result).toString());
    return JSONObject.fromObject(result);
    }

Model类:UsersResource

package com.ouc.mkhl.platform.authority.model;

import java.io.Serializable;
import java.util.Date;

//RBAC权限管理用户资源信息
public class UsersResource implements Serializable {

    private static final long serialVersionUID = 10002121L;

    private Integer id;   //用户资源Id

    private Integer authId;   //权限中心资源Id

    private String name;   //资源名称

    private String description;   //资源描述

    private String url;  //链接地址

    private Integer type;  //资源类型:0-URL资源,1-组件资源

    private Integer status;  //状态:0-隐藏,1-展示

    private String code;  //标识码

    private String configuration;  //配置项

    private String moduleName;  //模块名称

    private Date gmtCreate;  //创建时间

    private Date gmtModified;  //最后修改时间

    private String createBy;  //创建人

    private String lastModifedBy;  //最后修改人

    private Integer orderIndex;   //排序号

    private Integer parentId;  //父资源

    public Integer getId() {
    return id;
    }

    public void setId(Integer id) {
    this.id = id;
    }

    public Integer getAuthId() {
    return authId;
    }

    public void setAuthId(Integer authId) {
    this.authId = authId;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name == null ? null : name.trim();
    }

    public String getDescription() {
    return description;
    }

    public void setDescription(String description) {
    this.description = description == null ? null : description.trim();
    }

    public String getUrl() {
    return url;
    }

    public void setUrl(String url) {
    this.url = url == null ? null : url.trim();
    }

    public Integer getType() {
    return type;
    }

    public void setType(Integer type) {
    this.type = type;
    }

    public Integer getStatus() {
    return status;
    }

    public void setStatus(Integer status) {
    this.status = status;
    }

    public String getCode() {
    return code;
    }

    public void setCode(String code) {
    this.code = code == null ? null : code.trim();
    }

    public String getConfiguration() {
    return configuration;
    }

    public void setConfiguration(String configuration) {
    this.configuration = configuration == null ? null : configuration
        .trim();
    }

    public String getModuleName() {
    return moduleName;
    }

    public void setModuleName(String moduleName) {
    this.moduleName = moduleName == null ? null : moduleName.trim();
    }

    public Date getGmtCreate() {
    return gmtCreate;
    }

    public void setGmtCreate(Date gmtCreate) {
    this.gmtCreate = gmtCreate;
    }

    public Date getGmtModified() {
    return gmtModified;
    }

    public void setGmtModified(Date gmtModified) {
    this.gmtModified = gmtModified;
    }

    public String getCreateBy() {
    return createBy;
    }

    public void setCreateBy(String createBy) {
    this.createBy = createBy == null ? null : createBy.trim();
    }

    public String getLastModifedBy() {
    return lastModifedBy;
    }

    public void setLastModifedBy(String lastModifedBy) {
    this.lastModifedBy = lastModifedBy == null ? null : lastModifedBy
        .trim();
    }

    public Integer getOrderIndex() {
    return orderIndex;
    }

    public void setOrderIndex(Integer orderIndex) {
    this.orderIndex = orderIndex;
    }

    public Integer getParentId() {
    return parentId;
    }

    public void setParentId(Integer parentId) {
    this.parentId = parentId;
    }
}

4.资源列表最终效果

最终效果丑了点,需要请美工美化一下,还有分页的地方有个Bug需要改一改。分页Bug如下图:

Treegrid扩展自Datagrid,用过Datagrid的这个学起来也不是很难。

时间: 2024-11-08 05:19:12

基于EasyUI Treegrid的权限管理资源列表的相关文章

vue基于d2-admin的RBAC权限管理解决方案

前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了. vue权限路由实现方式总结 vue权限路由实现方式总结二 选择d2-admin是因为element-ui的相关开源项目里,d2-admin的结构和代码是让我感到最舒服的,而且基于d2-admin实现RBAC权限管理也很方便,对d2-admin没有大的侵入性的改动. 预览地址 Github 相关概念 不了解RBAC,可以看这里企业管理系统前后端分离架构设计 系列一 权限模型篇 实现了RBAC模型权限控制 菜单与路由独立管理,完全

Jenkins配置基于角色的项目权限管理

 本文将介绍如何配置jenkins,使其可以支持基于角色的项目权限管理. 由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,本文将使用Role Strategy Plugin,介绍页面:https://wiki.jenkins-ci.org/display/JENKINS/Role+Strategy+Plugin 1.配置插件 安装插件后,进入系统设置页面 配置如下: 2.配置权限 在系统管理页面点击Manage and Assign Ro

Jenkins配置基于角色的项目权限管理--转

本文将介绍如何配置jenkins,使其可以支持基于角色的项目权限管理. 由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,本文将使用Role Strategy Plugin,介绍页面:https://wiki.jenkins-ci.org/display/JENKINS/Role+Strategy+Plugin 一.配置插件 安装插件后,进入系统设置页面,配置如下: 官网上安全域设置为Servlet容器代理,实际操作发现Jenkins专有用户数

基于Django实现RBAC权限管理

概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色.在web应用中,可以将权限理解为url,一个权限对应一个url. 在实际应用中,url是依附在菜单下的,比如一个简单的生产企业管理系统,菜单可以大致分为以下几块:制造.资材.生产管理.人事.财务等等.每个菜单下又可以有子菜单,但最终都会指向一个url,点击这个url,通过Django路由系统执行一个视图函数,来完成某种操作.这里,制造部的员工登录系统后,肯定不能点击财务

django 基于proxy实现用户权限管理

项目中经常会遇到用户权限管理的问题,django adminsite已经提供非常实用的用户权限管理机制.不过有些时候,我们希望根据相关用户属性来过滤adminsite中显示的内容.下文将结束如何实现: 原始类 假设我有这么一个问卷类,基于这个类可以实现增删改查的功能 class wenjuan(models.Model): """ 问卷 """ name=models.CharField(u'问卷名称',max_length=128) breif

EOSS V3.0.2 企业运营支撑系统(基于RBAC原理的权限管理)

下载地址:https://github.com/jelly-liu/EOSS 一:EOSS?功能介绍 其于用户,角色,权限,资源(即菜单)的一套"简约有用"的权限管理系统,可在其基础之上.高速进行二次开发. 一个用户1:N角色. 一个用户1:N资源(即菜单). 一个角色1:N权限. 一个菜单INCLUDE无限级子菜单. 二:EOSS?技术框架 1.?完美兼容IE6.0,IE6.0+,Chrome.Firefox,其他浏览器未測试. 2.?默认MySQL.自己想办法将MySQL转换成Or

SpringBoot搭建基于Apache Shiro的权限管理功能

待续 GITHUB github : https://github.com/nbfujx/learn-java-demo/tree/master/Goku.WebService.Simple.Shiro

权限管理(一个管理员多一个角色)--初期- 待完善

对应的英文名称 检测当前登录用户是否有改权限 /// <summary> /// 判断管理员是否已经登录(解决Session超时问题) /// </summary> public bool IsAdminLogin() { //如果Session为Null if (Session["user"] != null) { return true; } else { return false; } } 判断管理员是否登录 /// <summary> ///

通用权限管理设计

权限设计(初稿)     1. 前言:     权限管理往往是一个极其复杂的问题,但也可简单表述为这样的逻辑表达式:判断"Who对What(Which)进行How的操作"的逻辑表达式是否为真.针对不同的应用,需要根据项目的实际情况和具体架构,在维护性.灵活性.完整性等N多个方案之间比较权衡,选择符合的方案.     2. 目标:     直观,因为系统最终会由最终用户来维护,权限分配的直观和容易理解,显得比较重要简单,包括概念数量上的简单和意义上的简单还有功能上的简单.想用一个权限系统