动态渲染左侧菜单栏 :menu tree 动态渲染
其中后端代码不包含权限控制,同时支持二级(无子菜单) 和 三级菜单(无子菜单)。
1、layui前端代码:(其他前端框架实现方法通用,不过需要修改js中append对应标签元素即可)
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<!-- 左侧导航区域(可配合layui已有的垂直导航) -->
<ul class="layui-nav layui-nav-tree" id="chuizhi" lay-filter="test"></ul>
</div>
</div> <div class="layui-body">
<!-- 内容主体区域 -->
<iframe name="iframe" src="/test/welcome" width="100%" height="100%"
frameborder="no" border="0" scrolling="auto"></iframe>
</div> <div class="layui-footer">
<!-- 底部固定区域 -->
© myzy.cn -
</div> <script> function isArrayFn(value){//用于判断对象是否为数组.
if (typeof Array.isArray === "function") {
return Array.isArray(value);
}else{
return Object.prototype.toString.call(value) === "[object Array]";
}
}
//JavaScript代码区域
layui.use(['form', 'layedit','element', 'layer','laydate','table'], function(){
var table = layui.table
,element = layui.element
,form = layui.form
,layer = layui.layer
,layedit = layui.layedit
,laydate = layui.laydate
,$ = layui.jquery;
37 //动态渲染树形菜单
$.post("/todo/treeData", function (data){//请求后端返回对应json
var menu1 = [];//所有一级菜单名称数组
for (var key in data) {
menu1.push(key);
}
var len = menu1.length;
for(var i=0;i<len;i++){
$("#chuizhi").append(`<li class="layui-nav-item"><a href="javascript:;">${menu1[i]}</a>
<dl class="layui-nav-child ${menu1[i]}">
</dl></li>`);//一级菜单(有子菜单)
let ss = data[menu1[i]];
if(isArrayFn(ss)){
for(let j=0;j<ss.length;j++){
$("."+menu1[i]).append(`<dd class="twoMenu"><a href="${ss[j].url}" target="iframe"> ${ss[j].name}</a></dd>`);//只到(没有子菜单)二级菜单
}
}else{
let arr = [];
for(var key in ss){
arr = ss[key];
$("."+menu1[i]).append(`<li class="layui-nav-item twoMenu"><a href="javascript:;"> ${key}</a>
<dl class="layui-nav-child ${key}">
</dl></li>`);//二级菜单(有子菜单)
for(let j=0;j<arr.length;j++){
$("."+key).append(`<dd><a href="${arr[j].url}" target="iframe"> ${arr[j].name}</a></dd>`);//只到(没有子菜单)三级菜单
}
}
}
}
element.render();//element.init();//全部更新,用于动态渲染之后的挂载 (2)
/**用于菜单显示效果:点击其他菜单,原来打开的菜单自动关闭*/
$(".twoMenu,#chuizhi>li").on("click",function () {
if(!$(this).hasClass("layui-nav-itemed")){
$(this).removeClass("layui-nav-itemed");
if($(this).children().children().hasClass("layui-nav-itemed")){
$(this).children().children().removeClass("layui-nav-itemed");
}
}else if($(this).hasClass("layui-nav-itemed")){
$(this).addClass("layui-nav-itemed");
$(this).siblings().removeClass("layui-nav-itemed");
if(!$(this).children().children().hasClass("layui-nav-itemed")){
$(this).children().children().removeClass("layui-nav-itemed");
}
}
}) })
});
</script>
2.java后端代码:用于返回给前端 菜单(json) 数据
@Override//其中menu_duidMapper为装载的dao层接口
public Map<String, Object> queryJsonMenus() {
Map<String, Object> mapR = new LinkedHashMap<String, Object>();
//Map<String,Map<String,List<Map<String,String>>>> mapSan = new LinkedHashMap<>();//前端三级菜单json在后端表现形式
//Map<String,List<Map<String,String>>> mapTwo = new LinkedHashMap<>();//前端二级菜单json在后端表现形式
List<String> oneLevelMenuId = menu_duidMapper.selectGoodsMenuIdOneJ();//一级菜单id
List<String> TwoLevelPId = menu_duidMapper.selectGoodsParentIdTwoJ(); //二级菜单fuid
List<String> grandIdThreeJ = menu_duidMapper.selectGoodsGrandIdThreeJ();//三级菜单祖父id
String oneName = null;
String twoName = null;
List<Map<String,String>> msp = null;
List<String> threePid = null;
for(String oneMid : oneLevelMenuId){
Map<String,List<Map<String,String>>> mapTwo = new LinkedHashMap<>();//这里不可以使用单例,所以只能生命在for循环内部
for(String erPid : TwoLevelPId){
if(oneMid.equals(erPid)){
oneName = menu_duidMapper.selectGoodsTypeByMenuId(oneMid);//根据一级菜单menuid查询对应名称
msp = menu_duidMapper.selectGoodsMapByPid(erPid);//根据二级菜单父id查找对应二级map
mapR.put(oneName,msp);//填充一级菜单对应的二级菜单(无子菜单)
}else{
continue;
}
}
for(String sanGpid : grandIdThreeJ){
if(oneMid.equals(sanGpid)){
oneName = menu_duidMapper.selectGoodsTypeByMenuId(oneMid);//
threePid = menu_duidMapper.selectGoodsParentIdThreeJByGrandId(sanGpid);//根据祖父id查询父id并去重
for(String tpid : threePid){
msp = menu_duidMapper.selectGoodsMapByPidAndGpid(tpid,sanGpid);//根据祖父id和父id查询对应map
twoName = menu_duidMapper.selectGoodsTypeByMenuId(tpid);//根据三级菜单父id查询对应二级菜单
//System.out.println(twoName);
mapTwo.put(twoName,msp);//填充二级菜单(有子菜单)和对应三级菜单(物资菜单)
}
mapR.put(oneName,mapTwo);//填充一级菜单所对应的二(有子菜单)三(无子菜单)级菜单
}else{
continue;
}
}
}
return mapR;
}
3.数据库表结构
DROP TABLE IF EXISTS `menu_duid`;
CREATE TABLE `menu_duid` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`menu_id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '菜单id',
`parent_id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '菜单父id',
`grand_pid` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '菜单爷爷id',
`url` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单路径',
`romaker` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 96 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
4.ajax返回的json数据格式为
{
"新闻资讯":{
"企业新闻":[
{
"menuID":"010101",
"name":"xxx",
"url":"/test/petroleum010101"
},
{
"menuID":"010102",
"name":"xxx",
"url":"/test/mAsphalt010102"
}
],
"行业新闻":[
{
"menuID":"010201",
"name":"xxx",
"url":"/test/petroleum010201"
},
{
"menuID":"010202",
"name":"xxx",
"url":"/test/mAsphalt010202"
}
]
},
"行业报告":{
"日报":[
{
"menuID":"020101",
"name":"xxx",
"url":"/test/petroleum020101"
},
{
"menuID":"020102",
"name":"xxx",
"url":"/test/mAsphalt020102"
}
],
"周报":[
{
"menuID":"020201",
"name":"xxx",
"url":"/test/petroleum020201"
},
{
"menuID":"020202",
"name":"xxxx",
"url":"/test/mAsphalt020202"
}
],
"月报":[
{
"menuID":"",
"name":"xxx",
"url":"/test/petroleum020301"
},
{
"menuID":"",
"name":"xxx",
"url":"/test/mAsphalt020302"
}
],
"年报":[
{
"menuID":"",
"name":"xxx",
"url":"/test/petroleum020401"
},
{
"menuID":"",
"name":"xxx",
"url":"/test/mAsphalt020402"
}
]
},
"政策法规":[
{
"menuID":"",
"name":"xxx",
"url":"/test/petroleum0301"
},
{
"menuID":"",
"name":"xxx",
"url":"/test/mAsphalt0302"
}
]
}
5.对应查询的sql语句省略,这个比较简单,只用到了普通查询和几个子查询。。。。
动态渲染左侧菜单栏 :menu tree 动态渲染的更多相关文章
- vue 动态渲染数据很慢或不渲染
vue 动态渲染数据很慢或不渲染 原因是因为vue检测速度很慢,因为多层循环了,在VUE 2.x的时候还能渲染出来,1.x的时候压根渲染不出来.解决方式:在动态改变数据的方法,第一行加上 this.$ ...
- Android动态修改ToolBar的Menu菜单
Android动态修改ToolBar的Menu菜单 效果图 实现 实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了. 开始上货 Menu Me ...
- 细说后端模板渲染、客户端渲染、node 中间层、服务器端渲染(ssr)
细说后端模板渲染.客户端渲染.node 中间层.服务器端渲染(ssr) 前端与后端渲染方式的发展大致经历了这样几个阶段:后端模板渲染.客户端渲染.node 中间层.服务器端渲染(ssr). 1. 后端 ...
- [转贴]Cocos2d-x3.2与OpenGL渲染总结(一)Cocos2d-x3.2的渲染流程
看了opengles有一段时间了,算是了解了一下下.然后,就在基本要决定还是回归cocos2dx 3.2的,看了这篇好文章,欣喜转之~ 推荐看原帖: Cocos2d-x3.2与OpenGL渲染总结(一 ...
- 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法
在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...
- WebStorm设置左侧菜单栏背景和字体设置
WebStorm左侧菜单栏 webstorm是一款前端IDE利器,个人感觉黑色的背景比较炫酷,刚开始从网上下载的主题只能修改编辑窗口的背景色,经过查询资料终于把左边菜单栏的背景色也修改了. 第一步:点 ...
- 模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
我们大部分人都发过动态,想必都知道发动态.回复评论.删除动态的整个过程,那么作为初学者,要模仿这些功能有点复杂的,最起码表的关系得弄清楚~~ 先把思路理一下: (1)用户登录,用session读取 ...
- PHP系统左侧菜单栏的管理与实现
在日常的开发工作中,面对后台的日益增长的业务,以及后期业务的迭代开发,通常会选择添加菜单栏的形式来扩充业务功能,同样日益增长的后台菜单选项也为我们后期的维护,产生了一定的困难性.为此我总结出自己关于左 ...
- 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)
代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...
随机推荐
- 为什么java里面经常作List判断的时候,既要判断list不为null,又要判断size>0呢?
没有考虑到具体的问题上面,我们单纯的来讲: 为什么java里面经常作List判断的时候,既要判断list不为null,又要判断size>0呢? list == null 说明list没有初始化( ...
- FileHelper-文件操作工具
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...
- Manytasking optimization MATP
Manytasking Jmetal代码反向解析1_MATP测试函数集 觉得有用的话,欢迎一起讨论相互学习~Follow Me 这是我在写Manytask optimization时的笔记,代码地址可 ...
- setup_module和teardown_module
setup_module .teardown_module 每个用例开始和结束调用一次 hasattr() 函数用于判断对象是否包含对应的属性 运行结果如下:
- CentOS / RHEL 内核升级
1. 查看当前内核版本 [root@192.168.118.11 ~]#cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) [ro ...
- WeQuant教程—1.4 实践教学:比特币量化定投
在wequant.io,为了让读者能直接体验量化系统的魅力,我们用前面的思路,实现了一套完整的量化系统和回测工具,这个系统非常简单,用户只需要把交易意志用策略表达出来,系统就可以自己完成交易效果的回 ...
- k8s-ingress安装
一.编写nginx-ingress-controller.yaml文件 apiVersion: extensions/v1beta1 kind: Deployment metadata: name ...
- mysql 启动 && 停止
启动:service mysql start关闭:service mysql stop查进程:ps aux | grep mysql杀进程:kill -9 mysqlID Good Good Stud ...
- sql语句修改数据库字段的长度
修改字段的长度 alter table [OtpimizeRoute_Test].[dbo].[T_QueueFile] alter column ListFileName nvarchar()
- Java Annontation 注解的学习和理解
/** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * <p> ...