• jeesite中角色分配详解及改为ajax调用


    一:jeesite中的角色分配form表单:

    1.父页面是roleAssign.jsp,子页面是selectUserToRole.jsp;

    2.父页面调用子页面用的jBox,代码如下

    <input id="assignButton" class="btn btn-primary" type="submit" value="分配角色"/>
            <script type="text/javascript">
                $("#assignButton").click(function(){
                    top.$.jBox.open("iframe:${ctx}/sys/role/usertorole?id=${role.id}", "分配角色",810,$(top.document).height()-240,{
                        buttons:{"确定分配":"ok", "清除已选":"clear", "关闭":true}, bottomText:"通过选择部门,然后为列出的人员分配角色。",submit:function(v, h, f){
                            var pre_ids = h.find("iframe")[0].contentWindow.pre_ids;
                            var ids = h.find("iframe")[0].contentWindow.ids;
                            //nodes = selectedTree.getSelectedNodes();
                            if (v=="ok"){
                                // 删除''的元素
                                if(ids[0]==''){
                                    ids.shift();
                                    pre_ids.shift();
                                }
                                if(pre_ids.sort().toString() == ids.sort().toString()){
                                    top.$.jBox.tip("未给角色【${role.name}】分配新成员!", 'info');
                                    return false;
                                };
                                // 执行保存
                                loading('正在提交,请稍等...');
                                var idsArr = "";
                                for (var i = 0; i<ids.length; i++) {
                                    idsArr = (idsArr + ids[i]) + (((i + 1)== ids.length) ? '':',');
                                }
                                $('#idsArr').val(idsArr);
                                $('#assignRoleForm').submit();
                                return true;
                            } else if (v=="clear"){
                                h.find("iframe")[0].contentWindow.clearAssign();
                                return false;
                            }
                        }, loaded:function(h){
                            $(".jbox-content", top.document).css("overflow-y","hidden");
                        }
                    });
                });
            </script>
    View Code

     3.jBox会调用后台RoleController.java 代码如下:

     1 /**
     2      * 角色分配 -- 打开角色分配对话框
     3      * @param role
     4      * @param model
     5      * @return
     6      */
     7     @RequiresPermissions("sys:role:view")
     8     @RequestMapping(value = "usertorole")
     9     public String selectUserToRole(Role role, Model model) {
    10         List<User> userList = systemService.findUser(new User(new Role(role.getId())));
    11         model.addAttribute("role", role);
    12         model.addAttribute("userList", userList);
    13         model.addAttribute("selectIds", Collections3.extractToString(userList, "name", ","));
    14         model.addAttribute("officeList", officeService.findAll());
    15         return "modules/sys/selectUserToRole";
    16     }
    View Code

    4.调用后台会回到子页面selectUserToRole.jsp  代码如下:

    <%@ page contentType="text/html;charset=UTF-8" %>
    <%@ include file="/WEB-INF/views/include/taglib.jsp"%>
    <html>
    <head>
        <title>分配角色</title>
        <meta name="decorator" content="blank"/>
        <%@include file="/WEB-INF/views/include/treeview.jsp" %>
        <script type="text/javascript">
        
            var officeTree;
            var selectedTree;//zTree已选择对象
            
            // 初始化
            $(document).ready(function(){
                officeTree = $.fn.zTree.init($("#officeTree"), setting, officeNodes);
                selectedTree = $.fn.zTree.init($("#selectedTree"), setting, selectedNodes);
            });
    
            var setting = {view: {showLine:false,selectedMulti:false,nameIsHTML:true,showTitle:false,dblClickExpand:false},
                    data: {simpleData: {enable: true}},
                    callback: {onClick: treeOnClick}};
            
            var officeNodes=[
                    <c:forEach items="${officeList}" var="office">
                    {id:"${office.id}",
                     pId:"${not empty office.parent?office.parent.id:0}", 
                     name:"${office.name}"},
                    </c:forEach>];
        
            var pre_selectedNodes =[
                       <c:forEach items="${userList}" var="user">
                       {id:"${user.id}",
                        pId:"0",
                        name:"<font color='red' style='font-weight:bold;'>${user.name}</font>"},
                       </c:forEach>];
            
            var selectedNodes =[
                    <c:forEach items="${userList}" var="user">
                    {id:"${user.id}",
                     pId:"0",
                     name:"<font color='red' style='font-weight:bold;'>${user.name}</font>"},
                    </c:forEach>];
            
            var pre_ids = "${selectIds}".split(",");
            var ids = "${selectIds}".split(",");
            
            //点击选择项回调
            function treeOnClick(event, treeId, treeNode, clickFlag){
                $.fn.zTree.getZTreeObj(treeId).expandNode(treeNode);
                if("officeTree"==treeId){
                    $.get("${ctx}/sys/role/users?officeId=" + treeNode.id, function(userNodes){
                        $.fn.zTree.init($("#userTree"), setting, userNodes);
                    });
                }
                if("userTree"==treeId){
                    //alert(treeNode.id + " | " + ids);
                    //alert(typeof ids[0] + " | " +  typeof treeNode.id);
                    if($.inArray(String(treeNode.id), ids)<0){
                        selectedTree.addNodes(null, treeNode);
                        ids.push(String(treeNode.id));
                    }
                };
                if("selectedTree"==treeId){
                    if($.inArray(String(treeNode.id), pre_ids)<0){
                        selectedTree.removeNode(treeNode);
                        ids.splice($.inArray(String(treeNode.id), ids), 1);
                    }else{
                        top.$.jBox.tip("角色原有成员不能清除!", 'info');
                    }
                }
            };
            function clearAssign(){
                var submit = function (v, h, f) {
                    if (v == 'ok'){
                        var tips="";
                        if(pre_ids.sort().toString() == ids.sort().toString()){
                            tips = "未给角色【${role.name}】分配新成员!";
                        }else{
                            tips = "已选人员清除成功!";
                        }
                        ids=pre_ids.slice(0);
                        selectedNodes=pre_selectedNodes;
                        $.fn.zTree.init($("#selectedTree"), setting, selectedNodes);
                        top.$.jBox.tip(tips, 'info');
                    } else if (v == 'cancel'){
                        // 取消
                        top.$.jBox.tip("取消清除操作!", 'info');
                    }
                    return true;
                };
                tips="确定清除角色【${role.name}】下的已选人员?";
                top.$.jBox.confirm(tips, "清除确认", submit);
            };
        </script>
    </head>
    <body>
        <div id="assignRole" class="row-fluid span12">
            <div class="span4" style="border-right: 1px solid #A8A8A8;">
                <p>所在部门:</p>
                <div id="officeTree" class="ztree"></div>
            </div>
            <div class="span3">
                <p>待选人员:</p>
                <div id="userTree" class="ztree"></div>
            </div>
            <div class="span3" style="padding-left:16px;border-left: 1px solid #A8A8A8;">
                <p>已选人员:</p>
                <div id="selectedTree" class="ztree"></div>
            </div>
        </div>
    </body>
    </html>
    View Code

    5.一进子页面会调用初始化

    $(document).ready(function(){
    officeTree = $.fn.zTree.init($("#officeTree"), setting, officeNodes);
    selectedTree = $.fn.zTree.init($("#selectedTree"), setting, selectedNodes);
    });
    View Code

    6.officeNodes和selectedNodes都是用的<c:forEach>标签遍历从后台sys/role/usertorole接口中查到的变量,

    var selectedNodes =[
    <c:forEach items="${userList}" var="user">
    {id:"${user.id}",
    pId:"0",
    name:"<font color='red' style='font-weight:bold;'>${user.name}</font>"},
    </c:forEach>];
    View Code

    查询回来的已选的把字体设置成红色是在<c:forEach>标签中设置的。

    7.var pre_ids = "${selectIds}".split(",");var ids = "${selectIds}".split(",");初始话进入子页面两个变量取的是接口中查询回来的数据是一样的;

    当把待选人员点到已选人员列表时ids变量会添加一个节点的id;pre_ids还不变;

    这两个变量主要是判断已选列表可否添加移除的,添加移除代码如下:

    if("userTree"==treeId){
                    //alert(treeNode.id + " | " + ids);
                    //alert(typeof ids[0] + " | " +  typeof treeNode.id);
                    if($.inArray(String(treeNode.id), ids)<0){
                        selectedTree.addNodes(null, treeNode);
                        ids.push(String(treeNode.id));
                    }
                };
                if("selectedTree"==treeId){
                    if($.inArray(String(treeNode.id), pre_ids)<0){
                        selectedTree.removeNode(treeNode);
                        ids.splice($.inArray(String(treeNode.id), ids), 1);
                    }else{
                        top.$.jBox.tip("角色原有成员不能清除!", 'info');
                    }
                }
    View Code

     8.确定分配调用form表单的提交事件

    loading('正在提交,请稍等...');
                                var idsArr = "";
                                for (var i = 0; i<ids.length; i++) {
                                    idsArr = (idsArr + ids[i]) + (((i + 1)== ids.length) ? '':',');
                                }
                                $('#idsArr').val(idsArr);
                                $('#assignRoleForm').submit();
                                return true;
    View Code

    idsArr用了赋值语句和三目运算符,idsArr实际就是把ids中的数据遍历添加到idsArr中;把所有人员列表的id添加到idsArr中最后在后台对已经添加的人员做处理。

    form表单如下:

    <form id="assignRoleForm" action="${ctx}/sys/role/assignrole" method="post" class="hide">
                <input type="hidden" name="id" value="${role.id}"/>
                <input id="idsArr" type="hidden" name="idsArr" value=""/>
            </form>
    View Code

    9.角色分配的后台代码

    /**
         * 角色分配
         * @param role
         * @param idsArr
         * @param redirectAttributes
         * @return
         */
        @RequiresPermissions("sys:role:edit")
        @RequestMapping(value = "assignrole")
        public String assignRole(Role role, String[] idsArr, RedirectAttributes redirectAttributes) {
            if(Global.isDemoMode()){
                addMessage(redirectAttributes, "演示模式,不允许操作!");
                return "redirect:" + adminPath + "/sys/role/assign?id="+role.getId();
            }
            StringBuilder msg = new StringBuilder();
            int newNum = 0;
            for (int i = 0; i < idsArr.length; i++) {
                User user = systemService.assignUserToRole(role, systemService.getUser(idsArr[i]));
                if (null != user) {
                    msg.append("<br/>新增用户【" + user.getName() + "】到角色【" + role.getName() + "】!");
                    newNum++;
                }
            }
            addMessage(redirectAttributes, "已成功分配 "+newNum+" 个用户"+msg);
            return "redirect:" + adminPath + "/sys/role/assign?id="+role.getId();
        }
    View Code
    @Transactional(readOnly = false)
        public User assignUserToRole(Role role, User user) {
            if (user == null){
                return null;
            }
            List<String> roleIds = user.getRoleIdList();
            if (roleIds.contains(role.getId())) {
                return null;
            }
            user.getRoleList().add(role);
            saveUser(user);
            return user;
        }
    View Code

     10.类似下图:

    二:jeesite中的类似角色分配ajax调用:

    1.父页面调用子页面的代码:主要是点击按钮调用后台方法转换一个试图作为子页面,子页面点击确定分配和清除调用的方法,确定分配的时候会用ajax调用后台确定分配的事件。

    <input id="assignButton"  type="button" value="ajax分配角色"  onclick="assignRole()"/>
            <script type="text/javascript">
                function assignRole(){
                        top.$.jBox.open("iframe:${ctx}/role/role/openchildWin", "分配角色",810,600,{
                        buttons:{"确定分配":"ok", "清除已选":"clear", "关闭":true}, bottomText:"通过选择部门,然后为列出的人员添加人员。",submit:function(v, h, f){
                            var ids = h.find("iframe")[0].contentWindow.ids;
                            var pre_ids = h.find("iframe")[0].contentWindow.pre_ids;
                            var submitData = h.find("iframe")[0].contentWindow.submitData;
                            if (v=="ok"){
                                // 删除''的元素
                                if(ids[0]==""){
                                    ids.shift();
                                    pre_ids.shift();
                                }
                                if(pre_ids.sort().toString() == ids.sort().toString()){
                                    top.$.jBox.tip("未选择表!", 'info');
                                    return false;
                                };
                                for (var i = 0; i<submitData.length; i++) {
                                    var map2 = {};
                                    var nameTemp ={};
                                    nameTemp['name'] = submitData[i].name;//名字
                                    map2['people'] = assetTemp;
                                    var rlnListTemp = [];
                                    var rlnTemp = {};
                                    rlnTemp['id'] = submitData[i].id;//编号
                                    rlnTemp['rln'] = "include";
                                    rlnListTemp.push(rlnTemp);
                                    var rlnjson = {};
                                    rlnjson['resId']=rlnListTemp
                                    map2['rlnInfo'] = rlnjson;
                                    var json = JSON.stringify(map2);
                                    $.ajax({
                                        type: "POST",
                                        dataType: "",
                                        url:"${ctx}/role/role/addRole",
                                        data:{"info":json},
                                        success : function(result) {
                                            //$.fn.zTree.init($("#waitchooseTree"), setting, result).expandAll(true);
                                            alertx("添加成功!");
                                        },
                                        error : function() {alertx("失败");}
                                    });
                                }
                                
                                return true;
                            } else if (v=="clear"){
                                h.find("iframe")[0].contentWindow.clearAssign();
                                return false;
                                }
                            }, loaded:function(h){
                            $(".jbox-content", top.document).css("overflow-y","hidden");
                            }
                        });
                }
            
                
            </script>
    View Code

     2.子页面代码如下:

    <%@ page contentType="text/html;charset=UTF-8" %>
    <%@ include file="/WEB-INF/views/include/taglib.jsp"%>
    <%@ include file="/WEB-INF/views/include/head.jsp"%>
    <html>
    <head>
        <title>分配角色</title>
        <%@include file="/WEB-INF/views/include/treeview.jsp"%>
        <meta name="decorator" content="default"/>
        <script type="text/javascript">
        var pre_ids = [];
        var ids = [];
        var submitData = [];
        $(document).ready(function() {
            
            var selectedTree;//zTree已选择对象
            
            
            var setting = {
                    view : {showLine:false},
                    data : {
                        simpleData : {enable : true,idKey : "id",pIdKey : "pId",rootPId : '0'}},
                        callback : {onClick :treeOnClick}
            };
            var settingRed = {
                    view : {showLine:false,
                    fontCss: { 'color': 'red' }    
                    },
                    data : {
                        simpleData : {enable : true,idKey : "id",pIdKey : "pId",rootPId : '0'}},
                        callback : {onClick :treeOnClick}
            };
            function gettree() {
                $.getJSON("${ctx}/project/project/myproject?type=1",function(data) {
                    $.fn.zTree.init($("#mesresourTree"), setting, data).expandAll(true);
                });
                
                $.getJSON("${ctx}/projectemporay/projectemporary/schemalView?assettype=schema",function(data) {
                    selectedTree = $.fn.zTree.init($("#selectedTree"), settingRed, data);
                    debugger
                    for(var i = 0 ;i<data.length;i++){
                        var selectedlinfo = {};
                        selectedlinfo['id'] = String(data[i].id);
                        selectedlinfo['name'] = String(data[i].name);
                        ids.push(selectedlinfo);
                        pre_ids.push(selectedlinfo);
                    }
                });
            } 
            gettree();
            
            //点击选择项回调
            function treeOnClick(event, treeId, treeNode, clickFlag){
                $.fn.zTree.getZTreeObj(treeId).expandNode(treeNode);
                if("mesresourTree"==treeId){
                    var map2 = {};
                    map2['id'] = treeNode.id;
                    map2['name'] = treeNode.name;
                    var json = JSON.stringify(map2);
                    $.ajax({
                        type: "POST",
                        dataType: "",
                        url:"${ctx}/role/role/allPeople",
                        data:{"info":json},
                        success : function(result) {
                            $.fn.zTree.init($("#waitchooseTree"), setting, result).expandAll(true);
                        },
                        error : function() {alertx("失败");}
                    });
                }
                var selectedId = [];
                if("waitchooseTree"==treeId){
                    debugger
                    for(var j=0;j<ids.length;j++){
                        if(ids[j]==""){
                            ids.shift();
                        }else{
                            selectedId.push(ids[j].id+ids[j].name)
                        }
                    }
                    if($.inArray(String(treeNode.id+treeNode.name), selectedId)<0){
                        debugger
                        selectedTree.setting.view.fontCss["color"] = 'Black';
                        selectedTree.addNodes(null, treeNode);
                        var tempInfo = {};
                        tempInfo['name'] = String(treeNode.name);
                        tempInfo['id'] = String(treeNode.id);
                        ids.push(tempInfo);
                        submitData.push(tempInfo);
                    }
                };
                var pre_selectedId = [];
                for(var j=0;j<pre_ids.length;j++){
                    if(pre_ids[j]==""){
                        pre_ids.shift();
                    }else{
                        pre_selectedId.push(pre_ids[j].id+pre_ids[j].name)
                    }
                }
                var submitId = [];
                for(var j=0;j<submitData.length;j++){
                    if(submitData[j]==""){
                        submitData.shift();
                    }else{
                        submitId.push(submitData[j].id+submitData[j].name)
                    }
                }
                for(var j=0;j<ids.length;j++){
                    if(ids[j]==""){
                        ids.shift();
                    }else{
                        selectedId.push(ids[j].id+ids[j].name)
                    }
                }
                if("selectedTree"==treeId){
                    if($.inArray(String(treeNode.id+treeNode.name), pre_selectedId)<0){
                        selectedTree.removeNode(treeNode);
                        ids.splice($.inArray(String(treeNode.id+treeNode.name), selectedId), 1);
                        submitData.splice($.inArray(String(treeNode.id+treeNode.name), submitId), 1);
                    }else{
                        top.$.jBox.tip("原有模式不能清除!", 'info');
                    }
                }
            };
            function clearAssign(){
                var submit = function (v, h, f) {
                    if (v == 'ok'){
                        var tips="";
                        if(pre_ids.sort().toString() == ids.sort().toString()){
                            tips = "未给角色添加新成员!";
                        }else{
                            tips = "已选表清除成功!";
                        }
                        ids=pre_ids.slice(0);
                        $.getJSON("${ctx}/role/role/cleartree",function(data) {
                            selectedTree = $.fn.zTree.init($("#selectedTree"), setting, data);
                        });
                        top.$.jBox.tip(tips, 'info');
                    } else if (v == 'cancel'){
                        // 取消
                        top.$.jBox.tip("取消清除操作!", 'info');
                    }
                    return true;
                };
                tips="确定清除已选的人员?";
                top.$.jBox.confirm(tips, "清除确认", submit);
            };
        });
            
        </script>
    </head>
    <body>
        <div id="assignRole" class="row-fluid span12" style="95%;">
            <div class="span4" style="border-right: 1px solid #A8A8A8;">
                <p>部门:</p>
                <div id="mesresourTree" class="ztree"></div>
            </div>
            <div class="span3">
                <p>待选人员:</p>
                <div id="waitchooseTree" class="ztree"></div>
            </div>
            <div class="span3" style="padding-left:16px;border-left: 1px solid #A8A8A8;">
                <p>已选人员:</p>
                <div id="selectedTree" class="ztree"></div>
            </div>
        </div>
    </body>
    </html>
    View Code

     3.贴一段后台代码类似这种:注意不是转页面的只是要返回的数据记得要加@ResponseBody

    @ResponseBody
        @RequestMapping(value = "users")
        public List<Office> users(String id, HttpServletResponse response) throws Exception {
            List<Office> list = officeService.findAll();
            return list;
             
        }
    @ResponseBody
        @RequestMapping(value = "users")
        public List<Map<String, Object>> users(String officeId, HttpServletResponse response) throws Exception {
            List<Map<String, Object>> mapList = Lists.newArrayList();
            DataRole dataRole=new DataRole();
            dataRole.setId(officeId);
            List<User> UserList = dataRoleService.findOfficeIdUser(dataRole);
            for (User e : UserList) {
                Map<String, Object> map = Maps.newHashMap();
                map.put("id", e.getId());
                map.put("pId", 0);
                map.put("name", e.getName());
                mapList.add(map);            
            }
            return mapList;
             
        }
    View Code

    注意:1.ajax中用selectedTree.setting.view.fontCss["color"] = 'Black';改变字体颜色,选中的列表初始化调用var settingRed设置字体为红色,添加的节点设置字体颜色为黑色。

    2.submitData是添加的节点的数据(这个数据是从待选列表中点击到已选准备提交的数据),提交调用ajax使用。

    3.pre_ids比对可否从已选列表中移除,ids比对可否添加到已选列表,初始进页面时pre_ids和ids数据一样,都是查询后台已选数据。

    4.父页面中拿子页面的变量(注意:全局变量)h.find("iframe")[0].contentWindow.pre_ids;我们可以在debugger中查看iframe数组变量下的contentWindow-->window--->location--->pathname

     确定页面不错。页面不错的话拿window下的全局变量,也可以调用方法。

     

  • 相关阅读:
    JS判断单选框是否选中
    Js判断是否有属性
    判断是否有焦点
    Js 替代
    Js解析json
    回车事件
    js解析XML
    Linux常用基础(三)
    Linux常用基础(二)
    Linux常用基础(一)
  • 原文地址:https://www.cnblogs.com/fzdsy/p/10155262.html
Copyright © 2020-2023  润新知