springboot + vue 实现递归生成多级菜单(实例代码)

yizhihongxing

下面我将为您详细讲解“springboot + vue 实现递归生成多级菜单”的完整攻略。

简介

本文将介绍如何使用SpringBoot和Vue.js实现递归生成多级菜单。通过该方案,可以生成任意深度的多级菜单。

准备工作

在开始之前,需要下载安装以下软件:

  • JDK 8+
  • Node.js
  • Vue CLI

创建SpringBoot项目

首先,使用Spring Initializr创建一个新的SpringBoot项目,具体方法可以参考官方文档

在创建过程中,需要添加以下依赖项:

  • Spring Web
  • Spring Data JPA
  • MySQL Driver

创建完成后,将生成的代码导入到你的IDE中并进行配置。

创建数据库表

创建一个名为sys_menu的数据库表,用于存储菜单数据。

表结构如下:

CREATE TABLE `sys_menu` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID,一级菜单为0',
  `name` varchar(50) DEFAULT NULL COMMENT '菜单名称',
  `url` varchar(200) DEFAULT NULL COMMENT '菜单URL',
  `perms` varchar(500) DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:user:list,user:create)',
  `type` int(11) DEFAULT NULL COMMENT '类型   0:目录   1:菜单   2:按钮',
  `order_num` int(11) DEFAULT NULL COMMENT '菜单排序',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

编写SpringBoot代码

下一步是编写SpringBoot后端代码。在com.example.demo包下创建一个名为controller的包,并在其中创建一个名为MenuController的控制器。

@RestController
@RequestMapping("/menu")
public class MenuController {

    @Autowired
    private MenuService menuService;

    @GetMapping("/list")
    public List<Menu> list() {
        return menuService.list();
    }
}

com.example.demo包下创建一个名为service的包,并在其中创建一个名为MenuService的服务。

public interface MenuService {
    List<Menu> list();
}

@Service
public class MenuServiceImpl implements MenuService {

    @Autowired
    private MenuRepository menuRepository;

    @Override
    public List<Menu> list() {
        // 递归查询所有菜单
        List<Menu> menuList = menuRepository.findByParentIdIsNull();
        return build(menuList);
    }

    /**
     * 递归生成菜单树
     * @param menuList 菜单列表
     * @return 生成的菜单树
     */
    private List<Menu> build(List<Menu> menuList) {
        List<Menu> treeList = new ArrayList<>();

        for (Menu menu : menuList) {
            if (menu.getType() == 0) {
                // 递归查询子菜单
                List<Menu> children = menuRepository.findByParentId(menu.getId());
                menu.setChildren(build(children));
            }

            treeList.add(menu);
        }

        return treeList;
    }
}

最后,在com.example.demo包下创建一个名为repository的包,并在其中创建一个名为MenuRepository的仓库。

public interface MenuRepository extends JpaRepository<Menu, Long> {

    /**
     * 按 parentId 查找菜单
     */
    List<Menu> findByParentId(Long parentId);

    /**
     * 查找 parentId 为 null 的菜单
     */
    List<Menu> findByParentIdIsNull();
}

创建Vue前端项目

在命令行中执行如下命令,创建一个名为vue-demo的新项目:

vue create vue-demo

该命令会使用Vue CLI创建一个新的Vue.js项目,并自动安装所需的依赖项。

编写Vue代码

vue-demo项目中,打开src/App.vue文件,修改其内容如下:

<template>
  <div>
    <h1>{{ title }}</h1>
    <ul>
      <menu-item v-for="menu in menuList" :key="menu.id" :menu="menu"></menu-item>
    </ul>
  </div>
</template>

<script>
import axios from 'axios'
import MenuItem from './components/MenuItem.vue'

export default {
  name: 'App',
  components: {
    MenuItem
  },
  data() {
    return {
      title: '递归生成多级菜单',
      menuList: []
    }
  },
  created() {
    // 加载菜单数据
    axios.get('/menu/list').then(response => {
      this.menuList = response.data
    })
  }
}
</script>

该代码会渲染一个多级菜单,其数据来源于后端控制器。

vue-demo项目中,创建一个名为components的目录,并在其中创建一个名为MenuItem.vue的组件。

<template>
  <li>
    <a v-if="menu.type === 1" :href="menu.url">{{ menu.name }}</a>
    <span v-else>{{ menu.name }}</span>

    <ul v-if="menu.children">
      <menu-item v-for="child in menu.children" :key="child.id" :menu="child"></menu-item>
    </ul>
  </li>
</template>

<script>
export default {
  name: 'MenuItem',
  props: {
    menu: {
      type: Object,
      required: true
    }
  }
}
</script>

该组件会渲染一个菜单项,并递归渲染其子菜单项。

运行程序

在命令行中,分别进入springbootvue-demo目录,并执行以下命令:

// 在springboot目录下执行以下命令
./mvnw spring-boot:run

// 在vue-demo目录下执行以下命令
npm run serve

现在,您就可以在浏览器中访问http://localhost:8080,查看漂亮的多级菜单了!

示例说明

示例1:添加菜单

为了演示添加菜单的操作,可以修改MenuControllerlist()方法的返回值,返回一个由多个菜单项组成的“菜单列表”。具体代码如下:

@GetMapping("/list")
public List<Menu> list() {
    List<Menu> menuList = new ArrayList<>();

    // 添加第一个菜单项
    Menu menu1 = new Menu();
    menu1.setId(1L);
    menu1.setName("系统管理");
    menu1.setUrl(null);
    menu1.setType(0);
    menu1.setOrderNum(10);
    menu1.setCreateTime(new Date());
    menu1.setUpdateTime(new Date());

    Menu menu11 = new Menu();
    menu11.setId(11L);
    menu11.setName("用户管理");
    menu11.setUrl("/user");
    menu11.setType(1);
    menu11.setOrderNum(10);
    menu11.setCreateTime(new Date());
    menu11.setUpdateTime(new Date());

    Menu menu12 = new Menu();
    menu12.setId(12L);
    menu12.setName("角色管理");
    menu12.setUrl("/role");
    menu12.setType(1);
    menu12.setOrderNum(20);
    menu12.setCreateTime(new Date());
    menu12.setUpdateTime(new Date());

    // 第一个菜单项添加两个子菜单项
    menu1.setChildren(Arrays.asList(menu11, menu12));

    // 添加第二个菜单项
    Menu menu2 = new Menu();
    menu2.setId(2L);
    menu2.setName("购物中心");
    menu2.setUrl("/shop");
    menu2.setType(1);
    menu2.setOrderNum(20);
    menu2.setCreateTime(new Date());
    menu2.setUpdateTime(new Date());

    menuList.add(menu1);
    menuList.add(menu2);

    return menuList;
}

示例2:删除菜单

为了演示删除菜单的操作,可以在MenuServiceImpl中添加一个名为delete()的方法,实现删除菜单的功能。具体操作如下:

public void delete(Long id) {
    // 从数据库中删除菜单
    menuRepository.deleteById(id);
}

MenuController中添加一个名为delete()的方法,实现删除菜单项的功能。具体代码如下:

@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {
    menuService.delete(id);
}

MenuItem.vue组件中添加一个名为delete()的方法,实现“删除菜单”按钮的功能。具体代码如下:

<template>
  <li>
    <div>
      <a v-if="menu.type === 1" :href="menu.url">{{ menu.name }}</a>
      <span v-else>{{ menu.name }}</span>

      <button v-if="menu.type !== 0" @click="deleteMenu">删除</button>
    </div>

    <ul v-if="menu.children">
      <menu-item v-for="child in menu.children" :key="child.id" :menu="child"></menu-item>
    </ul>
  </li>
</template>

<script>
export default {
  name: 'MenuItem',
  props: {
    menu: {
      type: Object,
      required: true
    }
  },
  methods: {
    deleteMenu() {
      if (window.confirm('确认删除该菜单?')) {
        // 向后台发送删除请求
        axios.delete('/menu/' + this.menu.id)
        // 重新加载菜单数据
        this.$root.$emit('reloadMenu')
      }
    }
  }
}
</script>

将“删除菜单”按钮添加到菜单项中之后,就可以轻松删除菜单项了!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot + vue 实现递归生成多级菜单(实例代码) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • notepad++:正则表达式系统教程

    以下是详细讲解“notepad++:正则表达式系统教程的完整攻略”的标准Markdown格式文本,包含两个示例说明: Notepad++:正则表达式系统程的完整攻略 Notepad++是一款免费的文本编辑器,支持正则表达式搜索和替换。本攻略将介绍Notepad++中正则表达式的基本语法、常用元字符和示例说明等内容。 基本语法 Notepad++中正则表达式的…

    other 2023年5月10日
    00
  • 笔记本散热风扇噪音大怎么办 笔记本噪音大的多种解决方案

    笔记本散热风扇噪音大怎么办 笔记本电脑经过长时间的使用,风扇可能会变得非常嘈杂,这是因为它们吸附了大量的尘土和污垢,使它们的运转不再平滑。以下是多种解决方案: 清洁电脑风扇 首先,你可以尝试清洁电脑风扇。为了这样做,你需要拆卸笔记本电脑外壳并访问其内部。请注意,这需要非常小心地操作,以避免损坏电脑。一旦你进入电脑内部,你可以用压缩气罐来清洁风扇和散热器。这将…

    other 2023年6月26日
    00
  • 七猫免费小说怎么查看版本号?七猫免费小说查看版本号技巧

    七猫免费小说查看版本号攻略 七猫免费小说是一款受欢迎的小说阅读应用程序。如果你想查看七猫免费小说的版本号,可以按照以下步骤进行操作: 步骤一:打开七猫免费小说应用 首先,你需要打开七猫免费小说应用程序。你可以在手机的应用列表中找到它,并点击打开。 步骤二:进入设置页面 一旦你打开了七猫免费小说应用,你需要找到设置页面。通常,设置页面可以通过点击应用的主界面右…

    other 2023年8月3日
    00
  • uaf漏洞学习

    以下是UAF(Use-After-Free)漏洞学习的完整攻略: 步骤1:了解UAF漏洞 在学习UAF漏洞之前,需要了解UAF漏洞的基本概念和原理。UAF洞通常发生在程序释放了一个对象的内存空间后,但仍然继续使用该内存空间。攻击者可以利用UAF漏洞来执行任意代码或者导致程序崩溃。UAF漏洞的修复通常需要程序员正确地管理内存空间,避免重复释放或者使用已经释放的…

    other 2023年5月6日
    00
  • win7打开config文件的具体方法

    以下是详细讲解”win7打开config文件的具体方法”的完整攻略。 步骤一:打开文件资源管理器 在windows 7中,您需要首先打开文件资源管理器来访问config文件。右键单击桌面上的“计算机”图标或者按下“Win + E”快捷键,即可打开文件资源管理器。 步骤二:切换到正确的目录 进入文件资源管理器后,您需要切换到包含要查找的config文件的目录。…

    other 2023年6月27日
    00
  • linux下elasticsearch安装教程

    Linux下elasticsearch安装教程 Elasticsearch是一个开源的搜索引擎,能够提供实时的搜索和数据分析功能。本文将介绍如何在Linux系统下安装Elasticsearch。 步骤1:安装Java Elasticsearch是基于Java语言开发的,因此在安装Elasticsearch之前,需要先安装Java。在Linux系统上,可以使用…

    其他 2023年3月28日
    00
  • 关于wordpress搬家方法步骤的整理

    以下是“关于WordPress搬家方法步骤的整理”的完整攻略: WordPress搬家方法步骤整理 如果您需要将WordPress网站从一个主机搬到另一个主机,或从一个域名搬到另一个域名,以下是一些步骤可以帮助您完成这个过程: 1. 备份网站 在搬家之前,您需要备份整个WordPress网站,包括数据库和文件。您可以使用WordPress插件,如Updraf…

    other 2023年5月7日
    00
  • 辐射4力量系perk技能点详细介绍

    辐射4力量系Perk技能点详细介绍 引言 在《辐射4》这个 RPG 游戏中,Perk 技能点可以让你的角色变得更加强大。本文将详细介绍力量系Perk技能点,帮助你在游戏中更好地利用这些技能点。 力量系Perk技能点 以下是力量系Perk技能点的列表: 重击 (Big Leagues) 类型:通用 Perk 级别:4 格斗武器伤害增加20%/40%/60%/8…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部