SpringBoot+layuimini實(shí)現(xiàn)左側(cè)菜單動(dòng)態(tài)展示的示例代碼
layuimini左側(cè)菜單動(dòng)態(tài)顯示
首先我們看一下layuimini的原有菜單顯示格式
{
"homeInfo": {
"title": "首頁(yè)",
"href": "page/welcome-2.html?t=2"
},
"logoInfo": {
"title": "LAYUI MINI",
"image": "images/logo.png",
"href": ""
},
"menuInfo": [
{
"title": "系統(tǒng)管理",
"icon": "fa fa-address-book",
"href": "",
"target": "_self",
"child": [
{
"title": "權(quán)限管理",
"href": "",
"icon": "fa fa-home",
"target": "_self",
"child": [
{
"title": "賬戶信息管理",
"href": "page/account.html",
"icon": "fa fa-tachometer",
"target": "_self"
},
{
"title": "主頁(yè)二",
"href": "page/welcome-2.html",
"icon": "fa fa-tachometer",
"target": "_self"
},
{
"title": "三",
"href": "page/welcome-3.html",
"icon": "fa fa-tachometer",
"target": "_self"
}
]
}
]
}
]
}
接下來(lái)是HTML顯示頁(yè)面
var options = {
//后端動(dòng)態(tài)生成的接口
// iniUrl: "/auth/getResources", // 初始化接口
//原有的接口鏈接
iniUrl:"api/init.json",
clearUrl: "api/clear.json", // 緩存清理接口
urlHashLocation: true, // 是否打開hash定位
bgColorDefault: false, // 主題默認(rèn)配置
multiModule: false, // 是否開啟多模塊
menuChildOpen: false, // 是否默認(rèn)展開菜單
loadingTime: 0, // 初始化加載時(shí)間
pageAnim: true, // iframe窗口動(dòng)畫
maxTabNum: 20, // 最大的tab打開數(shù)量
};
miniAdmin.render(options);
這是layuimini給出的左側(cè)菜單

接下來(lái)開始我們的改變,將靜態(tài)菜單改為動(dòng)態(tài)菜單
1.數(shù)據(jù)庫(kù)準(zhǔn)備,這里我們需要四張數(shù)據(jù)庫(kù)表

sys_role_resource


2.sys_role


3.sys_user


4.sys_resource


后端代碼塊實(shí)現(xiàn)(后端主要需要的實(shí)現(xiàn)類就只要,資源和角色資源兩個(gè)類即可)
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編號(hào)
private Integer resourceId;
//資源名稱
private String title;
//資源圖標(biāo)
private String icon;
//頁(yè)面資源跳轉(zhuǎn)鏈接
private String href;
//父級(jí)資源
private Integer parentId;
//排序
private Integer sort;
//ztree會(huì)檢查返回的數(shù)據(jù)中有沒(méi)有 checked 屬性 如果為true就會(huì)把這個(gè)節(jié)點(diǎn)設(shè)為選中狀態(tài)
private String checked;
//子菜單,這里可以使用vo類來(lái)代替
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編號(hào)
private Integer roleResourceId;
//權(quán)限id
private Integer roleId;
//資源id
private Integer resourceId;
}
3.loginConreoller

/*
* 根據(jù)角色id獲取對(duì)應(yīng)的權(quán)限
* */
@GetMapping("/getResources")
// 定義一個(gè)方法,用于獲取資源信息
public Map<String, Object> getResources(HttpSession session) {
// 創(chuàng)建一個(gè)map對(duì)象,用于存儲(chǔ)資源信息
Map<String, Object> map = new HashMap<>();
// 創(chuàng)建一個(gè)homeInfo對(duì)象,用于存儲(chǔ)首頁(yè)信息
Map<String, Object> homeInfo = new HashMap<>();
homeInfo.put("title", "首頁(yè)");
homeInfo.put("icon", "fa fa-home");
homeInfo.put("href", "welcome");
// 將homeInfo對(duì)象添加到map中
map.put("homeInfo", homeInfo);
// 創(chuàng)建一個(gè)logoInfo對(duì)象,用于存儲(chǔ)logo信息
Map<String, Object> logoInfo = new HashMap<>();
logoInfo.put("title", "暖意ERP");
logoInfo.put("image", "images/logo.png");
logoInfo.put("href", "");
// 將logoInfo對(duì)象添加到map中
map.put("logoInfo", logoInfo);
// 創(chuàng)建一個(gè)menuInfo列表,用于存儲(chǔ)菜單信息
List<Object> menuInfo = new ArrayList<>();
// 獲取當(dāng)前登錄人保存的getRoleId信息
Integer roleId = (Integer) session.getAttribute("roleId");
// 打印測(cè)試當(dāng)前登陸的角色id是多少是否與數(shù)據(jù)庫(kù)中id相對(duì)應(yīng)。
System.out.println(roleId);
// 根據(jù)roleId查詢后面對(duì)應(yīng)的資源菜單
List<ResourceEntity> resource = roleResourceService.getAllResourcesByRoleId(roleId);
// 測(cè)試查詢到的菜單
System.out.println(resource);
// 遍歷資源列表,將資源添加到menuInfo中
resource.forEach(t -> {
menuInfo.add(t);
System.out.println(t);
});
// 將menuInfo添加到map中
map.put("menuInfo", menuInfo);
// 返回map對(duì)象
return map;
}
4.建立service接口
//根據(jù)角色id查詢資源數(shù)據(jù) List<ResourceEntity> getAllResourcesByRoleId(Integer roleId);
5.service實(shí)現(xiàn)類
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 {
// 定義一個(gè)私有的RoleResourceMapper對(duì)象,用于操作角色資源映射表
private final RoleResourceMapper roleResourceMapper;
// 構(gòu)造函數(shù),接收一個(gè)RoleResourceMapper對(duì)象作為參數(shù),并將其賦值給當(dāng)前對(duì)象的roleResourceMapper屬性
public RoleResourceServiceImpl(RoleResourceMapper roleResourceMapper) {
this.roleResourceMapper = roleResourceMapper;
}
@Override
// 獲取指定角色I(xiàn)D的所有資源列表
public List<ResourceEntity> getAllResourcesByRoleId(Integer roleId) {
// 這里返回的resourceEntityList 沒(méi)有實(shí)現(xiàn)排序
// 以后 可以考慮下 返回 resourceEntityList之前 根據(jù)resource對(duì)象的sort進(jìn)行排序
// 那么左側(cè)顯示的菜單就可以排序了
List<ResourceEntity> resourceEntityList = new ArrayList<>();
// roleResourceEntity里面就是一個(gè)中間表 兩個(gè)字段 roleId resourceId 關(guān)聯(lián)起來(lái)
List<RoleResourceEntity> roleResourceEntities = roleResourceMapper.selectRoleResourceByRoleId(roleId);
System.out.println("impl輸出測(cè)試目錄"+roleResourceEntities);
// 新建一個(gè)對(duì)象數(shù)組繼續(xù)寧條件判斷資源
// 用for循環(huán)遍歷,如果i=0且小于資源則菜單資源進(jìn)行想相加在循環(huán)
if (roleResourceEntities != null && roleResourceEntities.size() > 0) {
List<ResourceEntity> noChildrenResourceEntities = new ArrayList<>();
// 進(jìn)行資源判斷是否為空或者大于0
for (int i = 0; i < roleResourceEntities.size(); i++) {
// 獲取roleResource(資源中間表)中的resourceId(資源id)
ResourceEntity resourceEntity = roleResourceMapper.getResourceById(roleResourceEntities.get(i).getResourceId());
// 就是根據(jù)這個(gè)登陸者的roleId 所擁有的資源取出來(lái)
noChildrenResourceEntities.add(resourceEntity);
}
for (int i = 0; i < noChildrenResourceEntities.size(); i++) {
if (noChildrenResourceEntities.get(i).getParentId() == 0) {
// 說(shuō)明這個(gè)菜單是一級(jí)菜單 沒(méi)有上一級(jí)菜單
// 如果這里不為0 表示這個(gè)菜單是二級(jí)菜單 或者三級(jí)菜單 ParentId對(duì)應(yīng)了屬于哪個(gè)上級(jí)菜
ResourceEntity resourceEntity = new ResourceEntity();
// 把這個(gè)一級(jí)菜單取出來(lái)
resourceEntity = noChildrenResourceEntities.get(i);
List<ResourceEntity> resourceEntities = new ArrayList<>();
// for把所有菜單過(guò)一遍
for (int j = 0; j < noChildrenResourceEntities.size(); j++)
{
// 如果有菜單屬于這個(gè)一級(jí)菜單
if (Objects.equals(noChildrenResourceEntities.get(j).getParentId(), noChildrenResourceEntities.get(i).getResourceId())) {
ResourceEntity resourceEntity2 = new ResourceEntity();
// 取出這個(gè)二級(jí)菜單
resourceEntity2 = noChildrenResourceEntities.get(j);
resourceEntities.add(resourceEntity2);
}
}
resourceEntity.setChild(resourceEntities);
resourceEntityList.add(resourceEntity);
}
}
}
// 下面是根據(jù)資源的sort進(jìn)行排序 升序排列 這樣左側(cè)菜單就會(huì)按照升序排列
Collections.sort(resourceEntityList, new Comparator<ResourceEntity>() {
@Override
public 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_resource
where roleId = #{roleId}
</select>
8.前端頁(yè)面代碼修改

9.效果圖

以上就是SpringBoot+layuimini實(shí)現(xiàn)左側(cè)菜單動(dòng)態(tài)展示的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot layuimini菜單動(dòng)態(tài)展示的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java實(shí)現(xiàn)的質(zhì)因數(shù)分解操作示例【基于遞歸算法】
這篇文章主要介紹了Java實(shí)現(xiàn)的質(zhì)因數(shù)分解操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了Java基于遞歸算法實(shí)現(xiàn)針對(duì)整數(shù)的質(zhì)因數(shù)分解相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
java設(shè)計(jì)模式之工廠模式實(shí)例詳解
這篇文章主要介紹了java設(shè)計(jì)模式之工廠模式,結(jié)合具有實(shí)例形式分析了java工廠模式的概念、原理、實(shí)現(xiàn)與使用方法,需要的朋友可以參考下2017-09-09
mybatis連接PGSQL中對(duì)于json和jsonb的處理方法
在使用PostgreSQL數(shù)據(jù)庫(kù)時(shí),將表字段設(shè)置為jsonb格式可以存儲(chǔ)JSON數(shù)據(jù),本文給大家介紹mybatis連接PGSQL中對(duì)于json和jsonb的處理方法,感興趣的朋友一起看看吧2024-11-11
Netty源碼分析NioEventLoop初始化線程選擇器創(chuàng)建
這篇文章主要介紹了Netty源碼分析NioEventLoop初始化線程選擇器創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Java?CompletableFuture實(shí)現(xiàn)原理分析詳解
CompletableFuture是Java8并發(fā)新特性,本文我們主要來(lái)聊一聊CompletableFuture的回調(diào)功能以及異步工作原理是如何實(shí)現(xiàn)的,需要的可以了解一下2022-09-09
Java實(shí)例化一個(gè)抽象類對(duì)象的方法教程
大家都知道抽象類無(wú)法實(shí)例化,就無(wú)法創(chuàng)建對(duì)象。所以下面這篇文章主要給大家介紹了關(guān)于Java實(shí)例化一個(gè)抽象類對(duì)象的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Java監(jiān)聽器三種實(shí)現(xiàn)方法代碼解析
這篇文章主要介紹了Java監(jiān)聽器三種實(shí)現(xiàn)方法代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08

