目录

  • 数据库设计

查询菜单的时候,我们可能会想直接从数据库中查询出菜单,但是像京东的首页菜单是这样的:

数据库设计

我们在设计数据库的时候仅仅使用一张表就可以把上面的关系给捋清楚,就是通过一个parentid字段,让我们开看一下这张表的表结构

看一下建表语句

DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu`  (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键递增',`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分类名称',`parentid` int(11) NULL DEFAULT NULL COMMENT '父节点id',`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分类链接',`icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分类图标',`order` int(11) NULL DEFAULT NULL COMMENT '分类排序权重',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;INSERT INTO `menu` VALUES (1, '新闻', 0, '/www/xinwen', 'xxx', 1);
INSERT INTO `menu` VALUES (2, '每日日报', 1, '/www/meiriribao', 'xxx', 2);
INSERT INTO `menu` VALUES (3, '每日晚报', 1, '/www/zaobao', 'xxx', 1);
INSERT INTO `menu` VALUES (4, '河南日报', 2, '/www/henan', 'xxx', 2);
INSERT INTO `menu` VALUES (5, '上海日报', 2, '/www/shanghai', 'xxx', 1);
INSERT INTO `menu` VALUES (6, '南京日报', 2, '/www/nanjing', 'xxx', 3);
INSERT INTO `menu` VALUES (7, '开封日报', 4, '/www/zhoukou', 'xxx', 2);
INSERT INTO `menu` VALUES (8, '郑州日报', 4, '/www/zhenghzou', 'xxx', 3);

实体类

import lombok.Data;import java.io.Serializable;
import java.util.List;@Data
public class Menu implements Comparable<Menu>, Serializable {private static final long serialVersionUID = -4866555859812317355L;private Integer id;private String name;private Integer parentId;private String url;private String icon;private Integer order;//子菜单列表private List<Menu> children;@Overridepublic int compareTo(Menu o) {if(this.order != o.order){return this.order - o.order;}return 0;}
}

先看看controller层:

 @Autowiredprivate MenuService menuService;@RequestMapping(value = "/menu/findTree",method = RequestMethod.POST)public BaseResponse create(@RequestBody(required = false) Menu menu) {List<Menu> list = menuService.findAll(menu);return BaseResponse.ok(list);}

service接口

import com.free.freedom.entity.Menu;import java.util.List;public interface MenuService {List<Menu> findAll(Menu menu);
}

实现类

import com.free.freedom.entity.Menu;
import com.free.freedom.mapper.MenuMapper;
import com.free.freedom.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;@Service
public class MenuServiceImpl implements MenuService {@Autowiredprivate MenuMapper menuMapper;@Overridepublic List<Menu> findAll(Menu menu) {try {//查询出所有的菜单List<Menu> allMenu = menuMapper.findAll();//根节点存储List<Menu> rootMenu = new ArrayList<>();//根据传递的参数设置根节点if(menu != null && menu.getId()!= null){//父节点为传递的id为根节点for (Menu nav : allMenu) {if(nav.getParentId().equals(menu.getId())){rootMenu.add(nav);}}}else {//父节点是0的,为根节点for (Menu nav : allMenu) {if(nav.getParentId().equals(0)){rootMenu.add(nav);}}}// 根据Menu类的order排序Collections.sort(rootMenu);//为根节点设置子菜单,getChild是递归调用for (Menu nv : rootMenu) {//获取根节点下的所有子节点,使用getChild方法List<Menu> childList = getChild(nv.getId(),allMenu);//给根节点设置子节点nv.setChildren(childList);}return rootMenu;} catch (Exception e) {e.printStackTrace();return new ArrayList<>();}}private List<Menu> getChild(Integer id, List<Menu> allMenu) {//子菜单List<Menu> childList = new ArrayList<>();for (Menu nav : allMenu) {//遍历所有节点,将所有菜单的父id与传过来的根节点的id比较//相等说明:为该根节点的子节点if(nav.getParentId().equals(id)){childList.add(nav);}}//递归设置子节点for (Menu nav : childList) {nav.setChildren(getChild(nav.getId(),allMenu));}//排序Collections.sort(childList);//如果节点下没有子节点,返回一个空List(递归退出)if(childList.size() == 0){return new ArrayList<Menu>();}return childList;}
}

mapper层

import com.free.freedom.entity.Menu;
import org.apache.ibatis.annotations.Mapper;import java.util.List;
@Mapper
public interface MenuMapper {List<Menu> findAll();}

mapper.xml

<?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.free.freedom.mapper.MenuMapper"><resultMap id="BaseResultMap" type="com.free.freedom.entity.Menu"><id column="id" jdbcType="INTEGER" property="id" /><result column="name" jdbcType="VARCHAR" property="name" /><result column="parentid" jdbcType="INTEGER" property="parentId" /><result column="url" jdbcType="VARCHAR" property="url" /><result column="icon" jdbcType="VARCHAR" property="icon" /><result column="order" jdbcType="INTEGER" property="order" /></resultMap><select id="findAll" resultMap="BaseResultMap">select * from menu</select></mapper>

测试结果

{"status": 0,"msg": "OK","data": [{"id": 1,"name": "新闻","parentId": 0,"url": "/www/xinwen","icon": "xxx","order": 1,"children": [{"id": 3,"name": "每日晚报","parentId": 1,"url": "/www/zaobao","icon": "xxx","order": 1,"children": []},{"id": 2,"name": "每日日报","parentId": 1,"url": "/www/meiriribao","icon": "xxx","order": 2,"children": [{"id": 5,"name": "上海日报","parentId": 2,"url": "/www/shanghai","icon": "xxx","order": 1,"children": []},{"id": 4,"name": "河南日报","parentId": 2,"url": "/www/henan","icon": "xxx","order": 2,"children": [{"id": 7,"name": "开封日报","parentId": 4,"url": "/www/zhoukou","icon": "xxx","order": 2,"children": []},{"id": 8,"name": "郑州日报","parentId": 4,"url": "/www/zhenghzou","icon": "xxx","order": 3,"children": []}]},{"id": 6,"name": "南京日报","parentId": 2,"url": "/www/nanjing","icon": "xxx","order": 3,"children": []}]}]},{"id": 9,"name": "联播","parentId": 0,"url": "/www/xinwen","icon": "xxx","order": 1,"children": []}]
}

{"status": 0,"msg": "OK","data": [{"id": 5,"name": "上海日报","parentId": 2,"url": "/www/shanghai","icon": "xxx","order": 1,"children": []},{"id": 4,"name": "河南日报","parentId": 2,"url": "/www/henan","icon": "xxx","order": 2,"children": [{"id": 7,"name": "开封日报","parentId": 4,"url": "/www/zhoukou","icon": "xxx","order": 2,"children": []},{"id": 8,"name": "郑州日报","parentId": 4,"url": "/www/zhenghzou","icon": "xxx","order": 3,"children": []}]},{"id": 6,"name": "南京日报","parentId": 2,"url": "/www/nanjing","icon": "xxx","order": 3,"children": []}]
}

java实现一、二、三级菜单查询设置相关推荐

  1. 第一天作业二 三级菜单的实现

    第一天作业二 三级菜单的实现 这个作业花了一定的时间,主要是卡在循环时显示不同的问题. #!/usr/bin/env python # -*-conding:utf-8-** # __Author__ ...

  2. jQuery 三级菜单

    在写这个的时候,首先要捋顺思路.点一个菜单的时候,其他的要闭合,点一级菜单的时候,二三级菜单要闭合,等等. 大致代码如下: <body><aside><ul class= ...

  3. 初学java之菜单条,菜单,菜单项的设置

    1 package project; 2 import javax.swing.*; 3 4 import java.awt.event.KeyEvent; 5 import java.awt.eve ...

  4. java SSM 框架 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro

    A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生 ...

  5. java SSM 框架 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro ehcache websocket

    获取[下载地址] QQ: 313596790 官网 http://www.fhadmin.org/ A 代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [ ...

  6. java SSM 框架 微信自定义菜单 快递接口 SpringMVC mybatis redis

    获取[下载地址]   QQ: 313596790 A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 ...

  7. 关于若依框架多级菜单的设置

    最近从php转到java,并且被要求用了一个叫若依的框架.然后有个需求需要用到三级菜单.按照二级菜单配置后前端的element-ui显示找不到该model.最后看官方文档,外加csdn的一个博客才给解 ...

  8. 微信公众平台开发教程Java版(六) 事件处理(菜单点击/关注/取消关注)

    前言: 事件处理是非常重要的,这一章讲讲常见的事件处理 1.关注/取消关注 2.菜单点击 事件类型介绍: 在微信中有事件请求是消息请求中的一种.请求类型为:event 而event事件类型又分多种事件 ...

  9. 公众号开发(二)--菜单管理

    公众号开发(二)--菜单管理 开发说明 以下是官网的说明 1.自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. 2.一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以&q ...

最新文章

  1. 圆桌讨论:Cloud 2.0时代的工业互联网与智能制造 1
  2. 手写logback_springboot logback调整mybatis日志级别无效的解决
  3. PHP——获取路径和目录
  4. C++ Opengl绘制3D源码
  5. OpenGL 坐标变换
  6. Spring事件的观察者模式
  7. 人工智障学习笔记——梯度下降(2)优化算法
  8. 卡布教你:脸上长痘痘平时要注意什么呢
  9. 【python】IP地址处理模块IPy
  10. 上海政府版WINXP真相大揭秘
  11. quora ios_企业家的Quora指南
  12. android audiorecord插上耳机录音由dmic切换到耳机录音
  13. 让你的工作事半功倍的语音转文字转换器
  14. Linux--系统网络测试和测试工具
  15. caffe 创建网络模型
  16. matlab图像配准之SSD、NCC、SAD等相似度计算
  17. 阿里HR有多敬业,程序员:恐怖,晚上11点接到阿里面试电话
  18. 艾伟_转载:自用扩展方法分享
  19. 小学用计算机画画 说课,体验电脑画画小学信息技术说课稿.docx
  20. 将Prezi分别保存为pez,pdf,exe格式

热门文章

  1. eclipse,包的分级显示
  2. Mumu模拟器修改hosts文件
  3. 软考报名有哪些要求?
  4. HTML5移动端视频播放器MP4
  5. unity常用快捷键
  6. 求分数序列前N项和求大神救我!!!!
  7. compareTo排序规则
  8. 学习工作和生活总结(二)
  9. 隐藏打开CMD,执行命令
  10. 《原力计划【第二季】》—— 第二周周榜