1.生成目录如图所示:
2.前端引用Ztree:
官方demo:
把zTreeStyle这个目录复制到自己项目的css目录中,复制jquery.ztree.all.min.js文件到自己项目的js目录中:
html文件中引用:
<link rel="stylesheet" href="../../css/zTreeStyle/zTreeStyle.css" />
<script type="text/javascript" src="../../js/jquery.ztree.all.min.js" ></script>
内容部分:
<ul id="treeDemo" class="ztree"></ul>
js部分:
var setting = {
check: {
enable: true,
chkboxType: { "Y": "ps", "N": "ps" }
},
data: {
simpleData: {
enable: true
}
}
};
function mennunetWorking () {
$.ajax({
type:"post",
url:menuneturl,
data:{
token:"15eecbddea044c67b93f40b56fe3882e"
},
success: function(res) {
//console.log("菜单树数据.:"+res);
$.fn.zTree.init($("#treeDemo"), setting, res);
},
error:function() {
alert("失败");
}
});
}
3.后台(java):
目录表数据:
后台返回的数据:
[{
"id": 1,
"pId": 0,
"name": "系统管理",
"open": true,
"checked": null,
"isOpen": true
},
{
"id": 106,
"pId": 1,
"name": "用户管理",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 107,
"pId": 106,
"name": "添加用户",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 108,
"pId": 106,
"name": "修改用户",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 109,
"pId": 106,
"name": "删除用户",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 110,
"pId": 106,
"name": "重置密码",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 111,
"pId": 106,
"name": "冻结用户",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 112,
"pId": 106,
"name": "解除冻结用户",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 113,
"pId": 106,
"name": "分配角色",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 114,
"pId": 1,
"name": "角色管理",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 115,
"pId": 114,
"name": "添加角色",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 116,
"pId": 114,
"name": "修改角色",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 117,
"pId": 114,
"name": "删除角色",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 118,
"pId": 114,
"name": "配置权限",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 119,
"pId": 1,
"name": "菜单管理",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 120,
"pId": 119,
"name": "添加菜单",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 121,
"pId": 119,
"name": "修改菜单",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 122,
"pId": 119,
"name": "删除菜单",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 128,
"pId": 1,
"name": "业务日志",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 130,
"pId": 1,
"name": "监控管理",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 131,
"pId": 1,
"name": "部门管理",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 132,
"pId": 1,
"name": "字典管理",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 133,
"pId": 1,
"name": "登录日志",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 134,
"pId": 128,
"name": "清空日志",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 135,
"pId": 131,
"name": "添加部门",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 136,
"pId": 131,
"name": "修改部门",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 137,
"pId": 131,
"name": "删除部门",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 138,
"pId": 132,
"name": "添加字典",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 139,
"pId": 132,
"name": "修改字典",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 140,
"pId": 132,
"name": "删除字典",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 141,
"pId": 1,
"name": "通知管理",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 142,
"pId": 141,
"name": "添加通知",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 143,
"pId": 141,
"name": "修改通知",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 144,
"pId": 141,
"name": "删除通知",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 145,
"pId": 0,
"name": "通知",
"open": true,
"checked": null,
"isOpen": true
},
{
"id": 148,
"pId": 0,
"name": "代码生成",
"open": true,
"checked": null,
"isOpen": true
},
{
"id": 149,
"pId": 0,
"name": "接口文档",
"open": true,
"checked": null,
"isOpen": true
},
{
"id": 150,
"pId": 119,
"name": "菜单编辑跳转",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 151,
"pId": 119,
"name": "菜单列表",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 152,
"pId": 131,
"name": "修改部门跳转",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 153,
"pId": 131,
"name": "部门列表",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 154,
"pId": 131,
"name": "部门详情",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 155,
"pId": 132,
"name": "修改菜单跳转",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 156,
"pId": 132,
"name": "字典列表",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 157,
"pId": 132,
"name": "字典详情",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 158,
"pId": 128,
"name": "日志列表",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 159,
"pId": 128,
"name": "日志详情",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 160,
"pId": 133,
"name": "清空登录日志",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 161,
"pId": 133,
"name": "登录日志列表",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 162,
"pId": 114,
"name": "修改角色跳转",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 163,
"pId": 114,
"name": "角色分配跳转",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 164,
"pId": 114,
"name": "角色列表",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 165,
"pId": 106,
"name": "分配角色跳转",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 166,
"pId": 106,
"name": "编辑用户跳转",
"open": false,
"checked": null,
"isOpen": false
},
{
"id": 167,
"pId": 106,
"name": "用户列表",
"open": false,
"checked": null,
"isOpen": false
}
]
3.1实体类:
public class Menu {
private Long id;
/**
* 菜单编号
*/
private String code;
/**
* 菜单父编号
*/
private String pcode;
/**
* 当前菜单的所有父菜单编号
*/
private String pcodes;
/**
* 菜单名称
*/
private String name;
/**
* 菜单图标
*/
private String icon;
/**
* url地址
*/
private String url;
/**
* 菜单排序号
*/
private Integer num;
/**
* 菜单层级
*/
private Integer levels;
/**
* 是否是菜单(1:是 0:不是)
*/
private Integer ismenu;
/**
* 备注
*/
private String tips;
/**
* 菜单状态 : 1:启用 0:不启用
*/
private Integer status;
/**
* 是否打开: 1:打开 0:不打开
*/
private Integer isopen;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getPcode() {
return pcode;
}
public void setPcode(String pcode) {
this.pcode = pcode;
}
public String getPcodes() {
return pcodes;
}
public void setPcodes(String pcodes) {
this.pcodes = pcodes;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public Integer getLevels() {
return levels;
}
public void setLevels(Integer levels) {
this.levels = levels;
}
public Integer getIsmenu() {
return ismenu;
}
public void setIsmenu(Integer ismenu) {
this.ismenu = ismenu;
}
public String getTips() {
return tips;
}
public void setTips(String tips) {
this.tips = tips;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getIsopen() {
return isopen;
}
public void setIsopen(Integer isopen) {
this.isopen = isopen;
}
}
3.2dao层:
import com.sqxinxibu.neikanhoutai.node.ZTreeNode;
import java.util.List;
public interface MenuMapper {
/**
* 获取菜单列表树
*/
List<ZTreeNode> menuTreeList();
}
3.3dao层对应的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.sqxinxibu.neikanhoutai.dao.MenuMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.sqxinxibu.neikanhoutai.entity.Menu">
<id column="id" property="id" />
<result column="code" property="code" />
<result column="pcode" property="pcode" />
<result column="pcodes" property="pcodes" />
<result column="name" property="name" />
<result column="icon" property="icon" />
<result column="url" property="url" />
<result column="num" property="num" />
<result column="levels" property="levels" />
<result column="ismenu" property="ismenu" />
<result column="tips" property="tips" />
<result column="status" property="status" />
<result column="isopen" property="isopen" />
</resultMap>
<sql id="Base_Column_List">
id, code, pcode, name, icon, url, num, levels,pcodes,
tips, status,isopen,ismenu
</sql>
<!--查询菜单树-->
<select id="menuTreeList" resultType="com.sqxinxibu.neikanhoutai.node.ZTreeNode">
SELECT
m1.id AS id,
(
CASE
WHEN (m2.id = 0 OR m2.id IS NULL) THEN
0
ELSE
m2.id
END
) AS pId,
m1. NAME
AS NAME,
(
CASE
WHEN (m2.id = 0 OR m2.id IS NULL) THEN
'true'
ELSE
'false'
END
) as isOpen
FROM
sys_menu m1
LEFT join sys_menu m2 ON m1.pcode = m2. CODE
ORDER BY
m1.id ASC
</select>
</mapper>
3.4service层:
package com.sqxinxibu.neikanhoutai.service.Impl;
import com.alibaba.fastjson.JSON;
import com.sqxinxibu.neikanhoutai.dao.MenuDao;
import com.sqxinxibu.neikanhoutai.dao.MenuMapper;
import com.sqxinxibu.neikanhoutai.entity.Menu;
import com.sqxinxibu.neikanhoutai.entity.MenuData;
import com.sqxinxibu.neikanhoutai.node.ZTreeNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
@Component
public class MenuService {
@Resource
private MenuMapper menuMapper;//获取菜单列表树
//查询菜单树
public List<ZTreeNode> menuTreeList(){
List<ZTreeNode> zTreeNodeList=menuMapper.menuTreeList();
System.out.println("获取菜单列表树:"+JSON.toJSONString(zTreeNodeList));
return zTreeNodeList;
}
}
3.5controller层:
import com.sqxinxibu.neikanhoutai.entity.MenuData;
import com.sqxinxibu.neikanhoutai.node.ZTreeNode;
import com.sqxinxibu.neikanhoutai.service.Impl.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
//菜单控制器
@RestController
@RequestMapping("/menu")
public class MenuController {
@Autowired
private MenuService menuService;
//获取菜单列表树
@RequestMapping("/menuTreelist")
public List<ZTreeNode> menuTreeList(){
return menuService.menuTreeList();
}
}