jdk1.8+vue elementui实现多级菜单功能


Posted in Javascript onSeptember 24, 2020

前言:在学习谷粒商城的时候,在做分类维护树形菜单维护的功能中,项目中只讲了菜单三级树怎么实现,想拓展一下多级菜单,功能已实现,记录一下,有不对的地方欢迎指正。

一、后端部分

使用Jdk1.8的新特性Stream和lamada表达式,数据库的框架使用苞米豆的mybatis plus,话不多说,上代码

1. 新建ManyTree类,可封装成工具类

import com.atguigu.gulimall.product.entity.CategoryEntity;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.util.List;
import java.util.Map;
public class ManyTree {

 private List<CategoryEntity> rootList; // 根节点对象存放到这里
 private List<CategoryEntity> bodyList; // 其他节点存放到这里,可以包含根节点

 public ManyTree(List<CategoryEntity> rootList, List<CategoryEntity> bodyList) {
  this.rootList = rootList;
  this.bodyList = bodyList;
 }

 public List<CategoryEntity> getTree() { // 调用的方法入口
  if (bodyList != null && !bodyList.isEmpty()) {
   // 声明一个map,用来过滤已操作过的数据
   Map<String, String> map = Maps.newHashMapWithExpectedSize(bodyList.size());
   rootList.forEach(beanTree -> getChild(beanTree, map));
   return rootList;
  }
  return null;
 }

 public void getChild(CategoryEntity beanTree, Map<String, String> map) {
  List<CategoryEntity> childList = Lists.newArrayList();
  bodyList.stream().filter(c -> !map.containsKey(c.getCatId())).filter(c -> c.getParentCid().equals(beanTree.getCatId()))
    .forEach(c -> {
     map.put(String.valueOf(c.getCatId()), String.valueOf(c.getParentCid()));
     getChild(c, map);
     childList.add(c);
    });
  beanTree.setChildren(childList);
 }

}

2. 新建实体CategoryEntity,这里用了lombok,idea安装lombok插件,项目添加lombok的依赖,详细自行百度

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
 * 商品分类
 * 
 */
@Data
@TableName("pms_category")
public class CategoryEntity implements Serializable {
	private static final long serialVersionUID = 1L;
	/**
	 * 主键id
	 */
	@TableId
	private Long catId;
	/**
	 * 菜单名称
	 */
	private String name;
	/**
	 * 父级菜单ID
	 */
	private Long parentCid;
	/**
	 * 层级,1 2 3层
	 */
	private Integer catLevel;
	/**
	 * 展示状态,可用作逻辑删除
	 */
	private Integer showStatus;
	/**
	 * 排序字段
	 */
	private Integer sort;
	/**
	 * 展示图标
	 */
	private String icon;
	private String productUnit;
	private Integer productCount;
	//这个注解的含义是在数据库表中不存在
	/**
	 * 用于装载子菜单children
	 */
	@TableField(exist=false)
	private List<CategoryEntity> children;
}

3. 业务层新建service,这里只贴service实现层的代码

/**
  * 递归查询树形菜单数据逻辑已经抽取出来,
  * 这里只需要传入两个数据集合即可:1、所有菜单数据,包括根节点以及子节点 2、所有一级菜单数据
  * @return
  */
 @Override
 public List<CategoryEntity> getAllTree() {
  //使用mybatis-plus自带的baseMapper.selectList方法查询出所有
  List<CategoryEntity> bodyList = baseMapper.selectList(null);
  //使用xml查询出所有一级菜单
  List<CategoryEntity> rootList = categoryDao.getRootTree();
  ManyTree utils = new ManyTree(rootList, bodyList);
  List<CategoryEntity> result = utils.getTree();
  return result;
 }

二、前端部分

1. Category.vue

<template>
 <div class>
 <el-tree
  :data="menus"
  :props="defaultProps"
  :expand-on-click-node="false"
  node-key="catId"
  ref="menuTree"
  :show-checkbox="showCheckbox"
 >
  <span class="custom-tree-node" slot-scope="{ node, data }">
  <span>{{ node.label }}</span>
  <span>
   <el-button type="text" size="mini" @click="() => append(data)">增加</el-button>
   <el-button type="text" size="mini" @click="() => edit(data)">修改</el-button>
   <el-button
   v-if="node.childNodes.length==0"
   type="text"
   size="mini"
   @click="() => remove(node, data)"
   >删除</el-button>
  </span>
  </span>
 </el-tree>
 </div>
</template>
<script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';
export default {
 //import引入的组件需要注入到对象中才能使用
 components: {},
 data() {
 //这里存放数据
 return {
  //菜单栏数据
  menus: [],
  defaultProps: {
		//与后端实体中封装的子节点名称对应
  children: "children",
  label: "name"
  },
  showCheckbox:true
 };
 },
 //监听属性 类似于data概念
 computed: {},
 //监控data中的数据变化
 watch: {},
 //方法集合
 methods: {
 // 获取菜单数据
 getMenus() {
  this.$http({
  url: this.$http.adornUrl("/product/category/list/tree"),
  method: "get"
  }).then(({ data }) => {
  //console.log("获取菜单数据的data:" + data.data);
  this.menus = data.data;
  });
 },
 edit(data){
 },
 append(data) { 
 },
 //移除节点方法
 remove(node, data) { 
 }
 },
 //生命周期 - 创建完成(可以访问当前this实例)
 created() {
 this.getMenus();
 },
 //生命周期 - 挂载完成(可以访问DOM元素)
 mounted() {},
 beforeCreate() {}, //生命周期 - 创建之前
 beforeMount() {}, //生命周期 - 挂载之前
 beforeUpdate() {}, //生命周期 - 更新之前
 updated() {}, //生命周期 - 更新之后
 beforeDestroy() {}, //生命周期 - 销毁之前
 destroyed() {}, //生命周期 - 销毁完成
 activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
};
</script>
<style lang='scss' scoped>
//@import url(); 引入公共css类
</style>

2. 展示效果

jdk1.8+vue elementui实现多级菜单功能

三、数据库

1. 建表sql

CREATE TABLE `pms_category` (
 `cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id',
 `name` char(50) DEFAULT NULL COMMENT '分类名称',
 `parent_cid` bigint(20) DEFAULT NULL COMMENT '父分类id',
 `cat_level` int(11) DEFAULT NULL COMMENT '层级',
 `show_status` tinyint(4) DEFAULT NULL COMMENT '是否显示[0-不显示,1显示]',
 `sort` int(11) DEFAULT NULL COMMENT '排序',
 `icon` char(255) DEFAULT NULL COMMENT '图标地址',
 `product_unit` char(50) DEFAULT NULL COMMENT '计量单位',
 `product_count` int(11) DEFAULT NULL COMMENT '商品数量',
 PRIMARY KEY (`cat_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1450 DEFAULT CHARSET=utf8mb4 COMMENT='商品分类';

2. 模拟数据
可以自己造些数据,有需要的数据可以云盘拿,懒得摘了!
链接: https://pan.baidu.com/s/1Brt8682D3ydvorEWhgEUEA 提取码: kkjx

到此这篇关于jdk1.8+vue elementui实现多级菜单功能的文章就介绍到这了,更多相关vue elementui实现多级菜单内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
学习ExtJS table布局
Oct 08 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
Apr 26 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
Nov 25 Javascript
js随机生成网页背景颜色的方法
Feb 26 Javascript
js实现支持手机滑动切换的轮播图片效果实例
Apr 29 Javascript
jQuery实现下滑菜单导航效果代码
Aug 25 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
Mar 02 Javascript
JS实现队列的先进先出功能示例
May 10 Javascript
Angular父子组件通过服务传参的示例方法
Oct 31 Javascript
Nuxt的路由配置和参数传递方式
Nov 06 Javascript
JavaScript控制台的更多功能
Apr 28 Javascript
vue实现日历表格(element-ui)
Sep 24 #Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
Sep 24 #Javascript
.netcore+vue 实现压缩文件下载功能
Sep 24 #Javascript
vue-router 控制路由权限的实现
Sep 24 #Javascript
vue+elementUI实现简单日历功能
Sep 24 #Javascript
JavaScript获取时区实现过程解析
Sep 24 #Javascript
小程序点餐界面添加购物车左右摆动动画
Sep 23 #Javascript
You might like
php学习之数据类型之间的转换介绍
2011/06/09 PHP
php 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
php 类自动载入的方法
2015/06/03 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
vue实现弹幕功能
2019/10/25 Javascript
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
python实现将内容分行输出
2015/11/05 Python
Python中使用Queue和Condition进行线程同步的方法
2016/01/19 Python
Python探索之Metaclass初步了解
2017/10/28 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
Python的互斥锁与信号量详解
2019/09/12 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
python实现可下载音乐的音乐播放器
2020/02/25 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
文案策划求职信
2014/03/18 职场文书
模具专业自荐信
2014/05/29 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
小学数学教师研修日志
2015/11/13 职场文书
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS