You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

234 lines
17 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

layui.define(["element","laytpl" ,"jquery"], function (exports) { // 定义一个模块依赖element、laytpl和jquery
var element = layui.element, // 获取layui的element模块
$ = layui.$, // 获取layui的jQuery模块
laytpl = layui.laytpl, // 获取layui的模板引擎模块
layer = layui.layer; // 获取layui的弹出层模块
var miniMenu = { // 定义miniMenu对象
render: function (options) { // 定义渲染函数
options.menuList = options.menuList || []; // 如果未传入menuList则默认为空数组
options.multiModule = options.multiModule || false; // 如果未传入multiModule则默认为false
options.menuChildOpen = options.menuChildOpen || false; // 如果未传入menuChildOpen则默认为false
if (options.multiModule) { // 如果开启多模块
miniMenu.renderMultiModule(options.menuList, options.menuChildOpen); // 调用多模块渲染函数
} else { // 否则
miniMenu.renderSingleModule(options.menuList, options.menuChildOpen); // 调用单模块渲染函数
}
miniMenu.listen(); // 监听事件
},
renderSingleModule: function (menuList, menuChildOpen) { // 定义单模块渲染函数
menuList = menuList || []; // 如果未传入menuList则默认为空数组
var leftMenuHtml = '', // 初始化左侧菜单HTML字符串
childOpenClass = '', // 初始化子菜单打开类名
leftMenuCheckDefault = 'layui-this'; // 设置默认选中样式类名
var me = this ; // 保存当前上下文
if (menuChildOpen) childOpenClass = ' layui-nav-itemed'; // 如果需要展开子菜单,添加对应的类名
leftMenuHtml = this.renderLeftMenu(menuList,{ childOpenClass:childOpenClass }) ; // 渲染左侧菜单HTML
$('.layui-layout-body').addClass('layuimini-single-module'); // 给布局主体添加单模块标识类名
$('.layuimini-header-menu').remove(); // 移除头部菜单
$('.layuimini-menu-left').html(leftMenuHtml); // 将渲染好的左侧菜单HTML插入到左侧菜单容器中
element.init(); // 初始化layui元素
},
compileMenu: function(menu,isSub){
// 定义菜单HTML模板使用laytpl语法进行条件渲染
var menuHtml = '<li {{#if( d.menu){ }} data-menu="{{d.menu}}" {{#}}} class="layui-nav-item menu-li {{d.childOpenClass}} {{d.className}}" {{#if( d.id){ }} id="{{d.id}}" {{#}}}> <a {{#if( d.href){ }} layuimini-href="{{d.href}}" {{#}}} {{#if( d.target){ }} target="{{d.target}}" {{#}}} href="javascript:;">{{#if( d.icon){ }} <i class="{{d.icon}}"></i> {{#}}} <span class="layui-left-nav">{{d.title}}</span></a> {{# if(d.children){}} {{d.children}} {{#}}} </li>' ;
// 如果isSub为true则使用不同的HTML模板
if(isSub){
menuHtml = '<dd class="menu-dd {{d.childOpenClass}} {{ d.className }}"> <a href="javascript:;" {{#if( d.menu){ }} data-menu="{{d.menu}}" {{#}}} {{#if( d.id){ }} id="{{d.id}}" {{#}}} {{#if(( !d.child || !d.child.length ) && d.href){ }} layuimini-href="{{d.href}}" {{#}}} {{#if( d.target){ }} target="{{d.target}}" {{#}}}> {{#if( d.icon){ }} <i class="{{d.icon}}"></i> {{#}}} <span class="layui-left-nav"> {{d.title}}</span></a> {{# if(d.children){}} {{d.children}} {{#}}}</dd>'
}
// 使用laytpl渲染菜单HTML模板并返回结果
return laytpl(menuHtml).render(menu);
},
compileMenuContainer :function(menu,isSub){
// 定义菜单容器的HTML模板使用laytpl语法进行条件渲染
var wrapperHtml = '<ul class="layui-nav layui-nav-tree layui-left-nav-tree {{d.className}}" id="{{d.id}}">{{d.children}}</ul>' ;
// 如果isSub为true则使用不同的HTML模板
if(isSub){
wrapperHtml = '<dl class="layui-nav-child ">{{d.children}}</dl>' ;
}
// 如果菜单没有子项,则返回空字符串
if(!menu.children){
return "";
}
// 使用laytpl渲染菜单容器的HTML模板并返回结果
return laytpl(wrapperHtml).render(menu);
},
each:function(list,callback){ // 定义一个遍历函数,接收列表和回调函数作为参数
var _list = []; // 初始化一个空数组用于存储处理后的结果
for(var i = 0 ,length = list.length ; i<length ;i++ ){ // 遍历传入的列表
_list[i] = callback(i,list[i]) ; // 对每个元素执行回调函数,并将结果存入新数组
}
return _list ; // 返回处理后的数组
},
renderChildrenMenu:function(menuList,options){ // 定义渲染子菜单的函数,接收菜单列表和选项作为参数
var me = this ; // 保存当前上下文的引用
menuList = menuList || [] ; // 如果未传入菜单列表,则使用空数组
var html = this.each(menuList,function (idx,menu) { // 遍历菜单列表
if(menu.child && menu.child.length){ // 如果当前菜单有子菜单
menu.children = me.renderChildrenMenu(menu.child,{ childOpenClass: options.childOpenClass || '' }); // 递归调用自身渲染子菜单
}
menu.className = "" ; // 清空菜单的类名
menu.childOpenClass = options.childOpenClass || '' // 设置子菜单打开时的类名
return me.compileMenu(menu,true) // 编译当前菜单并返回HTML字符串
}).join(""); // 将所有生成的HTML字符串连接成一个字符串
return me.compileMenuContainer({ children:html },true) // 将生成的HTML字符串包装在容器中并返回
},
renderLeftMenu :function(leftMenus,options){ // 定义渲染左侧菜单的函数,接收左侧菜单列表和选项作为参数
options = options || {}; // 如果未传入选项,则使用空对象
var me = this ; // 保存当前上下文的引用
var leftMenusHtml = me.each(leftMenus || [],function (idx,leftMenu) { // 遍历左侧菜单列表
var children = me.renderChildrenMenu(leftMenu.child, { childOpenClass:options.childOpenClass }); // 渲染子菜单
var leftMenuHtml = me.compileMenu({ // 编译当前左侧菜单
href:leftMenu.href, // 设置链接地址
target:leftMenu.target, // 设置链接目标
childOpenClass:options.childOpenClass, // 设置子菜单打开时的类名
icon:leftMenu.icon, // 设置图标
title:leftMenu.title, // 设置标题
children:children // 设置子菜单
});
return leftMenuHtml ; // 返回编译后的HTML字符串
}).join(""); // 将所有生成的HTML字符串连接成一个字符串
leftMenusHtml = me.compileMenuContainer({
id: options.parentMenuId, // 设置菜单容器的ID为options对象中的parentMenuId属性值
className: options.leftMenuCheckDefault, // 设置菜单容器的类名为options对象中的leftMenuCheckDefault属性值
children: leftMenusHtml // 将当前leftMenusHtml作为子元素传递给compileMenuContainer方法
}) ;
return leftMenusHtml ; // 返回处理后的leftMenusHtml
},
renderrenderMultiModule: function (menuList, menuChildOpen) {
menuList = menuList || []; // 如果menuList未定义或为空则初始化为空数组
var me = this; // 保存当前上下文的引用
var headerMenuHtml = '', // 初始化顶部菜单HTML字符串
headerMobileMenuHtml = '', // 初始化移动端顶部菜单HTML字符串
leftMenuHtml = '', // 初始化左侧菜单HTML字符串
leftMenuCheckDefault = 'layui-this', // 设置左侧菜单默认选中样式
childOpenClass = '', // 初始化子菜单打开类名
headerMenuCheckDefault = 'layui-this'; // 设置顶部菜单默认选中样式
if (menuChildOpen) childOpenClass = ' layui-nav-itemed'; // 如果需要展开子菜单,添加相应的类名
var headerMenuHtml = this.each(menuList, function (index, val) { // 遍历菜单列表进行顶部菜单渲染
var menu = 'multi_module_' + index; // 生成菜单ID
var id = menu + "HeaderId"; // 生成头部菜单ID
var topMenuItemHtml = ""; // 初始化顶部菜单项HTML字符串
topMenuItemHtml = me.compileMenu({
className: headerMenuCheckDefault, // 设置菜单项的类名
menu: menu, // 设置菜单ID
id: id, // 设置菜单项ID
title: val.title, // 设置菜单标题
href: "", // 设置链接地址(此处为空)
target: "", // 设置目标窗口(此处为空)
children: "" // 设置子菜单(此处为空)
});
leftMenuHtml += me.renderLeftMenu(val.child, { // 渲染左侧菜单并追加到leftMenuHtml
parentMenuId: menu, // 传递父菜单ID
childOpenClass: childOpenClass, // 传递子菜单打开类名
leftMenuCheckDefault: leftMenuCheckDefault // 传递左侧菜单默认选中样式
});
headerMobileMenuHtml += me.compileMenu({ id: id, menu: menu, id: id, icon: val.icon, title: val.title }, true); // 渲染移动端顶部菜单并追加到headerMobileMenuHtml
headerMenuCheckDefault = ""; // 清空顶部菜单默认选中样式
leftMenuCheckDefault = "layui-hide"; // 设置左侧菜单默认隐藏样式
return topMenuItemHtml; // 返回顶部菜单项HTML字符串
}).join(""); // 将所有顶部菜单项HTML字符串连接成一个字符串
$('.layui-layout-body').addClass('layuimini-multi-module'); // 给布局主体添加多模块标识类名
$('.layuimini-menu-header-pc').html(headerMenuHtml); // 将顶部菜单HTML添加到电脑端头部菜单容器中
$('.layuimini-menu-left').html(leftMenuHtml); // 将左侧菜单HTML添加到左侧菜单容器中
$('.layuimini-menu-header-mobile').html(headerMobileMenuHtml); // 将移动端顶部菜单HTML添加到移动端头部菜单容器中
element.init(); // 初始化Layui元素
} },
listlisten: function () {
// 监听点击事件当点击具有data-menu属性的元素时触发
$('body').on('click', '[data-menu]', function () {
// 显示加载动画设置shade为false持续时间为2秒
var loading = layer.load(0, {shade: false, time: 2 * 1000});
// 获取被点击元素的data-menu属性值即菜单ID
var menuId = $(this).attr('data-menu');
// header部分移除当前选中的菜单项的高亮样式
$(".layuimini-header-menu .layui-nav-item.layui-this").removeClass('layui-this');
// 将被点击的菜单项设置为高亮状态
$(this).addClass('layui-this');
// left部分隐藏所有菜单项
$(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this").addClass('layui-hide');
// 移除隐藏状态下的菜单项的高亮样式
$(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this.layui-hide").removeClass('layui-this');
// 显示被点击的菜单项对应的内容区域
$("#" + menuId).removeClass('layui-hide');
// 将被点击的菜单项设置为高亮状态
$("#" + menuId).addClass('layui-this');
// 关闭加载动画
layer.close(loading);
});
$('body').on('click', '.layuimini-site-mobile', function () { // 当点击类名为'layuimini-site-mobile'的元素时触发事件
var loading = layer.load(0, {shade: false, time: 2 * 1000}); // 显示加载层无遮罩持续2秒
var isShow = $('.layuimini-tool [data-side-fold]').attr('data-side-fold'); // 获取'data-side-fold'属性的值
if (isShow == 1) { // 如果当前状态为展开
$('.layuimini-tool [data-side-fold]').attr('data-side-fold', 0); // 设置'data-side-fold'属性为0缩放
$('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-indent'); // 更改图标为缩进图标
$('.layui-layout-body').removeClass('layuimini-all'); // 移除全屏样式
$('.layui-layout-body').addClass('layuimini-mini'); // 添加缩放样式
} else { // 如果当前状态为缩放
$('.layuimini-tool [data-side-fold]').attr('data-side-fold', 1); // 设置'data-side-fold'属性为1正常
$('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-outdent'); // 更改图标为正常图标
$('.layui-layout-body').removeClass('layuimini-mini'); // 移除缩放样式
$('.layui-layout-body').addClass('layuimini-all'); // 添加全屏样式
layer.close(window.openTips); // 关闭提示层
}
element.init(); // 重新初始化元素
layer.close(loading); // 关闭加载层
});
$('body').on('click', '[data-side-fold]', function () { // 当点击具有'data-side-fold'属性的元素时触发事件
var loading = layer.load(0, {shade: false, time: 2 * 1000}); // 显示加载层无遮罩持续2秒
var isShow = $('.layuimini-tool [data-side-fold]').attr('data-side-fold'); // 获取'data-side-fold'属性的值
if (isShow == 1) { // 如果当前状态为展开
$('.layuimini-tool [data-side-fold]').attr('data-side-fold', 0); // 设置'data-side-fold'属性为0缩放
$('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-indent'); // 更改图标为缩进图标
$('.layui-layout-body').removeClass('layuimini-all'); // 移除全屏样式
$('.layui-layout-body').addClass('layuimini-mini'); // 添加缩放样式
// $(".menu-li").each(function (idx,el) {
// $(el).addClass("hidden-sub-menu"); // 隐藏子菜单项
// });
} else { // 如果当前状态为缩放
$('.layuimini-tool [data-side-fold]').attr('data-side-fold', 1); // 设置'data-side-fold'属性为1正常
$('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-outdent'); // 更改图标为正常图标
$('.layui-layout-body').removeClass('layuimini-mini'); // 移除缩放样式
$('.layui-layout-body').addClass('layuimini-all'); // 添加全屏样式
// $(".menu-li").each(function (idx,el) {
// $(el).removeClass("hidden-sub-menu"); // 显示子菜单项
// });
layer.close(window.openTips); // 关闭提示层
}
element.init(); // 重新初始化元素
layer.close(loading); // 关闭加载层
});
$('body').on('click', '.layuimini-header-menu.layuimini-mobile-show dd', function () { // 当点击具有特定类名的dd元素时触发事件
var loading = layer.load(0, {shade: false, time: 2 * 1000}); // 显示加载动画持续时间为2秒
var check = $('.layuimini-tool [data-side-fold]').attr('data-side-fold'); // 获取具有data-side-fold属性的元素的data-side-fold属性值
if(check === "1"){ // 如果data-side-fold属性值为"1"
$('.layuimini-site-mobile').trigger("click"); // 触发layuimini-site-mobile元素的点击事件
element.init(); // 重新初始化element模块
}
layer.close(loading); // 关闭加载动画
});
},
};
exports("miniMenu", miniMenu); // 导出miniMenu模块
});