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 相关文章推荐
jQuery live
May 15 Javascript
javascript oop开发滑动(slide)菜单控件
Aug 25 Javascript
提升你网站水平的jQuery插件集合推荐
Apr 19 Javascript
基于jquery的跟随屏幕滚动代码
Jul 24 Javascript
JavaScript 学习笔记之数据类型
Jan 14 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
Oct 29 Javascript
Bootstrap开关(switch)控件学习笔记分享
May 30 Javascript
谈谈Vue.js——vue-resource全攻略
Jan 16 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
May 08 jQuery
详解vue-router 2.0 常用基础知识点之router.push()
May 10 Javascript
为输入框加入数字js校验代码分享
Nov 02 Javascript
js前端设计模式优化50%表单校验代码示例
Jun 21 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图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
JavaScript中的6种运算符总结
2014/10/16 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
2020/04/03 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
python批量导出导入MySQL用户的方法
2013/11/15 Python
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
利用Python学习RabbitMQ消息队列
2015/11/30 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
教师专业理论水平的自我评价分享
2013/11/09 职场文书
投资合作协议书范本
2014/04/17 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
热门专业求职信
2014/05/24 职场文书
社区平安建设方案
2014/05/25 职场文书
团员个人总结
2015/02/26 职场文书
工会工作个人总结
2015/03/03 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js