layui.define(["element", "jquery"], function (exports) {
// 获取 layui 的 element 模块
var element = layui.element,
// 获取 layui 的 jQuery 模块
$ = layui.$,
// miniAdmin = layui.miniAdmin, // 注释掉的代码,可能是用于获取 miniAdmin 模块
// 获取 layui 的 layer 模块
layer = layui.layer;
var miniPage = {
/**
* 初始化tab
* @param options 配置选项对象,包含homeInfo、menuList、multiModule等属性
*/
render: function (options) {
// 如果options.homeInfo未定义,则设置为空对象
options.homeInfo = options.homeInfo || {};
// 如果options.menuList未定义,则设置为空数组
options.menuList = options.menuList || [];
// 如果options.multiModule未定义,则设置为false
options.multiModule = options.multiModule || false;
// 如果options.renderPageVersion未定义,则设置为false
options.renderPageVersion = options.renderPageVersion || false;
// 如果options.listenSwichCallback未定义,则设置为空函数
options.listenSwichCallback = options.listenSwichCallback || function () {};
// 获取当前URL的hash部分并去掉前缀'#/'
var href = location.hash.replace(/^#\//, '');
// 如果href为空或未定义,则渲染主页
if (href === null || href === undefined || href === '') {
miniPage.renderHome(options);
} else {
// 否则渲染指定页面
miniPage.renderPage(href, options);
// 根据是否多模块进行监听切换
if (options.multiModule) {
miniPage.listenSwitchMultiModule(href);
} else {
miniPage.listenSwitchSingleModule(href);
}
}
// 监听事件
miniPage.listen(options);
// 监听hash变化
miniPage.listenHash(options);
},
/**
* 初始化主页
* @param options
*/
/**
* 渲染主页函数
* @param {Object} options - 包含主页信息和其他选项的对象
*/
renderHome: function (options) {
// 如果options.homeInfo不存在,则初始化为空对象
options.homeInfo = options.homeInfo || {};
// 如果options.homeInfo.href不存在,则初始化为空字符串
options.homeInfo.href = options.homeInfo.href || '';
// 如果options.renderPageVersion不存在,则初始化为false
options.renderPageVersion = options.renderPageVersion || false;
// 隐藏页面头部元素
$('.layuimini-page-header').addClass('layui-hide');
// 渲染页面内容,传入主页链接和选项参数
miniPage.renderPageContent(options.homeInfo.href, options);
},
/**
* 初始化页面
* @param href
* @param options
*/
/**
* 渲染页面的函数
* @param {string} href - 页面的URL地址
* @param {Object} options - 渲染选项
*/
renderPage: function (href, options) {
// 调用miniPage对象的renderPageTitle方法,渲染页面标题
miniPage.renderPageTitle(href, options);
// 调用miniPage对象的renderPageContent方法,渲染页面内容
miniPage.renderPageContent(href, options);
}
/**
* 初始化页面标题
* @param href
* @param options
*/
renderPageTitle: function (href, options) {
// 初始化homeInfo对象,如果不存在则设置为空对象
options.homeInfo = options.homeInfo || {};
// 设置homeInfo的title属性,如果不存在则默认为'主页'
options.homeInfo.title = options.homeInfo.title || '主页';
// 初始化menuList数组,如果不存在则设置为空数组
options.menuList = options.menuList || [];
// 显示页面头部元素
$('.layuimini-page-header').removeClass('layui-hide');
// 构建初始的页面标题HTML,包含返回主页链接和分隔符
var pageTitleHtml = '' + options.homeInfo.title + '/\n';
// 根据href和menuList生成页面标题数组
var pageTitleArray = miniPage.buildPageTitleArray(href, options.menuList);
// 如果页面标题数组不为空
if (pageTitleArray.length > 0) {
// 遍历页面标题数组
for (var key in pageTitleArray) {
key = parseInt(key); // 将key转换为整数类型
// 如果不是最后一个元素,添加链接和分隔符
if (key !== pageTitleArray.length - 1) {
pageTitleHtml += '' + pageTitleArray[key] + '/\n';
} else {
// 如果是最后一个元素,只添加链接
pageTitleHtml += '' + pageTitleArray[key] + '\n';
}
}
} else {
// 如果页面标题数组为空,从sessionStorage中获取标题
var title = sessionStorage.getItem('layuimini_page_title');
// 如果标题为空或未定义,隐藏页面头部元素
if (title === null || title === undefined || title === '') {
$('.layuimini-page-header').addClass('layui-hide');
} else {
// 否则,添加标题到页面标题HTML中
pageTitleHtml += '' + title + '\n';
}
}
// 清空并更新页面头部的标题内容
$('.layuimini-page-header .layuimini-page-title').empty().html(pageTitleHtml);
},
/**
* 初始化页面内容
* @param options
* @param href
*/
renderPageContent: function (href, options) {
// 设置默认的 renderPageVersion 选项为 false,如果未提供该选项
options.renderPageVersion = options.renderPageVersion || false;
// 定义页面内容的容器选择器
var container = '.layuimini-content-page';
// 如果需要渲染页面版本,则在 URL 中添加时间戳参数
if (options.renderPageVersion) {
var v = new Date().getTime();
href = href.indexOf("?") > -1 ? href + '&v=' + v : href + '?v=' + v;
}
// 根据页面头部是否隐藏来调整内容容器的高度样式
if ($(".layuimini-page-header").hasClass("layui-hide")) {
$(container).removeAttr("style");
} else {
$(container).attr("style", "height: calc(100% - 36px)");
}
// 清空内容容器的 HTML 内容
$(container).html('');
// 发起 AJAX 请求获取页面内容
$.ajax({
url: href,
type: 'get',
dataType: 'html',
success: function (data) {
// 将获取到的内容插入到内容容器中,并初始化元素
$(container).html(data);
element.init();
},
error: function (xhr, textstatus, thrown) {
// 处理请求失败的情况,显示错误信息
return layer.msg('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!');
}
});
},
/**
* 刷新页面内容
* @param options
*/
refresh: function (options) {
// 获取当前URL的hash部分,并去掉开头的'#/'
var href = location.hash.replace(/^#\//, '');
// 如果href为空或未定义,则渲染主页内容
if (href === null || href === undefined || href === '') {
miniPage.renderHome(options);
} else {
// 否则根据href渲染相应的页面内容
miniPage.renderPageContent(href, options);
}
}
}
},
/**
* 构建页面标题数组
* @param href
* @param menuList
*/
/**
* 构建页面标题数组
* @param {string} href - 目标链接
* @param {Array} menuList - 菜单列表
* @returns {Array} - 包含页面标题的数组
*/
buildPageTitleArray: function (href, menuList) {
// 初始化空数组,用于存储最终结果
var array = [],
newArray = [];
// 遍历菜单列表中的每一项
for (key in menuList) {
// 获取当前项
var item = menuList[key];
// 如果当前项的链接与目标链接匹配
if (item.href === href) {
// 将当前项的标题添加到结果数组中
array.push(item.title);
// 终止循环
break;
}
// 如果当前项有子菜单
if (item.child) {
// 递归调用自身,处理子菜单
newArray = miniPage.buildPageTitleArray(href, item.child);
// 如果子菜单中有匹配项
if (newArray.length > 0) {
// 将当前项的标题添加到子菜单结果数组的开头
newArray.unshift(item.title);
// 合并当前项的标题和子菜单结果数组到最终结果数组中
array = array.concat(newArray);
// 终止循环
break;
}
}
}
// 返回最终结果数组
return array;
},
/**
* 获取指定链接内容
* @param href
* @returns {string}
*/
getHrefContent: function (href) {
// 初始化一个空字符串变量,用于存储获取的内容
var content = '';
// 获取当前时间的时间戳,用于防止缓存
var v = new Date().getTime();
// 发送AJAX请求以获取指定URL的内容
$.ajax({
// 根据URL是否包含查询参数来决定如何添加时间戳
url: href.indexOf("?") > -1 ? href + '&v=' + v : href + '?v=' + v,
// 设置请求类型为GET
type: 'get',
// 期望的响应数据类型为HTML
dataType: 'html',
// 设置请求为同步,等待响应后再继续执行后续代码
async: false,
// 请求成功时的回调函数
success: function (data) {
// 将获取到的数据赋值给content变量
content = data;
},
// 请求失败时的回调函数
error: function (xhr, textstatus, thrown) {
// 显示错误信息并返回提示消息
return layer.msg('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!');
}
});
// 返回获取到的内容
return content;
},
/**
* 获取弹出层的宽高
* @returns {jQuery[]}
*/
getOpenWidthHeight: function () {
// 获取页面内容区域的宽度
var clienWidth = $(".layuimini-content-page").width();
// 获取页面内容区域的高度
var clientHeight = $(".layuimini-content-page").height();
// 获取页面内容区域相对于文档的左偏移量
var offsetLeft = $(".layuimini-content-page").offset().left;
// 获取页面内容区域相对于文档的上偏移量
var offsetTop = $(".layuimini-content-page").offset().top;
// 返回包含宽度、高度、上偏移量和左偏移量的数组
return [clienWidth, clientHeight, offsetTop, offsetLeft];
},
/**
* 单模块切换
* @param tabId
*/
listenSwitchSingleModule: function (tabId) {
// 遍历所有具有layuimini-href属性的元素
$("[layuimini-href]").each(function () {
// 如果元素的layuimini-href属性值等于传入的tabId
if ($(this).attr("layuimini-href") === tabId) {
// 定义一个函数用于自动展开菜单栏
var addMenuClass = function ($element, type) {
if (type === 1) {
// 为当前元素添加layui-this类
$element.addClass('layui-this');
// 如果当前元素同时拥有layui-nav-item和layui-this类
if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-this')) {
// 将所有菜单项的类名设置为layui-nav-item
$(".layuimini-header-menu li").attr('class', 'layui-nav-item');
} else {
// 递归调用addMenuClass,处理父级元素
addMenuClass($element.parent().parent(), 2);
}
} else {
// 为当前元素添加layui-nav-itemed类
$element.addClass('layui-nav-itemed');
// 如果当前元素同时拥有layui-nav-item和layui-nav-itemed类
if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-nav-itemed')) {
// 将所有菜单项的类名设置为layui-nav-item
$(".layuimini-header-menu li").attr('class', 'layui-nav-item');
} else {
// 递归调用addMenuClass,处理父级元素
addMenuClass($element.parent().parent(), 2);
}
}
};
// 调用addMenuClass函数,展开当前元素的菜单栏
addMenuClass($(this).parent(), 1);
// 终止each循环
return false;
}
});
},
/**
* 多模块切换
* @param tabId
*/
listenSwitchMultiModule: function (tabId) {
// 遍历所有具有 layuimini-href 属性的元素
$("[layuimini-href]").each(function () {
// 如果元素的 layuimini-href 属性值等于传入的 tabId
if ($(this).attr("layuimini-href") === tabId) {
// 定义一个函数,用于自动展开菜单栏
var addMenuClass = function ($element, type) {
if (type === 1) {
// 为元素添加 'layui-this' 类
$element.addClass('layui-this');
// 如果元素同时具有 'layui-nav-item' 和 'layui-this' 类
if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-this')) {
// 获取父元素的 id
var moduleId = $element.parent().attr('id');
// 设置头部菜单项的类名为 'layui-nav-item'
$(".layuimini-header-menu li").attr('class', 'layui-nav-item');
// 为对应的头部菜单项添加 'layui-this' 类
$("#" + moduleId + "HeaderId").addClass("layui-this");
// 隐藏左侧菜单树
$(".layuimini-menu-left .layui-nav.layui-nav-tree").attr('class', 'layui-nav layui-nav-tree layui-hide');
// 显示当前模块的菜单树并添加 'layui-this' 类
$("#" + moduleId).attr('class', 'layui-nav layui-nav-tree layui-this');
} else {
// 递归调用 addMenuClass 函数,处理父级元素
addMenuClass($element.parent().parent(), 2);
}
} else {
// 为元素添加 'layui-nav-itemed' 类
$element.addClass('layui-nav-itemed');
// 如果元素同时具有 'layui-nav-item' 和 'layui-nav-itemed' 类
if ($element.hasClass('layui-nav-item') && $element.hasClass('layui-nav-itemed')) {
// 获取父元素的 id
var moduleId = $element.parent().attr('id');
// 设置头部菜单项的类名为 'layui-nav-item'
$(".layuimini-header-menu li").attr('class', 'layui-nav-item');
// 为对应的头部菜单项添加 'layui-this' 类
$("#" + moduleId + "HeaderId").addClass("layui-this");
// 隐藏左侧菜单树
$(".layuimini-menu-left .layui-nav.layui-nav-tree").attr('class', 'layui-nav layui-nav-tree layui-hide');
// 显示当前模块的菜单树并添加 'layui-this' 类
$("#" + moduleId).attr('class', 'layui-nav layui-nav-tree layui-this');
} else {
// 递归调用 addMenuClass 函数,处理父级元素
addMenuClass($element.parent().parent(), 2);
}
}
};
// 调用 addMenuClass 函数,处理当前元素的父级元素
addMenuClass($(this).parent(), 1);
return false; // 终止 each 循环
}
});
},
/**
* 修改hash地址定位
* @param href
*/
hashChange: function (href) {
// 将传入的 href 参数拼接到当前 URL 的哈希部分,并更新浏览器地址栏
window.location.hash = "/" + href;
},
/**
* 修改hash地址为主页
*/
hashHome: function () {
// 将当前窗口的哈希值设置为根路径 "/"
window.location.hash = "/";
},
/**
* 监听
* @param options
*/
/**
* 监听函数,用于处理传入的选项参数。
* @param {Object} options - 配置选项对象。
*/
listen: function (options) {
// 方法体内容待补充
/**
* 打开新窗口
*/
$('body').on('click', '[layuimini-href]', function () {
// 显示加载动画,设置2秒后自动关闭
var loading = layer.load(0, {shade: false, time: 2 * 1000});
// 获取当前点击元素的layuimini-href属性值和target属性值
var href = $(this).attr('layuimini-href'),
target = $(this).attr('target');
// 如果href为空,则直接返回
if(!href) return;
// 保存当前点击的元素引用
var me = this;
// 查找左侧菜单中与当前点击元素href相同的元素
var el = $("[layuimini-href='"+href+"']",".layuimini-menu-left");
// 关闭之前打开的提示框
layer.close(window.openTips);
// 如果找到匹配的元素
if(el.length){
// 移除所有layui-this类名
$(el).closest(".layui-nav-tree").find(".layui-this").removeClass("layui-this");
// 给父元素添加layui-this类名
$(el).parent().addClass("layui-this");
}
// 如果target属性值为_blank,则在新窗口中打开链接
if (target === '_blank') {
// 关闭加载动画
layer.close(loading);
// 在新窗口中打开链接
window.open(href, "_blank");
return false;
}
// 调用miniPage对象的hashChange方法,改变页面URL的哈希值
miniPage.hashChange(href);
// 设置左侧菜单的layuimini-page-add属性为yes
$('.layuimini-menu-left').attr('layuimini-page-add', 'yes');
// 关闭加载动画
layer.close(loading);
});
/**
* 在子页面上打开新窗口
*/
$('body').on('click', '[layuimini-content-href]', function () {
// 显示加载动画,设置2秒后自动关闭
var loading = parent.layer.load(0, {shade: false, time: 2 * 1000});
// 获取点击元素的href、title和target属性值
var href = $(this).attr('layuimini-content-href'),
title = $(this).attr('data-title'),
target = $(this).attr('target');
// 如果href为空,则直接返回
if(!href) return;
// 保存当前点击的元素引用
var me = this;
// 查找左侧菜单中匹配的href元素
var el = $("[layuimini-href='"+href+"']",".layuimini-menu-left");
// 关闭之前打开的提示框
layer.close(window.openTips);
// 如果找到匹配的元素
if(el.length){
// 移除所有同级元素的'layui-this'类
$(el).closest(".layui-nav-tree").find(".layui-this").removeClass("layui-this");
// 给父元素添加'layui-this'类
$(el).parent().addClass("layui-this");
}
// 如果target属性为'_blank',则在新窗口中打开链接
if (target === '_blank') {
// 关闭加载动画
parent.layer.close(loading);
// 在新窗口中打开链接
window.open(href, "_blank");
return false;
}
// 将页面标题存储到sessionStorage中
sessionStorage.setItem('layuimini_page_title', title);
// 调用hashChange方法更新页面内容
miniPage.hashChange(href);
// 关闭加载动画
parent.layer.close(loading);
});
/**
* 返回主页
*/
$('body').on('click', '.layuimini-back-home', function () {
// 当点击事件触发时,调用 miniPage 对象的 hashHome 方法
miniPage.hashHome();
});
},
/**
* 监听hash变化
* @returns {boolean}
*/
listenHash: function (options) {
// 初始化homeInfo选项,如果未定义则设置为空对象
options.homeInfo = options.homeInfo || {};
// 初始化multiModule选项,如果未定义则设置为false
options.multiModule = options.multiModule || false;
// 初始化listenSwichCallback选项,如果未定义则设置为空函数
options.listenSwichCallback = options.listenSwichCallback || function () {};
// 监听hash变化事件
window.onhashchange = function () {
// 获取当前hash值并去掉前缀'#/'
var href = location.hash.replace(/^#\//, '');
// 如果listenSwichCallback是函数,则调用它
if (typeof options.listenSwichCallback === 'function') {
options.listenSwichCallback();
}
// 根据hash值判断要渲染的页面
if (href === null || href === undefined || href === '') {
// 如果hash值为空,移除layui-this类并渲染首页
$("[layuimini-href]").parent().removeClass('layui-this');
miniPage.renderHome(options);
} else {
// 否则渲染指定页面
miniPage.renderPage(href, options);
}
// 检查菜单是否添加了新页面
if ($('.layuimini-menu-left').attr('layuimini-page-add') === 'yes') {
// 如果是,则重置属性为'no'
$('.layuimini-menu-left').attr('layuimini-page-add', 'no');
} else {
// 如果不是,重新定位菜单焦点
$("[layuimini-href]").parent().removeClass('layui-this');
if (options.multiModule) {
// 多模块情况下处理菜单切换
miniPage.listenSwitchMultiModule(href);
} else {
// 单模块情况下处理菜单切换
miniPage.listenSwitchSingleModule(href);
}
}
};
},