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 相关文章推荐
自用js开发框架小成 学习js的朋友可以看看
Nov 16 Javascript
解析JSON对象与字符串之间的相互转换
Dec 18 Javascript
js手动播放图片实现图片轮播效果
Sep 17 Javascript
关于json字符串与实体之间的严格验证代码
Nov 10 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
Dec 28 Javascript
js实现水平滚动菜单导航
Jul 21 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
Aug 31 Javascript
laypage.js分页插件使用方法详解
Jul 27 Javascript
react 生命周期实例分析
May 18 Javascript
微信小程序单选框自定义赋值
May 26 Javascript
详解vue3.0 diff算法的使用(超详细)
Jul 01 Javascript
JavaScript实现复选框全选和取消全选
Nov 20 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
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
JavaScript定义类的几种方式总结
2014/01/06 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
Python中使用装饰器和元编程实现结构体类实例
2015/01/28 Python
python动态性强类型用法实例
2015/05/09 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
python中正则表达式与模式匹配
2019/05/07 Python
Python 实现大整数乘法算法的示例代码
2019/09/17 Python
用python批量下载apk
2020/12/29 Python
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
廉洁教育学习材料
2014/05/19 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
捐款通知怎么写
2015/04/24 职场文书
公司费用报销管理制度
2015/08/04 职场文书
小学信息技术教学反思
2016/02/16 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书