SpringBoot+layuimini实现左侧菜单动态展示

layuimini左侧菜单动态显示

首先我们看一下layuimini的原有菜单显示格式

{"homeInfo": {"title": "首页","href": "page/welcome-2.html?t=2"},"logoInfo": {"title": "LAYUI MINI","image": "images/logo.png","href": ""},"menuInfo": [{"title": "系统管理","icon": "fa fa-address-book","href": "","target": "_self","child": [{"title": "权限管理","href": "","icon": "fa fa-home","target": "_self","child": [{"title": "账户信息管理","href": "page/account.html","icon": "fa fa-tachometer","target": "_self"},{"title": "主页二","href": "page/welcome-2.html","icon": "fa fa-tachometer","target": "_self"},{"title": "三","href": "page/welcome-3.html","icon": "fa fa-tachometer","target": "_self"}]}]}]
}

接下来是HTML显示页面

var options = {//后端动态生成的接口// iniUrl: "/auth/getResources",    // 初始化接口//原有的接口链接iniUrl:"api/init.json",clearUrl: "api/clear.json", // 缓存清理接口urlHashLocation: true,      // 是否打开hash定位bgColorDefault: false,      // 主题默认配置multiModule: false,          // 是否开启多模块menuChildOpen: false,       // 是否默认展开菜单loadingTime: 0,             // 初始化加载时间pageAnim: true,             // iframe窗口动画maxTabNum: 20,              // 最大的tab打开数量};miniAdmin.render(options);

这是layuimini给出的左侧菜单
在这里插入图片描述

接下来开始我们的改变,将静态菜单改为动态菜单

1.数据库准备,这里我们需要四张数据库表
在这里插入图片描述

  1. sys_role_resource
    在这里插入图片描述 在这里插入图片描述

2.sys_role

在这里插入图片描述
在这里插入图片描述
3.sys_user
在这里插入图片描述
在这里插入图片描述
4.sys_resource
在这里插入图片描述
在这里插入图片描述

后端代码块实现(后端主要需要的实现类就只要,资源和角色资源两个类即可)

1.ResourceEntity

package com.example.erp_project.entity;import lombok.Data;import java.util.List;/*** @author Lolo don‘t feel*/
@Data
public class ResourceEntity {//资源id编号private Integer resourceId;//资源名称private String title;//资源图标private String icon;//页面资源跳转链接private String href;//父级资源private Integer parentId;//排序private Integer  sort;//ztree会检查返回的数据中有没有 checked 属性 如果为true就会把这个节点设为选中状态private String checked;//子菜单,这里可以使用vo类来代替private List<ResourceEntity> child;}

2.RoleResourceEntity

package com.example.erp_project.entity;import lombok.Data;import java.util.List;/*** @author Lolo don‘t feel*/
@Data
public class RoleResourceEntity {//id编号private Integer roleResourceId;//权限idprivate Integer roleId;//资源idprivate Integer resourceId;}

3.loginConreoller
在这里插入图片描述

  /** 根据角色id获取对应的权限* */@GetMapping("/getResources")// 定义一个方法,用于获取资源信息public Map<String, Object> getResources(HttpSession session) {// 创建一个map对象,用于存储资源信息Map<String, Object> map = new HashMap<>();// 创建一个homeInfo对象,用于存储首页信息Map<String, Object> homeInfo = new HashMap<>();homeInfo.put("title", "首页");homeInfo.put("icon", "fa fa-home");homeInfo.put("href", "welcome");// 将homeInfo对象添加到map中map.put("homeInfo", homeInfo);// 创建一个logoInfo对象,用于存储logo信息Map<String, Object> logoInfo = new HashMap<>();logoInfo.put("title", "暖意ERP");logoInfo.put("image", "images/logo.png");logoInfo.put("href", "");// 将logoInfo对象添加到map中map.put("logoInfo", logoInfo);// 创建一个menuInfo列表,用于存储菜单信息List<Object> menuInfo = new ArrayList<>();// 获取当前登录人保存的getRoleId信息Integer roleId = (Integer) session.getAttribute("roleId");// 打印测试当前登陆的角色id是多少是否与数据库中id相对应。System.out.println(roleId);// 根据roleId查询后面对应的资源菜单List<ResourceEntity> resource = roleResourceService.getAllResourcesByRoleId(roleId);// 测试查询到的菜单System.out.println(resource);// 遍历资源列表,将资源添加到menuInfo中resource.forEach(t -> {menuInfo.add(t);System.out.println(t);});// 将menuInfo添加到map中map.put("menuInfo", menuInfo);// 返回map对象return map;}

4.建立service接口

//根据角色id查询资源数据List<ResourceEntity> getAllResourcesByRoleId(Integer roleId);

5.service实现类

import com.example.erp_project.entity.RoleResourceEntity;
import com.example.erp_project.mapper.RoleResourceMapper;
import com.example.erp_project.service.RoleResourceService;
import org.springframework.stereotype.Service;import java.util.*;/*** @author Lolo don‘t feel*/
@Service
public class RoleResourceServiceImpl implements RoleResourceService {// 定义一个私有的RoleResourceMapper对象,用于操作角色资源映射表private final RoleResourceMapper roleResourceMapper;// 构造函数,接收一个RoleResourceMapper对象作为参数,并将其赋值给当前对象的roleResourceMapper属性public RoleResourceServiceImpl(RoleResourceMapper roleResourceMapper) {this.roleResourceMapper = roleResourceMapper;}@Override// 获取指定角色ID的所有资源列表public List<ResourceEntity> getAllResourcesByRoleId(Integer roleId) {// 这里返回的resourceEntityList 没有实现排序// 以后 可以考虑下 返回 resourceEntityList之前 根据resource对象的sort进行排序// 那么左侧显示的菜单就可以排序了List<ResourceEntity> resourceEntityList = new ArrayList<>();// roleResourceEntity里面就是一个中间表 两个字段 roleId resourceId 关联起来List<RoleResourceEntity> roleResourceEntities = roleResourceMapper.selectRoleResourceByRoleId(roleId);System.out.println("impl输出测试目录"+roleResourceEntities);// 新建一个对象数组继续宁条件判断资源// 用for循环遍历,如果i=0且小于资源则菜单资源进行想相加在循环if (roleResourceEntities != null && roleResourceEntities.size() > 0) {List<ResourceEntity> noChildrenResourceEntities = new ArrayList<>();// 进行资源判断是否为空或者大于0for (int i = 0; i < roleResourceEntities.size(); i++) {// 获取roleResource(资源中间表)中的resourceId(资源id)ResourceEntity resourceEntity = roleResourceMapper.getResourceById(roleResourceEntities.get(i).getResourceId());// 就是根据这个登陆者的roleId 所拥有的资源取出来noChildrenResourceEntities.add(resourceEntity);}for (int i = 0; i < noChildrenResourceEntities.size(); i++) {if (noChildrenResourceEntities.get(i).getParentId() == 0) {// 说明这个菜单是一级菜单 没有上一级菜单// 如果这里不为0 表示这个菜单是二级菜单 或者三级菜单 ParentId对应了属于哪个上级菜ResourceEntity resourceEntity = new ResourceEntity();// 把这个一级菜单取出来resourceEntity = noChildrenResourceEntities.get(i);List<ResourceEntity> resourceEntities = new ArrayList<>();// for把所有菜单过一遍for (int j = 0; j < noChildrenResourceEntities.size(); j++){// 如果有菜单属于这个一级菜单if (Objects.equals(noChildrenResourceEntities.get(j).getParentId(), noChildrenResourceEntities.get(i).getResourceId())) {ResourceEntity resourceEntity2 = new ResourceEntity();// 取出这个二级菜单resourceEntity2 = noChildrenResourceEntities.get(j);resourceEntities.add(resourceEntity2);}}resourceEntity.setChild(resourceEntities);resourceEntityList.add(resourceEntity);}}}// 下面是根据资源的sort进行排序 升序排列 这样左侧菜单就会按照升序排列Collections.sort(resourceEntityList, new Comparator<ResourceEntity>() {@Overridepublic int compare(ResourceEntity o1, ResourceEntity o2) {return o1.getSort().compareTo(o2.getSort());}});return resourceEntityList;}}

6.mapper接口

public interface RoleResourceMapper {List<RoleResourceEntity> selectRoleResourceByRoleId(Integer roleId);}

7.mybatis

 <select id="selectRoleResourceByRoleId" resultType="com.example.erp_project.entity.RoleResourceEntity">select *from sys_role_resourcewhere roleId = #{roleId}</select>

8.前端页面代码修改
在这里插入图片描述
9.效果图
在这里插入图片描述
OK代码到这里就结束了,希望对有需要的码友有帮助,如果文章中有任何语义解释错误的地方还请各位海涵!!欢迎大佬批评指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cv2技术原理-图像旋转原理及手动实现

cv2技术原理-图像旋转原理及手动实现 1、图像旋转opencv实现2、cv2.getRotationMatrix2D函数解释3、数学原理推导旋转矩阵M4、手动计算旋转矩阵M5、旋转矩阵M的使用6、使用旋转矩阵M手动实现旋转功能 1、图像旋转opencv实现 图像旋转在对数据集数据增强&#xff08;主要是随机…

Java语言——封装

一.封装的定义 在面向对象程式设计方法中&#xff0c;封装&#xff08;英语&#xff1a;Encapsulation&#xff09;是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问…

linux|将用户加入白名单

一 用root用户找到etc\sudoers文件 cd etc 二 修改etc\sudoers 文件的权限 默认是只读的 修改为可写的 chmod uw sudoers 三 打开 sudoers文件&#xff0c;在Allow root to run any commands anywhere 后面 添加一条&#xff08;把上面的一条内容复制下来 修改用户名即…

什么是程控电源?以及程控电源的工作原理与应用。

一、程控电源的简介&#xff1a; 程控电源是一种具有编程功能的电源设备&#xff0c;它可以通过外部控制来设定输出电压、电流的稳压、稳流或稳压/稳流模式&#xff0c;因此可以进行电压、电流、相位、频率、功率等参数的试验和检定。一些具体的产品特性包括微机控制、高精度、…

表达式求值(后缀表达式)(数据结构)

一、概念 算术表达式是由操作数&#xff08;运算数&#xff09;、运算符&#xff08;操作符&#xff09;、和界线符&#xff08;括号&#xff09;三部分组成&#xff0c;在计算机中进行算术表达式的计算是通过堆栈来实现的。 二后缀表达式的逻辑和实现方式&#xff08;逆波兰…

电商平台数据有哪些?如何进行电商平台数据分析?(内附模板及工具)

在电商日常的贩卖工作中会产生大量的数据&#xff0c;如果你还不知道如何利用这些宝贵的数据指导未来的销售策略、增长销售额的话&#xff0c;就和我一起看下去吧&#xff01;电商数据采集API接口包含哪些数据&#xff1f; 电商平台数据可以大致分为以下几个组成部分&#xff…

Java中的封装

package day32; ​ public class Person {private String name;private int age; ​public String getName() {return name;} ​public void setName(String name) {this.name name;} ​public int getAge() {return age;} ​public void setAge(int age) {if (age>120 || …

蚓链数字化营销系统与数字资产的关系

蚓链数字化营销系统是一种利用数字技术来实现营销目标的系统。它集成了多种数字营销工具和渠道&#xff0c;以收集、分析和利用客户数据&#xff0c;优化营销活动&#xff0c;并提高营销效果。 数字资产是一种新型的资产类别&#xff0c;它们以电子数据的形式存在&#xff0c;可…

笔试狂刷--Day3

大家好,我是LvZi,今天带来笔试狂刷--Day3 一.牛牛的快递 1.题目链接:牛牛的快递 2.分析: 简单的模拟 3.代码实现: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner i…

计算机经典黑皮书分享

计算机经典黑皮书是一套计算机科学丛书&#xff0c;其中包含了多本计算机科学领域的经典教材 提供了全面的知识体系&#xff1a;黑皮书涵盖了计算机科学的多个领域&#xff0c;如计算机组成与设计、操作系统、数据库、人工智能等。它们深入浅出地介绍了相关领域的基本概念、原…

HTTP/HTTPS详解

HTTP/HTTPS详解 1. HTTP1.1 HTTP基础知识1.2 HTTP建立和断开连接 2. HTTPS 1. HTTP 1.1 HTTP基础知识 HTTP是互联网上应用最为广泛的一种网络协议&#xff0c;是一个客户端和服务器端请求和应答的标准&#xff08;TCP&#xff09;&#xff0c;用 于从WWW服务器传输超文本到本…

C++学习————第八天(C/C++内存管理)

目录 1、1.C/C内存分布 2、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3、C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4.operator new与operator delete函数 5. new和delete的实现原理 5.1 内置类型 5.2 自定…

【QT学习】8.qt事件处理机制,事件过滤器,自定义事件

1.qt事件处理机制 事件处理&#xff1a; 当用户移动鼠标的时候 &#xff0c;创建一个 鼠标移动事件对象 然后把这个对象放到 事件队列里面去&#xff0c;事件管理器 从队列中 取出事件&#xff0c;然后 调用其对应的事件处理函数。 多态机制&#xff1a; &#x…

【xhs爬虫软件】把小红书评论comment接口封装成GUI采集工具!

用Python开发爬虫采集软件&#xff0c;可自动抓取小红书评论数据&#xff0c;并且含二级评论。 小红书的评论接口URL是&#xff1a; https://edith.xiaohongshu.com/api/sns/web/v2/comment/page 开发者模式分析过程&#xff1a; 进而封装成GUI界面软件&#xff0c;如下&…

17.基础乐理-调式、自然大调式(C大调、D大调。。。)

调式&#xff1a; 若干个音&#xff0c;按照某种规则排列起来&#xff0c;就是调式&#xff0c;调式是一个非常大&#xff0c;非常抽象的概念&#xff0c;调式这两个字是一个统称&#xff0c;当明确了 若干个音 到底有几个音&#xff0c;某种规则到底是什么规则之后&#xff0c…

【精】Devops实战学习CI/CD落地方案#CI篇#

目录 先有个大概了解 基本概念 CI/CD Devops 阿里云效 devops产品 K8s jenkins docker git maven 知行合一&#xff0c;上手操作 实操记录 安装VMware 安装并配置虚拟机 安装并配置docker docker安装 修改镜像源&#xff08;关键且易出错&#xff09; CentOS…

Spring Security 入门篇(一)-- 简介

引言 Spring Security 官方文档 https://spring.io/projects/spring-security Spring Security 中文文档 &#xff1a; https://springdoc.cn/spring-security/ Spring Cloud 中文文档 https://www.springcloud.cc/spring-security.html#overall-architecture 一、简介 1. 什…

poll实现echo服务器的并发

poll实现echo服务器的并发 代码实现 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/time.h> #include <unistd.h> #…

【JAVA】实现只有一个窗口弹出的底层逻辑——单身模式

目录 背景说明 代码实现 手写笔记 背景说明 有的时候&#xff0c;当你点击一个选项时会弹出来多个窗口&#xff0c;而有的时候只会弹出一个。 实际上&#xff0c;弹出多个窗口就是创建了多个相同的对象&#xff0c;而只弹出一个就是我们今天即将分享的单身模式——一个类只产生…

【Python】使用Python计算简单数值积分

题外话&#xff0c;Python语言命名的来源&#xff1a;&#xff08;见下图&#xff09;Monty Python巨蟒剧团 1、积分题目&#xff08;3&#xff09; 2、解析解答 3、Python计算代码 import math import scipy.integrate as integrate# 积分区间 # x_min 0.0 # 1 # x_min …