这里主要介绍controller封装ztree参数,具体业务以实际为准,这里controller里封装的数据最好写在service层。
1.前台返回数据的格式
var zNodes =[ { name:"父节点1 - 展开", open:true, children: [ { name:"父节点11 - 折叠", children: [ { name:"叶子节点111"}, { name:"叶子节点112"}, { name:"叶子节点113"}, { name:"叶子节点114"} ]}, { name:"父节点12 - 折叠", children: [ { name:"叶子节点121"}, { name:"叶子节点122"}, { name:"叶子节点123"}, { name:"叶子节点124"} ]}, { name:"父节点13 - 没有子节点", isParent:true} ]}, { name:"父节点2 - 折叠", children: [ { name:"父节点21 - 展开", open:true, children: [ { name:"叶子节点211"}, { name:"叶子节点212"}, { name:"叶子节点213"}, { name:"叶子节点214"} ]}, { name:"父节点22 - 折叠", children: [ { name:"叶子节点221"}, { name:"叶子节点222"}, { name:"叶子节点223"}, { name:"叶子节点224"} ]}, { name:"父节点23 - 折叠", children: [ { name:"叶子节点231"}, { name:"叶子节点232"}, { name:"叶子节点233"}, { name:"叶子节点234"} ]} ]}, { name:"父节点3 - 没有子节点", isParent:true} ];
2.封装的类
package com.stuwork.crowdfunding.bean; import java.util.ArrayList; import java.util.List; public class Permission { private Integer id; private Integer pid; private String name; private String icon; private String url; private boolean open; private boolean checked; private List<Permission> children = new ArrayList<Permission>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getPid() { return pid; } public void setPid(Integer pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon == null ? null : icon.trim(); } public String getUrl() { return url; } public void setUrl(String url) { this.url = url == null ? null : url.trim(); } public boolean isOpen() { return open; } public void setOpen(boolean open) { this.open = open; } public List<Permission> getChildren() { return children; } public void setChildren(List<Permission> children) { this.children = children; } public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } }
package com.stuwork.crowdfunding.util; public class AjaxResult { private boolean success; private String message; private Page page; private Object data; public Page getPage() { return page; } public void setPage(Page page) { this.page = page; } public boolean getSuccess() { return success; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public void setSuccess(boolean success) { this.success = success; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
3.controller几种返回数据格式封装和优化
package com.stuwork.crowdfunding.manager.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.stuwork.crowdfunding.bean.Permission; import com.stuwork.crowdfunding.manager.service.PermissionService; import com.stuwork.crowdfunding.util.AjaxResult; @Controller @RequestMapping("/permission") public class PermissionController { @Autowired private PermissionService permissionService; //最终版方式1 //最终优化版,减少循环的次数 @ResponseBody @RequestMapping("/loadData") public Object loadData(){ AjaxResult result = new AjaxResult(); try { List<Permission> root = new ArrayList<Permission>(); List<Permission> permissionList = permissionService.getAllPermission();//根菜单 Map<Integer,Permission> map = new HashMap<Integer,Permission>(); for(Permission bean :permissionList){ map.put(bean.getId(), bean); } for(Permission bean :permissionList){ Permission children = bean; if(bean.getPid() == 0){ root.add(bean); }else{ Permission parent = map.get(children.getPid()); parent.getChildren().add(children); } } result.setData(root); result.setSuccess(true); } catch (Exception e) { result.setSuccess(false); result.setMessage("许可树加载失败"); e.printStackTrace(); } return result; }
//方式2 @ResponseBody //递归优化 @RequestMapping("/loadData") public Object loadData(){ AjaxResult result = new AjaxResult(); try { List<Permission> root = new ArrayList<Permission>(); List<Permission> permissionList = permissionService.getAllPermission();//根菜单 for(Permission bean :permissionList){ Permission children = bean;//子菜单 if(children.getPid() == 0){ root.add(bean); }else{ for(Permission innerPermission:permissionList){ if(children.getPid() == innerPermission.getId()){ innerPermission.getChildren().add(children); break; } } } } result.setData(root); result.setSuccess(true); } catch (Exception e) { result.setSuccess(false); result.setMessage("许可树加载失败"); e.printStackTrace(); } return result; } //方式3 //递归,解决多个层次 //效率低,多次调用数据库 @ResponseBody @RequestMapping("/loadData") public Object loadData(){ AjaxResult result = new AjaxResult(); try { List<Permission> root = new ArrayList<Permission>(); Permission permission = permissionService.getRootPermission();//根菜单 root.add(permission); getPermissionChildern(permission); result.setData(root); result.setSuccess(true); } catch (Exception e) { result.setSuccess(false); result.setMessage("许可树加载失败"); e.printStackTrace(); } return result; } /** * 递归使用注意事项 * 1.调用自身 * 2.范围要不断缩小 * 3.要有跳出条件 * @param permission */ private void getPermissionChildern(Permission permission){ List<Permission> childrenList = permissionService.getChildrenPermissionByPid(permission.getId()); permission.setChildren(childrenList); for(Permission bean:childrenList){ getPermissionChildern(bean); } } //方式4(这个是demo,没从数据库取数据) @ResponseBody @RequestMapping("/loadData") public Object loadData(){ AjaxResult result = new AjaxResult(); try { Permission permission = new Permission();//父菜单 Permission permission1 = new Permission();//子菜单 Permission permission2 = new Permission();//子菜单 List<Permission> list = new ArrayList<Permission>();//子菜单 List<Permission> root = new ArrayList<Permission>();//根菜单 permission.setName("系统权限菜单"); permission.setOpen(true); permission1.setName("控制面板"); permission2.setName("权限管理"); list.add(permission1); list.add(permission2); permission.setChildren(list); root.add(permission); result.setData(root); result.setSuccess(true); } catch (Exception e) { result.setSuccess(false); result.setMessage("许可树加载失败"); e.printStackTrace(); } return result; }
//方式5 @ResponseBody @RequestMapping("/loadData") public Object loadData(){ AjaxResult result = new AjaxResult(); try { List<Permission> root = new ArrayList<Permission>(); Permission permission = permissionService.getRootPermission();//根菜单 permission.setOpen(true); root.add(permission); List<Permission> childrenList = permissionService.getChildrenPermissionByPid(permission.getId()); permission.setChildren(childrenList); for(Permission bean :childrenList){ bean.setOpen(true); List<Permission> innerChildrenList = permissionService.getChildrenPermissionByPid(bean.getId()); bean.setChildren(innerChildrenList); } result.setData(root); result.setSuccess(true); } catch (Exception e) { result.setSuccess(false); result.setMessage("许可树加载失败"); e.printStackTrace(); } return result; } }
4.mapper文件方法
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.stuwork.crowdfunding.manager.dao.PermissionMapper"> <resultMap id="BaseResultMap" type="Permission"> <id column="id" jdbcType="INTEGER" property="id" /> <result column="pid" jdbcType="INTEGER" property="pid" /> <result column="name" jdbcType="VARCHAR" property="name" /> <result column="icon" jdbcType="VARCHAR" property="icon" /> <result column="url" jdbcType="VARCHAR" property="url" /> </resultMap> <select id="getPermissionByRoleId" resultType="int"> SELECT permissionid FROM t_role_permission WHERE roleid = #{roleid} </select> <select id="getRootPermission" resultMap="BaseResultMap"> SELECT id,pid,icon,url,name FROM t_permission WHERE pid = 0 </select> <select id="getChildrenPermissionByPid" resultMap="BaseResultMap"> SELECT id,pid,icon,url,name FROM t_permission WHERE pid = #{id} </select> <select id="getAlltPermission" resultMap="BaseResultMap"> SELECT id,pid,icon,url,name FROM t_permission </select> </mapper>
5.数据库表数据