layui树形组件使用(tree.render())基于ssm实现功能

一、演示效果
在这里插入图片描述
二、后端返回数据格式
在这里插入图片描述
注意:使用树形组件回显的字段必须有id,title,checked。否则会无数据,并且父节点一定要为false,子节点打勾的为true。

三、前端代码
1.HTML部分

<script type="text/html" id="barDemo">
	<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="setModule"><i class="layui-icon">&#xe620;</i>设置权限</a>
</script>
<!--设置权限-->
<div id="diaSetRight" style="display: none;" title="设置权限" style="width:300px;height:600px; margin: 10px auto;">
	<table id="tabEdit">
		<tr>
			<td>
				<div id="rightTree"></div>
			</td>
		</tr>
		<tr>
			<td style="text-align: center; padding: 10px;">
				<a id="setRole" href="#" class="layui-btn"><i class="layui-icon">&#xe605;</i>保存设置</a>
			</td>
		</tr>
	</table>
</div>

2.js部分

//监听数据行工具栏按钮事件
table.on('tool(test)', function(obj) { //注:tool是工具条事件名,test是table原始容器的属性 lay-filter="对应的值"
	var data = obj.data; //获得当前行数据
	var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
	var tr = obj.tr; //获得当前行 tr 的DOM对象

	if(layEvent === 'setModule') { //设置模块
		arr = [];
		$.post(globalData.server + "roles/GetModulesByRoleIdLayUI", {
			token: globalData.token,
			rolesIds: data.id
		}, function(r) {
			tree.render({
				elem: '#rightTree',
				data: r,
				id: 'roleTreeId',
				showCheckbox: true
			})
			cur_roleId = data.id;
		}, "json");
		//打开设置权限窗口
		setIndex = layer.open({
			type: 1,
			content: $('#diaSetRight'),
			title: "正在设置角色[" + data.name + "]的权限模块",
			area: ['300px', '400px']
		});
	}
});

//给角色设置权限
$("#setRole").click(function() {
	var nodes = tree.getChecked('roleTreeId');
	//字符串拼接基本功,要求手熟
	for(var i = 0; i < nodes.length; i++) {
		getChildenId(nodes[i]); //调用递归的方法来获取所有选中节点的Id
	}
	//调用远程接口保存设置
	$.post(globalData.server + "roles/SetSysRights", {
		parentIds: arr.join(","),
		rId: cur_roleId,
		token: globalData.token
	}, function(r) {
		if(r) {
			layer.msg('保存权限成功!', {
				icon: 1,
				time: 1000
			}, function() {
				layer.close(setIndex); //关闭修改弹出层
				window.top.getMenu();
			});
		} else {
			layer.msg('保存权限失败!', {
				icon: 2,
				time: 1000
			})
		}
	}, "json");
});

//var active={del:3,reload:1,load:2};
$('.demoTable .layui-btn').on('click', function() {
	var type = $(this).data('type');
	active[type] ? active[type].call(this) : '';
});

});
var arr = [];
//递归获取选中节点的Id
function getChildenId(node) {
	if(node != null) {
		arr.push(node.id);
		for(var i = 0; node.children != null && i < node.children.length; i++) {
			getChildenId(node.children[i]);
		}
	}
}

四、后端代码
1.mapper接口

/**
 * 根据角色id查询全部树形<用户设置权限>
 * @param rolesIds List<ModulesTreeNode>
 * @return
 */
List<ModulesTreeNode> selectAllTree(String rolesIds);

/**
 * 移除角色权限
 * @param roleid
 * @param moduleid
 * @return
 */
int deleteByUidAndModuleid(String roleid,String moduleid);
 
 /**
  * 分配角色权限
  * @param id
  * @param roleid
  * @param moduleid
  * @return
  */
int insertByUidAndModuleid(String id,String roleid,String moduleid);

2.service层

/**
 * 根据角色id查询全部树形<用户设置权限>
 * @param rolesIds List<ModulesTreeNode>
 * @return
 */
List<ModulesTreeNode> selectAllTree(String rolesIds);

/**
 * 移除角色权限
 * @param roleid
 * @param moduleid
 * @return
 */
int deleteByUidAndModuleid(String roleid,String moduleid);
 
 /**
  * 分配角色权限
  * @param id
  * @param roleid
  * @param moduleid
  * @return
  */
int insertByUidAndModuleid(String id,String roleid,String moduleid);

3.serviceImpl层

@Override
public List<ModulesTreeNode> selectAllTree(String rolesIds) {
	// TODO Auto-generated method stub
	return modulesMapper.selectAllTree(rolesIds);
}

@Override
public int deleteByUidAndModuleid(String roleid, String moduleid) {
	// TODO Auto-generated method stub
	return rolesModulesMapper.deleteByUidAndModuleid(roleid, moduleid);
}

@Override
public int insertByUidAndModuleid(String id, String roleid, String moduleid) {
	// TODO Auto-generated method stub
	return rolesModulesMapper.insertByUidAndModuleid(id, roleid, moduleid);
}

4.controller层

/**
* 查询所有的权限
* 这里是查询所有的权限模块,然后给夫模块赋予false前台才可以显示树形组件
* @return List
*/
public List<ModulesTreeNode> getRolesTreeNodes(String rolesIds) {
	List<ModulesTreeNode> modulesTreeNodes = modulesService.selectAllTree(rolesIds);
	for (ModulesTreeNode modulesTreeNode : modulesTreeNodes) {
		if (modulesTreeNode.getParentid()==0) {
			modulesTreeNode.setChecked(false);
		}
	}
	return modulesTreeNodes;
}

/**
* 生成模块类型树
* @return List
*/
@RequestMapping("/GetModulesByRoleIdLayUI")
public List<ModulesTreeNode> getRolesTreeNode(String rolesIds) {
	List<ModulesTreeNode> rolesTreeList = this.getRolesTreeNodes(rolesIds);
	List<ModulesTreeNode> rolesTreeNodes = new ArrayList<ModulesTreeNode>();
	for (ModulesTreeNode rolesTreeNode : rolesTreeList) {
		if (rolesTreeNode.getParentid()==0) {
			rolesTreeNodes.add(findChildren(rolesTreeNode, rolesTreeList));
		}
	}
	return rolesTreeNodes;
}

/**
* 查找子类型
* @return List
*/
public ModulesTreeNode findChildren(ModulesTreeNode rolesTreeNode, List<ModulesTreeNode> rolesTreeList) {
	for (ModulesTreeNode item : rolesTreeList) {
		 if (rolesTreeNode.getId()==item.getParentid()) {
			 if(rolesTreeNode.getChildren()==null) {
				 rolesTreeNode.setChildren(new ArrayList<ModulesTreeNode>());
			 } 
			 rolesTreeNode.getChildren().add(findChildren(item,rolesTreeList));
		 } 
	}
	return rolesTreeNode;
}

/**
* 修改角色权限
* 首先先要根据角色id把本身的权限删除,然后在进行添加权限
* @return boolean 
*/
@RequestMapping("/SetSysRights")
@Transactional
public boolean SetSysRights(String parentIds,String rId) {
	//根据rId删除权限
	rolesModulesService.deleteByUidAndModuleid(rId,"");
	if (parentIds != null && !"".equals(parentIds) && parentIds != "") {//parentIds为空则视为取消全部权限
		int flag = 0;
		String[] m = parentIds.split(",");
		for (int i = 0; i < m.length; i++) {
			String id = UUIDUtil.getUUID();
			flag = rolesModulesService.insertByUidAndModuleid(id, rId, m[i]);
		}
		if (flag<=0) {
			return false;
		}
	}
	return true;
}

5.mapper.xml
注:我的数据库设计没有checked字段,所以我在sql里面添加了此字段并赋予boolean值

<select id="selectAllTree" resultType="modulesTreeNode">
	    SELECT
		distinct m.id,
		m. NAME title,
		m.parentid,m.weight,
		CASE
	WHEN m.id IN (
		SELECT
			moduleid
		FROM
			rolemodules
		WHERE
			roleid = #{rolesIds}
	) THEN
		'true'
	ELSE
		'false'
	END checked
	FROM
		modules m
	LEFT JOIN rolemodules rm ON m.Id = rm.moduleid
	ORDER BY
		weight DESC
</select>

<delete id="deleteByUidAndModuleid">
    delete from rolemodules
    where RoleId = #{roleid} 
    <if test="moduleid != null and moduleid != ''">
    	and ModuleId = #{moduleid}
    </if>
</delete>

<insert id="insertByUidAndModuleid">
    insert into rolemodules(Id,RoleId,ModuleId) values(#{id},#{roleid},#{moduleid})
</insert>

到此就结束了!!!!!感谢大家的支持哦!!!!
温馨提示:1.在设计表的时候要设计checked字段,不然就像我一样sql写的比较麻烦
2.我使用了token的拦截,童鞋们可以根据自身情况使用。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐