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 相关文章推荐
(function($){...})(jQuery)的意思
Jul 22 Javascript
关于hashchangebroker和statehashable的补充文档
Aug 08 Javascript
jQuery插件 selectToSelect使用方法
Oct 02 Javascript
div模拟选择框示例代码
Nov 03 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
Jun 26 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
Sep 01 Javascript
jquery实现无刷新验证码的简单实例
May 19 Javascript
JS实战篇之收缩菜单表单布局
Dec 10 Javascript
彻底理解js面向对象之继承
Feb 04 Javascript
js指定日期增加指定月份的实现方法
Dec 19 Javascript
详解vue 中 scoped 样式作用域的规则
Sep 14 Javascript
vue 中使用print.js导出pdf操作
Nov 13 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判断浏览器的类型和语言的函数代码
2013/02/28 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
2015/05/12 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
Javascript typeof 用法
2008/12/28 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
Python实现配置文件备份的方法
2015/07/30 Python
Python中的time模块与datetime模块用法总结
2016/06/30 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
python编写简易聊天室实现局域网内聊天功能
2018/07/28 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
英国电信商店:BT Shop
2019/12/17 全球购物
"序列点" 是什么
2016/07/29 面试题
师范生自我鉴定范文
2013/10/05 职场文书
房地产开发计划书
2014/01/10 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
布达拉宫导游词
2015/02/02 职场文书
2015最新婚礼主持词
2015/06/30 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python