Display Tag标签下使用checkbox勾选且分页后复选框状态保存

本文介绍如何在使用DisplayTag进行数据分页显示时,实现复选框的状态保存及同步翻页功能。通过在前后端配合下,利用Session保存选中项并在各页间保持一致。

>>>在阅读本文之前请先优先参考《Display tag 的使用》

 

 

本文场景描述:使用display tag标签在做列表的情况下,前置复选框选择功能,在勾选时记住勾选复选框勾选状态,在分页后的复选框状态仍然保持。

目的:数据实现分页显示,不是查询所有的数据,而是每次取固定的条数。而且在每页选中的数据ID都可以保存,一起提交选中的数据,做相应的操作。比如第一 页选中2条,第二页选中3条,提交时是5条,如果返回第一页,这也显示选中的数据,回到第二页,也会显示选中的数据,以此类推,取消选中,翻页几次,无任 何问题;总之,无论选中还是取消,翻页都没有bug;

实现方法:

1、首先进入的是你分页显示数据的页面,在这个action,或者servlet里创建一个session,名字自定义。因为每次翻页都是经 过这个action的,大多都是这样吧,所以要做下判断,第一次进入的时候创建session,而翻页的时候就不在new(新建)了。然后从 session里取出来的map把它循环组成字符串传回页面,放到隐藏域中,做判断用。

代码:

//初始化Table所选项
	private void initCheckedItems(HttpServletRequest request,HttpServletResponse response, Model model){
		boolean isFirstEnter=true;
		if(request.getQueryString()!=null && !"".equals(request.getQueryString())){
	         if(request.getQueryString().contains("-p")){
	        	 isFirstEnter=false;
	         }
		}
		if(isFirstEnter){//判断是否第一次进入该页面[在未点击分页情况下]
			//创建map,用于存放选中的checkbox
			Map  ck_map = new HashMap();
			//存放session,命名为jld_session,注意:每个模块定义用于存放checkbox的session的名字必须不同
			request.getSession().setAttribute("chkd_session", ck_map);
		}
		if(request.getSession().getAttribute("chkd_session")!=null){
			//获取名字为当前模块的session,把session中的值取出来,返回到页面,用于判断哪个checkbox选中了
		   Map map = (Map)request.getSession().getAttribute("chkd_session");
		   String ckIds = "";
		   if(map !=null){
			   Iterator it = map.entrySet().iterator(); 
			   while(it.hasNext()){
				   Map.Entry entry = (Map.Entry) it.next();
				   String value = (String)entry.getValue();
				   if(ckIds.equals("")){
					   ckIds = value;
				   }else{
					   ckIds = ckIds +";"+value;
				   }
			   }
		  }
		   model.addAttribute("ckIds", ckIds);
		}
	}

 

在list所在的action中加入initCheckedItems(request, response, model);方法。

 

2、全选和单选操作,每次点击checkbox的时候,都触发一个js函数,把id传到后台,后台根据前台判断的是选中还是选中之后取消来做相应的 操作,是添加到map中,还是从map中移除,该方法里创建个map,把ID作为键值,ID作为value值,然后循环这个map,把所有ID组成字符串 用“;”分割,ajax返回值就是这个字符串,然后document.getElementById().value=...把这个字符串设在隐藏域 中    代码如下:

 

//全选时触发
function checkAll(){
	if ($("#chkAll:checked").length > 0){
		$("[name=sonChecklist]").attr("checked", "checked");
		$("[name=sonChecklist]").each(function(){
			var id=$(this).attr("id");
			chkSonClick(id);
		}); 
	}else{
		$("[name=sonChecklist]").removeAttr("checked");
	}
}
//单选时触发
function chkSonClick(id){
    var check = document.getElementById(id);
    var a = 1;
    if(check.checked){
    	a = 1;//添加
    }else{
    	a = 0;//取消
    }
    var b = 0;
    $.ajax({
            async: false,
            type: "POST",
            url: "setSubIds.do",
            data:"&id="+id+"&done="+a,
            success: function(msg){
                document.getElementById("ckIds").value = msg;//存到页面隐藏域中
                b = 1;
            }
    });
    if(a==1&&b==1){
    	document.getElementById(id).checked =true;
    }else if(a==0&&b==1){
    	document.getElementById(id).checked =false;
    }
}

3、后台处理传过来的数据,每次处理好数据之后都把数据设在页面的隐藏域中。

@RequestMapping("/setSubIds")
	public String setSubIds(HttpServletRequest request,
			HttpServletResponse response, RedirectAttributes attribute)
			throws Exception {
		System.out.println("----Ajax保存所选的checkbox进入----");
        String id = request.getParameter("id");        //点击checkbox的value值
        String done = request.getParameter("done");    //判断操作,是选中,还是选中之后取消
        //获得此模块所存的用于存储选中id的session,此模块命名为chkd_session,不同模块sessionid不同
        Map map = (Map)request.getSession().getAttribute("chkd_session");
        if(done.equals("1")){
            map.put(id, id);//插入map操作,id作为主键,id作为值,用户覆盖相同的值
        }else if(done.equals("0")){
            map.remove(id);//从map中移除操作
        }
        System.out.println("Map里存的值:"+map.size());
        //覆盖名为chkd_session的session
        request.getSession().setAttribute("chkd_session", map);
        //以下用于ajax返回值操作
        try{
        String ids = "";//要返回页面的字符串
        if(map !=null){
            //把map遍历成字符串
            Iterator it = map.entrySet().iterator();       
            while(it.hasNext()){
                Map.Entry entry = (Map.Entry) it.next();
                String value = (String)entry.getValue();
                //循环第一遍
                if(ids.equals("")){
                    ids = value;
                }else{
                    ids = ids +";"+value;
                }
            }
            }
        //创建servlet
        response.setContentType("text ml;charset=gb2312");
        PrintWriter outs = response.getWriter();
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        outs.print(ids);//打印返回值
    } catch (IOException e) {
        e.printStackTrace();
    }
		return null;
	}


4、在提交的时候获取这个隐藏域的内容,每次翻页都会发这些ID藏在隐藏域中
      判断是否选中:在页面加载之后最后执行:

//初始化选中项
initCheckedItems();
function initCheckedItems(){
	var idd = document.getElementsByName("sonChecklist");//checkbox的name名称,自己定义
	var ids = document.getElementById("ckIds").value;//隐藏域里的所有选中的id,字符串
	var arr = ids.split(";");
	for(var i=0;i<idd.length;i++){
       for(var n=0;n<arr.length;n++){
	       	if(idd[i].value==arr[n]){
				idd[i].checked = true;//如果有匹配的就选中
	       	}
       }
	}
}

 5、如何在display tag标签中嵌入checkbox可供选择。

 

<display:table id="item" name="${itemList}" size="${itemCount}" pagesize="${itemSize}"
	class="table table-bordered table-striped table-hover"
	requestURI="/system/list.do" partialList="true">
	<display:column title="<input  id='chkAll' type='checkbox' name='chkAll'  onclick='checkAll()'/>" class="nowrap">
    	<input type='checkbox' id="${item.id}" name='sonChecklist' value="${item.id}" onclick='chkSonClick(${item.id})'/>
    </display:column>
	<display:column title="名称" property="title" sortable="true"/>
</display:table>

 总结:实现了自己的需求。

             缺点:可能会慢,如果网络不好,因为每次都有请求。

 

 

<template> <div class="role_wrapper"> <div class="conys"> <!-- 搜索过滤区域 --> <div class="search-container"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" class="search-form"> <el-form-item label="Role Name" prop="roleName"> <el-input v-model="queryParams.roleName" placeholder="Enter role name" clearable style="width: 240px" /> </el-form-item> <el-form-item label="Role Able" prop="roleAble"> <el-select v-model="queryParams.roleAble" placeholder="Select role able" clearable> <el-option v-for="item in roleAbleList" :key="item.value" :label="item.desc" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="Create Time" prop="createTime" class="date-picker-item"> <el-date-picker v-model="dateRange" type="daterange" range-separator="-" start-placeholder="Start date" @change="handleDateChange()" end-placeholder="End date" value-format="yyyy-MM-dd HH:mm:ss" style="width: 100%;"> </el-date-picker> </el-form-item> <el-form-item class="button-group"> <el-button type="primary" size="mini" @click="handleQuery">Search</el-button> <el-button size="mini" @click="resetQuery">Reset</el-button> </el-form-item> </el-form> </div> <!-- 细横线 --> <el-row :gutter="10"> <div class="custom-line"></div> </el-row> <!-- 操作按钮区域 --> <div class="operation-buttons"> <el-button type="primary" size="mini" @click="handleAdd">Add</el-button> <el-button size="mini" @click="handleExport">Export</el-button> <el-button type="danger" size="mini" @click="handleDelete" :disabled="selectedRoleIds.length === 0"> Delete </el-button> </div> <!-- 数据表格 --> <div class="role-list"> <el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column label="Role Code" align="center" prop="code" /> <el-table-column label="Role Name" align="center" prop="roleName" :show-overflow-tooltip="true" /> <el-table-column label="Rank" align="center" prop="rank" /> <el-table-column label="Role Able" align="center" prop="roleAble"> <template #default="scope"> <el-tag :type="scope.row.roleAbleDesc === 'yes' ? 'success' : 'danger'"> {{ scope.row.roleAbleDesc }} </el-tag> </template> </el-table-column> <el-table-column label="Data Scope" align="center" prop="dataScopeDesc" :show-overflow-tooltip="true" /> <el-table-column label="Remark" align="center" prop="remark" :show-overflow-tooltip="true" /> <el-table-column label="Create Time" align="center" prop="createTime" width="180" /> <el-table-column label="Operate" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-button size="mini" type="text" icon="el-icon-edit" @click="handleEdit(scope.row)"> </el-button> <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)"> </el-button> <el-button size="mini" type="text" icon="el-icon-lock" @click="handlePermission(scope.row)"> </el-button> <el-button size="mini" type="text" icon="el-icon-user" @click="handleUsers(scope.row)"> </el-button> </template> </el-table-column> </el-table> </div> <!-- 分页控件 --> <div class="pagination-block"> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page.sync="currentPage" :page-size="pageSize" layout="total, prev, pager, next" :total="total"> </el-pagination> </div> </div> <!-- 添加/编辑角色抽屉 - 60%大小 --> <el-drawer title="" :visible.sync="drawerVisible" :with-header="false" size="60%"> <div class="drawerContent"> <div class="drawerHeader"> <div style="display: flex; align-items: center"> <i style="font-size: 30px; margin-right: 5px; cursor: pointer" class="el-icon-close" @click="drawerVisible = false"></i> <span>{{ isEdit ? 'Edit Role' : 'Add Role' }}</span> </div> </div> <div class="form-container"> <el-form :model="roleForm" ref="roleForm" :rules="rules" label-width="120px"> <!-- 第一行:RoleCode 和 RoleName 并排 --> <el-row :gutter="20" class="form-row"> <el-col :span="12"> <el-form-item label="Role Code" prop="code"> <el-input v-model="roleForm.code" placeholder="Enter role code" :disabled="isEdit"></el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="Role Name" prop="roleName"> <el-input v-model="roleForm.roleName" placeholder="Enter role name"></el-input> </el-form-item> </el-col> </el-row> <!-- 第二行:Rank 和 Role Able 并排 --> <el-row :gutter="20" class="form-row"> <el-col :span="12"> <el-form-item label="Rank" prop="rank"> <el-input v-model="roleForm.rank" placeholder="Enter rank"></el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="Role Able" prop="roleAble"> <el-select v-model="roleForm.roleAble" placeholder="Select role able"> <el-option value="YES" label="YES"></el-option> <el-option value="NO" label="NO"></el-option> </el-select> </el-form-item> </el-col> </el-row> <!-- 第三行:Comment 单独一行 --> <el-row class="form-row"> <el-col :span="24"> <el-form-item label="Comment" prop="remark"> <el-input v-model="roleForm.remark" placeholder="Enter comment" type="textarea" rows="3"></el-input> </el-form-item> </el-col> </el-row> <!-- 第四行:Menu Permissions 文字 --> <el-row class="form-row"> <el-col :span="24"> <el-form-item class="menu-permission-label"> <label>Menu Permissions</label> <div class="permission-legend"> <span class="permission-item"><i class="el-icon-check" style="color: #409EFF;"></i> 查看</span> <span class="permission-item"><i class="el-icon-circle-plus" style="color: #67C23A;"></i> 新增</span> <span class="permission-item"><i class="el-icon-edit" style="color: #E6A23C;"></i> 编辑</span> <span class="permission-item"><i class="el-icon-delete" style="color: #F56C6C;"></i> 删除</span> </div> </el-form-item> </el-col> </el-row> <!-- 第五行:Tree 树形控件 - 带增删改查权限 --> <el-row class="form-row tree-row"> <el-col :span="24"> <div class="tree-container"> <div v-if="menuPermissionsLoading" class="debug-info">Loading menu permissions...</div> <div v-if="!menuPermissionsLoading && (!menuPermissions || menuPermissions.length === 0)" class="debug-info"> No menu permission data available </div> <el-tree v-loading="menuPermissionsLoading" :data="menuPermissions" node-key="id" ref="permissionTree" :props="menuPermissionProps" :expand-on-click-node="false" :default-expand-all="true"> <template #default="{ node, data }"> <div class="tree-node-content"> <span class="tree-node-label level-${node.level}" :title="getNodeLabel(data)"> {{ getNodeLabel(data) }} </span> <div class="permission-checkboxes"> <el-checkbox v-model="data.permissions.query" @change="handlePermissionChange(data, 'query', $event)" size="mini"> <i class="el-icon-check" style="color: #409EFF;"></i> 查看 </el-checkbox> <el-checkbox v-model="data.permissions.add" @change="handlePermissionChange(data, 'add', $event)" size="mini"> <i class="el-icon-circle-plus" style="color: #67C23A;"></i> 新增 </el-checkbox> <el-checkbox v-model="data.permissions.update" @change="handlePermissionChange(data, 'update', $event)" size="mini"> <i class="el-icon-edit" style="color: #E6A23C;"></i> 编辑 </el-checkbox> <el-checkbox v-model="data.permissions.delete" @change="handlePermissionChange(data, 'delete', $event)" size="mini"> <i class="el-icon-delete" style="color: #F56C6C;"></i> 删除 </el-checkbox> </div> </div> </template> </el-tree> </div> </el-col> </el-row> </el-form> </div> <div class="drawer-footer"> <el-button @click="drawerVisible = false">Cancel</el-button> <el-button type="primary" @click="submitForm">Save</el-button> </div> </div> </el-drawer> <!-- 数据权限抽屉 - 60%大小 --> <el-drawer title="" :visible.sync="dataPermissionDrawerVisible" :with-header="false" size="60%"> <div class="drawerContent"> <div class="drawerHeader"> <div style="display: flex; align-items: center"> <i style="font-size: 30px; margin-right: 5px; cursor: pointer" class="el-icon-close" @click="dataPermissionDrawerVisible = false"></i> <span>Data Permissions</span> </div> </div> <div class="form-container"> <el-form :model="dataPermissionForm" ref="dataPermissionForm" label-width="140px"> <!-- 第一行:RoleName 和 Extend of Competence 并排 --> <el-row :gutter="20" class="form-row"> <el-col :span="12"> <el-form-item label="Role Name"> <el-input v-model="dataPermissionForm.roleName" placeholder="Role name" disabled></el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="Extend of Competence" class="no-wrap-label"> <el-select v-model="dataPermissionForm.competence" placeholder="Select extend of competence" @change="handleCompetenceChange"> <el-option value="all" label="All Data Permissions"></el-option> <el-option value="personal" label="Personal Data Permissions"></el-option> <el-option value="custom" label="Custom Data Permissions"></el-option> </el-select> </el-form-item> </el-col> </el-row> <!-- 第二行:Data Permissions 文字 --> <el-row class="form-row" v-if="showDataPermissionTree"> <el-col :span="24"> <el-form-item class="menu-permission-label"> <label>Data Permissions</label> </el-form-item> </el-col> </el-row> <!-- 第三行:Data Permissions 树形控件 - 仅当选择Custom时显示 --> <el-row class="form-row tree-row" v-if="showDataPermissionTree"> <el-col :span="24"> <div class="tree-container"> <div v-if="dataPermissions.length === 0" class="debug-info"> No data permission data available </div> <el-tree :data="dataPermissions" show-checkbox node-key="id" ref="dataPermissionTree" :props="defaultProps" @check-change="handleDataPermissionCheckChange" :default-expand-all="true"> <template #default="{ node, data }"> <span class="tree-node-label level-${node.level}" :title="data.label || 'Unnamed Node'"> {{ data.label || 'Unnamed Node' }} </span> </template> </el-tree> </div> </el-col> </el-row> </el-form> </div> <div class="drawer-footer"> <el-button @click="dataPermissionDrawerVisible = false">Cancel</el-button> <el-button type="primary" @click="submitDataPermission">Save</el-button> </div> </div> </el-drawer> </div> </template> <script> import objurl from "@/common/interface/url.js"; import objaxios from "axios"; import objstorage from "@/common/localstorage/storage.js"; import moment from 'moment-timezone'; export default { components: {}, data() { return { // 加载状态 loading: false, // 菜单权限加载状态 menuPermissionsLoading: false, // 角色列表数据 roleList: [], // 选中的角色ID selectedRoleIds: [], // 查询参数 queryParams: { endCreateTime: "", pageNum: 1, pageSize: 10, roleAble: "", roleName: "", startCreateTime: "" }, // 分页参数 currentPage: 1, pageSize: 10, total: 0, // 日期范围 dateRange: [], // Role Able列表 roleAbleList: [ { desc: 'YES', value: "YES" }, { desc: 'NO', value: "NO" } ], // 抽屉显示状态 drawerVisible: false, // 数据权限抽屉显示状态 dataPermissionDrawerVisible: false, // 是否编辑模式 isEdit: false, // 角色表单数据 roleForm: { id: '', code: '', roleName: '', rank: '', roleAble: 'YES', remark: '', // 权限细分存储 - 确保初始化为数组 permissions: { query: [], add: [], update: [], delete: [] }, dataScope: 'ALL', locationGroupIdList: [] }, // 数据权限表单数据 dataPermissionForm: { roleId: '', roleName: '', competence: '', dataPermissions: [] }, // 控制是否显示数据权限树形控件 showDataPermissionTree: false, // 菜单权限树形数据(从接口加载) menuPermissions: [], // 数据权限树形数据 dataPermissions: [ { id: 1, label: 'User Data', children: [ { id: 11, label: 'Basic Information' }, { id: 12, label: 'Contact Details' }, { id: 13, label: 'Activity Logs' } ] }, { id: 2, label: 'Content Data', children: [ { id: 21, label: 'Published Content' }, { id: 22, label: 'Draft Content' }, { id: 23, label: 'Archived Content' } ] } ], // 树形控件配置 defaultProps: { children: 'children', label: 'label' }, // 菜单权限树形控件配置 menuPermissionProps: { children: 'children', label: 'name' }, // 表单验证规则 rules: { code: [ { required: true, message: 'Please enter role code', trigger: 'blur' } ], roleName: [ { required: true, message: 'Please enter role name', trigger: 'blur' } ], rank: [ { required: true, message: 'Please enter rank', trigger: 'blur' }, { validator: (rule, value, callback) => { if (/^[0-9]+$/.test(value) || typeof value === 'number' && !isNaN(value)) { callback(); } else { callback(new Error('Rank must be a number')); } }, trigger: 'blur' } ], roleAble: [ { required: true, message: 'Please select role able', trigger: 'change' } ] } }; }, methods: { // 获取节点标签 getNodeLabel(data) { return data.label || data.name || data.path || `Node ${data.id}`; }, // 将扁平数据转换为树形结构 buildTree(data) { if (!Array.isArray(data)) { console.warn('Invalid data format for building tree:', data); return []; } const map = {}; const tree = []; data.forEach(item => { if (!item || typeof item !== 'object') { console.warn('Invalid item in tree data:', item); return; } // 确保每个节点都有完整的权限结构和权限码 const nodeData = { ...item, id: item.id || Date.now() + Math.random(), name: item.name || item.path || `Node ${item.id || Date.now()}`, permissions: { query: false, add: false, update: false, delete: false }, // 确保权限码字段存在,避免undefined queryPermissionCode: item.queryPermissionCode || item.queryCode || '', addPermissionCode: item.addPermissionCode || item.addCode || '', updatePermissionCode: item.updatePermissionCode || item.updateCode || '', deletePermissionCode: item.deletePermissionCode || item.deleteCode || '', children: item.children || [] }; map[nodeData.id] = nodeData; }); data.forEach(item => { if (!item || typeof item !== 'object') return; const node = map[item.id]; if (!node) return; const parentId = item.parentId !== undefined && item.parentId !== null ? item.parentId : 0; if (parentId === 0 || parentId === null || parentId === undefined) { tree.push(node); } else { const parentNode = map[parentId]; if (parentNode) { parentNode.children.push(node); } else { tree.push(node); } } }); return tree; }, // 级联选择所有子节点权限 cascadeSelectChildren(node, permissionType) { if (!node || !node.children || node.children.length === 0) { return; } node.children.forEach(child => { // 强制设置子节点权限状态 child.permissions[permissionType] = true; // 获取子节点权限码 const permissionCode = child[`${permissionType}PermissionCode`]; // 确保权限码有效未被添加 if (permissionCode && permissionCode.trim() !== '') { // 检查是否已存在,不存在则添加 if (!this.roleForm.permissions[permissionType].includes(permissionCode)) { this.roleForm.permissions[permissionType].push(permissionCode); console.log(`Added child permission ${permissionType}: ${permissionCode}`); } } // 递归处理更深层级的子节点 this.cascadeSelectChildren(child, permissionType); }); }, // 级联取消所有子节点权限 cascadeDeselectChildren(node, permissionType) { if (!node || !node.children || node.children.length === 0) { return; } node.children.forEach(child => { // 强制取消子节点权限状态 child.permissions[permissionType] = false; // 获取子节点权限码 const permissionCode = child[`${permissionType}PermissionCode`]; // 从权限数组中移除 if (permissionCode && permissionCode.trim() !== '') { this.roleForm.permissions[permissionType] = this.roleForm.permissions[permissionType].filter( code => code !== permissionCode ); console.log(`Removed child permission ${permissionType}: ${permissionCode}`); } // 递归处理更深层级的子节点 this.cascadeDeselectChildren(child, permissionType); }); }, // 处理权限变化 - 核心修复方法 handlePermissionChange(node, permissionType, value) { // 直接使用传入的node对象,避免再次查找 if (!node) { console.warn('Node is undefined'); return; } // 更新节点的权限状态 node.permissions[permissionType] = value; // 获取当前节点的权限码 const permissionCode = node[`${permissionType}PermissionCode`]; console.log(`Processing ${permissionType} permission for node ${node.id}:`, { value, permissionCode, currentPermissions: [...this.roleForm.permissions[permissionType]] }); // 验证权限码是否有效 const isValidCode = permissionCode && typeof permissionCode === 'string' && permissionCode.trim() !== ''; if (value) { // 勾选状态:添加权限码 if (isValidCode) { // 确保权限码不存在才添加 if (!this.roleForm.permissions[permissionType].includes(permissionCode)) { this.roleForm.permissions[permissionType].push(permissionCode); console.log(`Added ${permissionType} permission: ${permissionCode}`); } } else { console.warn(`Invalid ${permissionType} permission code for node ${node.id}:`, permissionCode); } // 级联选择子节点(如果是一级菜单) if (node.level === 1) { this.cascadeSelectChildren(node, permissionType); } } else { // 取消勾选:移除权限码 if (isValidCode) { const initialLength = this.roleForm.permissions[permissionType].length; this.roleForm.permissions[permissionType] = this.roleForm.permissions[permissionType].filter( code => code !== permissionCode ); if (this.roleForm.permissions[permissionType].length < initialLength) { console.log(`Removed ${permissionType} permission: ${permissionCode}`); } } // 级联取消子节点(如果是一级菜单) if (node.level === 1) { this.cascadeDeselectChildren(node, permissionType); } } // 输出当前权限数组状态,用于调试 console.log(`Current ${permissionType} permissions:`, [...this.roleForm.permissions[permissionType]]); }, // 递归设置节点层级 setNodeLevels(nodes, level = 1) { nodes.forEach(node => { node.level = level; // 明确设置节点层级 if (node.children && node.children.length) { this.setNodeLevels(node.children, level + 1); } }); }, // 新增角色接口调用 systemroleinsert(roleData) { var _this = this; this.loading = true; // 设置请求头 objaxios.defaults.headers.common["Authorization"] = objstorage.get("userinfo").tokenHead + objstorage.get("userinfo").token; // 处理权限编码 const queryPermissions = roleData.permissions.query.filter(code => code && code.trim() !== ''); const addPermissions = roleData.permissions.add.filter(code => code && code.trim() !== ''); const updatePermissions = roleData.permissions.update.filter(code => code && code.trim() !== ''); const deletePermissions = roleData.permissions.delete.filter(code => code && code.trim() !== ''); // 拼接权限编码字符串 const queryPermissionCode = queryPermissions.join(','); const addPermissionCode = addPermissions.join(','); const updatePermissionCode = updatePermissions.join(','); const deletePermissionCode = deletePermissions.join(','); const applicationPermissionCodes = [...queryPermissions, ...addPermissions, ...updatePermissions, ...deletePermissions].join(','); console.log('Submitting permissions:', { queryPermissionCode, addPermissionCode, updatePermissionCode, deletePermissionCode }); // 构建请求参数 const requestData = { addPermissionCode: addPermissionCode, applicationPermissionCodes: applicationPermissionCodes, code: roleData.code, dataScope: roleData.dataScope || 'ALL', deletePermissionCode: deletePermissionCode, id: 0, locationGroupIdList: roleData.locationGroupIdList || [], queryPermissionCode: queryPermissionCode, rank: Number(roleData.rank) || 0, remark: roleData.remark || '', roleAble: roleData.roleAble || 'NO', roleName: roleData.roleName, updatePermissionCode: updatePermissionCode }; console.log("requestData") console.log(requestData) return objaxios .post(objurl.systemroleinsert, requestData) .then(function (res) { _this.loading = false; if (res.data.code === "200") { _this.$message.success('Role created successfully'); _this.drawerVisible = false; _this.getRoleList(); } else if (res.data.code === 2) { _this.$message.error(res.data.message); objstorage.remove("userinfo"); _this.$router.replace("/"); } else { _this.$message.error(res.data.message || 'Failed to create role'); } }) .catch(function (error) { _this.loading = false; console.error('Error creating role:', error); _this.$message.error('Network error, please try again later'); }); }, // 获取菜单权限列表 pagerouteall(){ var _this = this; this.menuPermissionsLoading = true; objaxios.defaults.headers.common["Authorization"] = objstorage.get("userinfo").tokenHead + objstorage.get("userinfo").token; objaxios .get(objurl.pagerouteall) .then(function (res) { _this.menuPermissionsLoading = false; if (res.data.code === "200") { _this.menuPermissions = _this.buildTree(res.data.data || []); // 设置节点层级 _this.setNodeLevels(_this.menuPermissions); console.log('Menu permissions loaded:', _this.menuPermissions); } else if (res.data.code === 2) { _this.$message.error(res.data.message); objstorage.remove("userinfo"); _this.$router.replace("/"); } else { _this.$message.error(res.data.message || 'Failed to load menu permissions'); _this.menuPermissions = []; } }) .catch(function (error) { _this.menuPermissionsLoading = false; console.error('Error fetching menu permissions:', error); _this.$message.error('Network error, please try again later'); _this.menuPermissions = []; }); }, // 调用接口获取角色列表 systemrolepage() { var _this = this; this.loading = true; objaxios.defaults.headers.common["Authorization"] = objstorage.get("userinfo").tokenHead + objstorage.get("userinfo").token; objaxios .post(objurl.systemrolepage, this.queryParams) .then(function (res) { _this.loading = false; if (res.data.code === "200") { _this.roleList = res.data.data.list || []; _this.total = parseInt(res.data.data.total) || 0; _this.currentPage = res.data.data.pageNum || 1; _this.pageSize = res.data.data.pageSize || 10; } else if (res.data.code === 2) { _this.$message.error(res.data.message); objstorage.remove("userinfo"); _this.$router.replace("/"); } else { _this.$message.error(res.data.message || 'Failed to load role list'); } }) .catch(function (error) { _this.loading = false; console.error('Error loading role list:', error); _this.$message.error('Network error, please try again later'); }); }, // 日期范围变化 handleDateChange() { this.queryParams.startCreateTime = this.dateRange && this.dateRange[0] ? this.dateRange[0] : ""; this.queryParams.endCreateTime = this.dateRange && this.dateRange[1] ? this.dateRange[1] : ""; }, // 查询角色列表 getRoleList() { this.systemrolepage(); }, // 搜索按钮操作 handleQuery() { this.queryParams.pageNum = 1; this.getRoleList(); }, // 重置按钮操作 resetQuery() { this.$refs.queryForm.resetFields(); this.dateRange = []; this.queryParams = { endCreateTime: "", pageNum: 1, pageSize: 10, roleAble: "", roleName: "", startCreateTime: "" }; this.getRoleList(); }, // 处理选择变化 handleSelectionChange(selection) { this.selectedRoleIds = selection.map(item => item.id); }, // 分页大小变化 handleSizeChange(val) { this.pageSize = val; this.queryParams.pageSize = val; this.queryParams.pageNum = 1; this.getRoleList(); }, // 当前页变化 handleCurrentChange(val) { this.currentPage = val; this.queryParams.pageNum = val; this.getRoleList(); }, // 添加角色 handleAdd() { if (this.menuPermissionsLoading) { this.$message.info('Permission data is loading, please wait...'); return; } this.isEdit = false; // 重置角色表单,确保权限数组为空数组 this.roleForm = { id: '', code: '', roleName: '', rank: '', roleAble: 'YES', remark: '', permissions: { query: [], add: [], update: [], delete: [] }, dataScope: 'ALL', locationGroupIdList: [] }; this.$nextTick(() => { if (this.menuPermissions.length) { this.resetPermissionTree(this.menuPermissions); } }); this.drawerVisible = true; }, // 重置权限树 resetPermissionTree(nodes) { nodes.forEach(node => { node.permissions = { query: false, add: false, update: false, delete: false }; if (node.children && node.children.length) { this.resetPermissionTree(node.children); } }); }, // 编辑角色 handleEdit(row) { this.isEdit = true; this.roleForm = { id: row.id, code: row.code || '', roleName: row.roleName || '', rank: row.rank || '', roleAble: row.roleAble || 'YES', remark: row.remark || '', permissions: { query: row.queryPermissionCode ? row.queryPermissionCode.split(',').filter(Boolean) : [], add: row.addPermissionCode ? row.addPermissionCode.split(',').filter(Boolean) : [], update: row.updatePermissionCode ? row.updatePermissionCode.split(',').filter(Boolean) : [], delete: row.deletePermissionCode ? row.deletePermissionCode.split(',').filter(Boolean) : [] }, dataScope: row.dataScope || 'ALL', locationGroupIdList: row.locationGroupIdList || [] }; this.$nextTick(() => { this.setPermissionTreeState(this.menuPermissions); }); this.drawerVisible = true; }, // 设置权限树状态 setPermissionTreeState(nodes) { nodes.forEach(node => { node.permissions.query = this.roleForm.permissions.query.includes(node.queryPermissionCode); node.permissions.add = this.roleForm.permissions.add.includes(node.addPermissionCode); node.permissions.update = this.roleForm.permissions.update.includes(node.updatePermissionCode); node.permissions.delete = this.roleForm.permissions.delete.includes(node.deletePermissionCode); if (node.children && node.children.length) { this.setPermissionTreeState(node.children); } }); }, // 查看角色详情 handleDetail(row) { const roleData = JSON.stringify(row); this.$router.push({ path: "/RoleDetails", query: { roleData: roleData } }); }, // 角色权限设置 handlePermission(row) { this.dataPermissionForm = { roleId: row.id, roleName: row.roleName || '', competence: this.getCompetenceValue(row.dataScopeValue), dataPermissions: row.dataPermissions || [] }; this.showDataPermissionTree = this.dataPermissionForm.competence === 'custom'; this.$nextTick(() => { if (this.$refs.dataPermissionTree && row.dataPermissions) { this.$refs.dataPermissionTree.setCheckedKeys(row.dataPermissions); } }); this.dataPermissionDrawerVisible = true; }, // 将数据范围值转换为对应的competence值 getCompetenceValue(dataScopeValue) { switch(dataScopeValue) { case 1: return 'all'; case 3: return 'personal'; default: return 'custom'; } }, // 处理权限范围变化 handleCompetenceChange(value) { this.showDataPermissionTree = value === 'custom'; if (value !== 'custom') { this.dataPermissionForm.dataPermissions = []; if (this.$refs.dataPermissionTree) { this.$refs.dataPermissionTree.setCheckedKeys([]); } } }, // 处理数据权限选择变化 handleDataPermissionCheckChange() { this.dataPermissionForm.dataPermissions = this.$refs.dataPermissionTree.getCheckedKeys(true); }, // 角色用户管理 handleUsers(row) { this.$router.push({ path: "/AssignUsers", query: { roleId: row.id, roleName: row.roleName } }); }, // 导出角色列表 handleExport() { this.$message.info('Export functionality would download role list here'); }, // 删除选中角色 handleDelete() { this.$confirm('Are you sure you want to delete the selected roles?', 'Warning', { confirmButtonText: 'OK', cancelButtonText: 'Cancel', type: 'warning' }).then(() => { this.roleList = this.roleList.filter(role => !this.selectedRoleIds.includes(role.id)); this.total = this.roleList.length; this.selectedRoleIds = []; this.$message.success('Deletion successful'); }).catch(() => { this.$message.info('Deletion cancelled'); }); }, // 提交角色表单 submitForm() { this.$refs.roleForm.validate((valid) => { if (valid) { console.log('Final permissions before submit:', { ...this.roleForm.permissions }); this.roleForm.rank = Number(this.roleForm.rank) || 0; if (this.isEdit) { const index = this.roleList.findIndex(role => role.id === this.roleForm.id); if (index !== -1) { this.roleList.splice(index, 1, { ...this.roleList[index], ...this.roleForm, queryPermissionCode: this.roleForm.permissions.query.filter(Boolean).join(','), addPermissionCode: this.roleForm.permissions.add.filter(Boolean).join(','), updatePermissionCode: this.roleForm.permissions.update.filter(Boolean).join(','), deletePermissionCode: this.roleForm.permissions.delete.filter(Boolean).join(',') }); this.$message.success('Update successful'); } this.drawerVisible = false; } else { this.systemroleinsert(this.roleForm); } } else { return false; } }); }, // 提交数据权限表单 submitDataPermission() { const index = this.roleList.findIndex(role => role.id === this.dataPermissionForm.roleId); if (index !== -1) { if (this.showDataPermissionTree) { this.dataPermissionForm.dataPermissions = this.$refs.dataPermissionTree.getCheckedKeys(true); } let dataScopeValue = 2; if (this.dataPermissionForm.competence === 'all') { dataScopeValue = 1; } else if (this.dataPermissionForm.competence === 'personal') { dataScopeValue = 3; } this.roleList[index] = { ...this.roleList[index], dataPermissions: this.dataPermissionForm.dataPermissions, competence: this.dataPermissionForm.competence, dataScopeValue, dataScopeDesc: this.getCompetenceDesc(dataScopeValue) }; this.$message.success('Data permissions updated successfully'); this.dataPermissionDrawerVisible = false; } }, // 获取权限范围描述 getCompetenceDesc(value) { switch(value) { case 1: return "所有部门"; case 3: return "本人部门"; default: return "自定义"; } } }, created() { this.getRoleList(); this.pagerouteall(); } }; </script> <style lang='stylus' rel='stylesheet/stylus'> /* 样式部分与之前保持一致 */ html, body { overflow-x: hidden; margin: 0; padding: 0; } .role_wrapper { flex: 1; width: 100%; min-width: 1100px; .conys { height: 100%; width: 100%; position: relative; padding: 15px; box-sizing: border-box; overflow-x: visible; } .search-container { width: 100%; overflow: visible; .search-form { display: flex; align-items: center; flex-wrap: nowrap; width: 100%; .el-form-item { margin-bottom: 0 !important; margin-right: 10px; display: flex; align-items: center; } .date-picker-item { min-width: 300px; } .button-group { margin-left: auto; margin-right: 0; } } } .operation-buttons { margin: 15px 0; display: flex; gap: 10px; flex-wrap: wrap; } .role-list { margin-top: 10px; width: 100%; overflow-x: visible; } .pagination-block { display: flex; justify-content: flex-end; margin-top: 15px; padding-right: 10px; } .custom-line { height: 2px; background: #ddd; width: 100%; margin: 15px 0; } .drawerContent { padding: 20px; height: 100%; box-sizing: border-box; position: relative; overflow-y: auto; overflow-x: hidden; } .drawerHeader { margin-bottom: 15px; padding-bottom: 8px; border-bottom: 1px solid #eee; span { font-size: 18px; font-weight: bold; } } .form-container { width: 100%; padding-right: 10px; box-sizing: border-box; } .form-row { margin-bottom: 12px; } .menu-permission-label { .el-form-item__label { float: none; display: inline-block; white-space: nowrap; padding-right: 0; margin-bottom: 5px; } .el-form-item__content { margin-left: 0 !important; } } .permission-legend { margin-left: 8px; .permission-item { margin-right: 12px; font-size: 11px; display: inline-flex; align-items: center; i { margin-right: 2px; } } } .no-wrap-label { .el-form-item__label { white-space: nowrap; width: auto !important; padding-right: 10px; } } .tree-row { margin-top: -15px; padding-left: 140px; box-sizing: border-box; } .tree-container { border: 1px solid #e4e7ed; border-radius: 4px; padding: 10px; max-height: 320px; overflow-y: auto; width: 100%; box-sizing: border-box; } .tree-node-content { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 6px 0; flex-wrap: wrap; } .tree-node-label { margin-right: 10px; vertical-align: middle; flex: 1; min-width: 150px; white-space: normal; word-wrap: break-word; padding-left: 5px; line-height: 1.5; } .level-1 { font-weight: bold; font-size: 15px; color: #303133; } .level-2 { font-weight: 500; font-size: 14px; color: #4E5969; } .level-3, .level-4 { font-size: 13px; color: #606266; } .permission-checkboxes { display: inline-block; vertical-align: middle; white-space: nowrap; min-width: 180px; .el-checkbox { margin-right: 8px; margin-bottom: 2px; font-size: 12px; i { margin-right: 2px; font-size: 12px; } } } .drawer-footer { position: absolute; bottom: 20px; right: 20px; display: flex; gap: 10px; .el-button { min-width: 80px; } } .debug-info { color: #666; padding: 10px; text-align: center; font-style: italic; border: 1px dashed #ccc; margin-bottom: 10px; } } .el-table { width: 100%; overflow-x: visible; } .el-date-editor--daterange { width: 100% !important; } .el-form-item__content { align-items: center; } .el-form-item__label { padding-right: 10px; width: 120px !important; } .el-form[label-width="140px"] .el-form-item__label { width: 140px !important; } .el-tree-node__content { height: auto !important; padding: 2px 0 !important; width: 100% !important; } .el-tree { width: 100% !important; overflow-x: hidden !important; } .el-tree-node { white-space: normal !important; } .el-drawer { overflow-x: hidden !important; } </style> 新增弹窗功能内,选中了权限(增删改查)。但是queryPermissionCode等都是空。给出修复后的全部代码。不要省略。以vue格式给出,不要html格式
最新发布
09-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值