简单左侧二级树形菜单

使用:SpringBoot,Mybatis,thymeleaf

简单的二级菜单,效果图:


数据库菜单脚本

create table `gra_menu` (
	`menuId` int (10),
	`name` varchar (30),
	`parentId` varchar (30),
	`url` varchar (300),
	`icon` varchar (30),
	`menuOrder` varchar (30),
	`menuLevel` varchar (30)
); 
insert into `gra_menu` (`menuId`, `name`, `parentId`, `url`, `icon`, `menuOrder`, `menuLevel`) values('1','功能菜单1',NULL,'',NULL,'0','1');
insert into `gra_menu` (`menuId`, `name`, `parentId`, `url`, `icon`, `menuOrder`, `menuLevel`) values('2','天气预报','1','/invoice',NULL,'0','2');
insert into `gra_menu` (`menuId`, `name`, `parentId`, `url`, `icon`, `menuOrder`, `menuLevel`) values('3','在线聊天室','1','/index',NULL,'1','2');
insert into `gra_menu` (`menuId`, `name`, `parentId`, `url`, `icon`, `menuOrder`, `menuLevel`) values('4','视频播放','1',NULL,NULL,'2','2');
insert into `gra_menu` (`menuId`, `name`, `parentId`, `url`, `icon`, `menuOrder`, `menuLevel`) values('5','相册','1','/photoalbum',NULL,'3','2');
insert into `gra_menu` (`menuId`, `name`, `parentId`, `url`, `icon`, `menuOrder`, `menuLevel`) values('6','飞机',NULL,NULL,NULL,'1','1');
insert into `gra_menu` (`menuId`, `name`, `parentId`, `url`, `icon`, `menuOrder`, `menuLevel`) values('7','客机','6',NULL,NULL,'1','2');
insert into `gra_menu` (`menuId`, `name`, `parentId`, `url`, `icon`, `menuOrder`, `menuLevel`) values('8','战斗机','6',NULL,NULL,'2','2');
insert into `gra_menu` (`menuId`, `name`, `parentId`, `url`, `icon`, `menuOrder`, `menuLevel`) values('9','运输机','6',NULL,NULL,'3','2');

创建Menu实体类

package com.damionew.model;

import java.util.List;

public class Menu {
	//菜单ID
	private String menuId;
	//菜单名称
	private String name;
	//父菜单ID
	private String parentId;
	//菜单url
	private String url;
	//菜单图标
	private String icon;
	//菜单顺序
	private int menuOrder;
	//子菜单
	private List<Menu> childMenus;
	
	public String getMenuId() {
		return menuId;
	}
	public void setMenuId(String menuId) {
		this.menuId = menuId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getParentId() {
		return parentId;
	}
	public void setParentId(String parentId) {
		this.parentId = parentId;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getIcon() {
		return icon;
	}
	public void setIcon(String icon) {
		this.icon = icon;
	}
 
	public int getMenuOrder() {
		return menuOrder;
	}
	public void setMenuOrder(int menuOrder) {
		this.menuOrder = menuOrder;
	}
	public List<Menu> getChildMenus() {
		return childMenus;
	}
	public void setChildMenus(List<Menu> childMenus) {
		this.childMenus = childMenus;
	}
	
	
}

重要的是List<Menu> childMenus;

MyBatis写两个SQL分别查询父菜单和子菜单

<?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.damionew.mapper.MenuMapper">
	<select id="parentMenu" resultType="com.damionew.model.Menu">
		SELECT * FROM gra_menu WHERE menuLevel = "1" order by menuOrder
	</select>
	
	<select id="childMenu" resultType="com.damionew.model.Menu">
		SELECT * FROM gra_menu WHERE parentId = #{parentId} order by menuOrder
	</select>
</mapper>
/**
 * @author yinyunqi
 * @datetime 2018年6月23日
 * @Content 
 */
package com.damionew.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.damionew.model.Menu;

@Mapper
public interface MenuMapper {
	public List<Menu> parentMenu();
	
	public List<Menu> childMenu(String parentId); 
}

在MenuService中处理菜单

package com.damionew.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.damionew.mapper.MenuMapper;
import com.damionew.model.Menu;

@Service
public class MenuService {
	@Autowired
	MenuMapper menuMapper;
	public List<Menu> menuList(){
		//1.查询父菜单
		List<Menu> parentMenus = menuMapper.parentMenu();
		//2.遍历父菜单
		for(Menu menu: parentMenus ) {
			String parentId = menu.getMenuId();
			//3.根据父菜单id查询子菜单
			List<Menu> childMenus = menuMapper.childMenu(parentId);
			menu.setChildMenus(childMenus);
		}
		
		return parentMenus;
	}
}

controller中若使用JSON返回,则显示

/**
 * @author yinyunqi
 * @datetime 2018年6月23日
 * @Content 
 */
package com.damionew.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONObject;
import com.damionew.model.Menu;
import com.damionew.service.MenuService;

@Controller
public class IndexController {
	
	@Autowired
	MenuService menuService;
	
	@ResponseBody
	@RequestMapping("/index")
	public String indexPage(Model model) {
		List<Menu> menuList = menuService.menuList();
		model.addAttribute("menuList", menuList);
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("menuList",menuList);
//		return "index";
		return jsonObject.toJSONString();
	}
}

json串如下,可以去解析并格式化

{"menuList":[{"childMenus":[{"menuId":"2","menuOrder":0,"name":"天气预报","parentId":"1","url":"/invoice"},{"menuId":"3","menuOrder":1,"name":"在线聊天室","parentId":"1","url":"/index"},{"menuId":"4","menuOrder":2,"name":"视频播放","parentId":"1"},{"menuId":"5","menuOrder":3,"name":"相册","parentId":"1","url":"/photoalbum"}],"menuId":"1","menuOrder":0,"name":"功能菜单1","url":""},{"childMenus":[{"menuId":"7","menuOrder":1,"name":"客机","parentId":"6"},{"menuId":"8","menuOrder":2,"name":"战斗机","parentId":"6"},{"menuId":"9","menuOrder":3,"name":"运输机","parentId":"6"}],"menuId":"6","menuOrder":1,"name":"飞机"}]}
{
    "menuList":[
        {
            "childMenus":[
                {
                    "menuId":"2",
                    "menuOrder":0,
                    "name":"天气预报",
                    "parentId":"1",
                    "url":"/invoice"
                },
                {
                    "menuId":"3",
                    "menuOrder":1,
                    "name":"在线聊天室",
                    "parentId":"1",
                    "url":"/index"
                },
                {
                    "menuId":"4",
                    "menuOrder":2,
                    "name":"视频播放",
                    "parentId":"1"
                },
                {
                    "menuId":"5",
                    "menuOrder":3,
                    "name":"相册",
                    "parentId":"1",
                    "url":"/photoalbum"
                }
            ],
            "menuId":"1",
            "menuOrder":0,
            "name":"功能菜单1",
            "url":""
        },
        {
            "childMenus":[
                {
                    "menuId":"7",
                    "menuOrder":1,
                    "name":"客机",
                    "parentId":"6"
                },
                {
                    "menuId":"8",
                    "menuOrder":2,
                    "name":"战斗机",
                    "parentId":"6"
                },
                {
                    "menuId":"9",
                    "menuOrder":3,
                    "name":"运输机",
                    "parentId":"6"
                }
            ],
            "menuId":"6",
            "menuOrder":1,
            "name":"飞机"
        }
    ]
}

取消controller注释,传入前台页面(thymeleaf引擎)

                        <li th:each="parentmenu : ${menuList}">
                            <a class="tooltip-tip ajax-load" th:title="${parentmenu.name}">
                                <i class="icon-document-edit"></i>
                                <span th:text="${parentmenu.name}"></span>
                            </a>
                            <ul>
                                <li th:each="childmenu : ${parentmenu.childMenus}">
                                    <a class="tooltip-tip2 ajax-load" th:href="${childmenu.url}"  th:title="${childmenu.name}" target="iframe">
                                    	<i class="entypo-doc-text"></i>
                                    	<span th:text="${childmenu.name}"></span>
                                    </a>
                                </li>
                            </ul>
                        </li>
Done,原来很简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值