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.

450 lines
19 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(["jquery", "miniMenu", "element","miniPage", "miniTheme","axios","store"], function (exports) { // 定义一个模块,依赖列表包括 jQuery, miniMenu, element, miniPage, miniTheme, axios, store
var $ = layui.$, // 获取 jQuery 模块并赋值给变量 $
element = layui.element, // 获取 element 模块并赋值给变量 element
layer = layui.layer, // 获取 layer 模块并赋值给变量 layer
miniMenu = layui.miniMenu, // 获取 miniMenu 模块并赋值给变量 miniMenu
miniTheme = layui.miniTheme, // 获取 miniTheme 模块并赋值给变量 miniTheme
store = layui.store, // 获取 store 模块并赋值给变量 store
axios = layui.axios, // 获取 axios 模块并赋值给变量 axios
miniPage = layui.miniPage;
if (!/http(s*):\/\//.test(location.href)) { // 检查当前页面的URL是否以http或https开头如果不是则执行以下代码块
var tips = "请先将项目部署至web容器Apache/Tomcat/Nginx/IIS/等),否则部分数据将无法显示"; // 定义提示信息告知用户需要将项目部署到Web容器中
return layer.alert(tips); // 使用layer.alert方法弹出提示框显示上述提示信息并终止后续代码的执行
}
var miniAdmin = { // 定义一个名为miniAdmin的对象用于存放后续的代码逻辑和功能实现
render: function (options) {
options.iniUrl = options.iniUrl || null; // 初始化URL默认为null
options.logoInfo = options.logoInfo || null; // Logo信息默认为null
options.homeInfo = options.homeInfo || null; // 首页信息默认为null
options.clearUrl = options.clearUrl || null; // 清除URL默认为null
options.renderPageVersion = options.renderPageVersion || false; // 是否渲染页面版本默认为false
options.bgColorDefault = options.bgColorDefault || 0; // 默认背景颜色默认为0
options.multiModule = options.multiModule || false; // 是否支持多模块默认为false
options.menuChildOpen = options.menuChildOpen || false; // 菜单子项是否默认展开默认为false
options.loadingTime = options.loadingTime || 1; // 加载时间默认为1秒
options.pageAnim = options.pageAnim || false; // 页面动画效果默认为false
}
// 使用axios发送GET请求获取初始化数据
axios.get(options.iniUrl).then(function (data) {
// 如果返回的数据为空,显示错误信息
if (data == null) {
miniAdmin.error('暂无菜单信息')
} else {
// 渲染logo信息
miniAdmin.renderLogo(options.logoInfo);
// 渲染清除按钮
miniAdmin.renderClear(options.clearUrl);
// 渲染页面动画效果
miniAdmin.renderAnim(options.pageAnim);
// 监听并处理首页信息和多模块信息
miniAdmin.listen({
// 监听homeInfo属性并传递options对象中的homeInfo值
homeInfo: options.homeInfo,
// 监听multiModule属性并传递options对象中的multiModule值
multiModule: options.multiModule,
})
miniMenu.render({
// 将数据列表传递给菜单渲染函数
menuList: data.data,
// 传递是否支持多模块的选项
multiModule: options.multiModule,
// 传递子菜单默认打开状态的选项
menuChildOpen: options.menuChildOpen
});
miniPage.render({
// 设置首页信息从options对象中获取homeInfo属性
homeInfo: options.homeInfo,
// 设置菜单列表数据从data对象的data属性中获取
menuList: data.data,
// 设置是否启用多模块功能从options对象中获取multiModule属性
multiModule: options.multiModule,
// 设置页面渲染版本从options对象中获取renderPageVersion属性
renderPageVersion: options.renderPageVersion,
// 设置子菜单是否默认打开从options对象中获取menuChildOpen属性
menuChildOpen: options.menuChildOpen,
// 定义监听切换回调函数当触发时调用miniAdmin的renderDevice方法
listenSwichCallback: function () {
miniAdmin.renderDevice();
}
});
miniTheme.render({
// 设置默认背景颜色
bgColorDefault: options.bgColorDefault,
// 监听事件
listen: true,
});
// 删除加载器,传入加载时间参数
miniAdmin.deleteLoader(options.loadingTime);
}
}).catch(function () {
// 捕获错误并显示错误信息
miniAdmin.error('菜单接口有误');
})
},
/**
* 初始化logo
* @param data
*/
renderLogo: function (data) {
// 生成包含logo图片和标题的HTML字符串
var html = '<a href="javascript:;"><img src="' + data.image + '" alt="logo"><h1>' + data.title + '</h1></a>';
// 将生成的HTML字符串插入到class为layuimini-logo的元素中
$('.layuimini-logo').html(html);
},
/**
* 初始化缓存地址
* @param clearUrl
*/
renderClear: function (clearUrl) {
// 将传入的URL设置为'.layuimini-clear'元素的data-href属性值
$('.layuimini-clear').attr('data-href', clearUrl);
},
/**
* 切换菜单动画
* @param anim
*/
renderAnim: function (anim) {
// 检查传入的动画参数是否存在
if (anim) {
// 在ID为'layuimini-bg-color'的元素之后插入一段样式代码,用于定义页面动画效果
$('#layuimini-bg-color').after('<style id="layuimini-page-anim">' +
// 定义动画名称和持续时间,以及填充模式
'.layuimini-page-anim {-webkit-animation-name:layuimini-upbit;-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;}\n' +
// 使用@keyframes定义动画关键帧
'@keyframes layuimini-upbit {0% {transform:translate3d(0,30px,0);opacity:.3;}\n' +
// 动画从初始状态到结束状态的变化
'100% {transform:translate3d(0,0,0);opacity:1;}\n' +
'}\n' +
'</style>');
}
},
/**
* 进入全屏
*/
fullScreen: function () {
// 获取文档的根元素
var el = document.documentElement;
// 获取不同浏览器的全屏请求方法
var rfs = el.requestFullScreen || el.webkitRequestFullScreen;
// 如果支持标准的全屏请求方法,则调用该方法
if (typeof rfs != "undefined" && rfs) {
rfs.call(el);
}
// 如果支持ActiveXObject主要用于IE则通过发送F11键实现全屏
else if (typeof window.ActiveXObject != "undefined") {
var wscript = new ActiveXObject("WScript.Shell");
if (wscript != null) {
wscript.SendKeys("{F11}");
}
}
// 针对IE的msRequestFullscreen方法
else if (el.msRequestFullscreen) {
el.msRequestFullscreen();
}
// 针对Opera的oRequestFullscreen方法
else if (el.oRequestFullscreen) {
el.oRequestFullscreen();
}
// 针对Webkit内核的webkitRequestFullscreen方法
else if (el.webkitRequestFullscreen) {
el.webkitRequestFullscreen();
}
// 针对Firefox的mozRequestFullScreen方法
else if (el.mozRequestFullScreen) {
el.mozRequestFullScreen();
}
// 如果以上方法都不支持,则提示用户浏览器不支持全屏调用
else {
miniAdmin.error('浏览器不支持全屏调用!');
}
},
/**
* 退出全屏
*/
exitFullScreen: function () {
// 获取文档对象
var el = document;
// 定义取消全屏的方法,兼容不同浏览器
var cfs = el.cancelFullScreen || el.webkitCancelFullScreen || el.exitFullScreen;
// 如果存在取消全屏方法并且该方法可用
if (typeof cfs != "undefined" && cfs) {
// 调用取消全屏方法
cfs.call(el);
} else if (typeof window.ActiveXObject != "undefined") {
// 针对IE浏览器的处理方式
var wscript = new ActiveXObject("WScript.Shell");
if (wscript != null) {
// 发送F11键以退出全屏模式
wscript.SendKeys("{F11}");
}
} else if (el.msExitFullscreen) {
// 针对IE11及以下版本的处理方式
el.msExitFullscreen();
} else if (el.oRequestFullscreen) {
// 针对Opera浏览器的处理方式
el.oCancelFullScreen();
} else if (el.mozCancelFullScreen) {
// 针对Firefox浏览器的处理方式
el.mozCancelFullScreen();
} else if (el.webkitCancelFullScreen) {
// 针对Webkit内核的浏览器如Chrome和Safari的处理方式
el.webkitCancelFullScreen();
} else {
// 如果以上所有方法都不可用,提示用户浏览器不支持全屏调用
miniAdmin.error('浏览器不支持全屏调用!');
}
},
/**
* 初始化设备端
*/
renderDevice: function () {
// 如果当前是移动设备
if (miniAdmin.checkMobile()) {
// 设置工具栏图标的属性为展开状态
$('.layuimini-tool i').attr('data-side-fold', 1);
// 更改工具栏图标的类名为“fa fa-outdent”
$('.layuimini-tool i').attr('class', 'fa fa-outdent');
// 移除布局主体的最小化样式
$('.layui-layout-body').removeClass('layuimini-mini');
// 添加布局主体的全部显示样式
$('.layui-layout-body').addClass('layuimini-all');
}
},
/**
* 初始化加载时间
* @param loadingTime
*/
deleteLoader: function (loadingTime) {
// 设置一个定时器,在指定的时间后执行回调函数
setTimeout(function () {
// 使用jQuery选择器找到类名为'layuimini-loader'的元素,并使其淡出
$('.layuimini-loader').fadeOut();
}, loadingTime * 1000) // 将传入的loadingTime参数转换为毫秒
},
/**
* 成功
* @param title
* @returns {*}
*/
success: function (title) {
// 调用layer.msg方法显示消息提示框
// title: 要显示的消息内容
// icon: 1 表示成功图标
// shade: 使用当前对象的shade属性作为遮罩层
// scrollbar: false 表示不显示滚动条
// time: 2000 表示消息提示框显示时间为2秒
// shadeClose: true 表示点击遮罩层可以关闭提示框
return layer.msg(title, {icon: 1, shade: this.shade, scrollbar: false, time: 2000, shadeClose: true});
},
/**
* 失败
* @param title
* @returns {*}
*/
error: function (title) {
// 调用layer.msg方法显示错误消息
// title: 要显示的消息内容
// icon: 2 表示使用错误图标
// shade: 使用当前对象的shade属性值
// scrollbar: false 表示不显示滚动条
// time: 3000 表示消息显示时间为3秒
// shadeClose: true 表示点击遮罩层可以关闭消息框
return layer.msg(title, {icon: 2, shade: this.shade, scrollbar: false, time: 3000, shadeClose: true});
},
/**
* 判断是否为手机
* @returns {boolean}
*/
checkMobile: function () {
// 获取用户代理字符串并转换为小写
var ua = navigator.userAgent.toLocaleLowerCase();
// 获取平台信息并转换为小写
var pf = navigator.platform.toLocaleLowerCase();
// 判断是否为Android设备
var isAndroid = (/android/i).test(ua) || ((/iPhone|iPod|iPad/i).test(ua) && (/linux/i).test(pf))
|| (/ucweb.*linux/i.test(ua));
// 判断是否为iOS设备排除Android设备
var isIOS = (/iPhone|iPod|iPad/i).test(ua) && !isAndroid;
// 判断是否为Windows Phone设备
var isWinPhone = (/Windows Phone|ZuneWP7/i).test(ua);
// 获取文档的宽度
var clientWidth = document.documentElement.clientWidth;
// 如果既不是Android、iOS也不是Windows Phone并且宽度大于1024则返回false
if (!isAndroid && !isIOS && !isWinPhone && clientWidth > 1024) {
return false;
} else {
// 否则返回true
return true;
}
},
/**
* 监听
* @param options
*/
listen: function (options) {
// 如果 options 对象中没有 homeInfo 属性,则初始化为一个空对象
options.homeInfo = options.homeInfo || {};
}
/**
* 清理
*/
$('body').on('click', '[data-clear]', function () {
// 显示加载动画设置2秒后自动关闭
var loading = layer.load(0, {shade: false, time: 2 * 1000});
// 清空浏览器的sessionStorage
sessionStorage.clear();
// 获取清理缓存的URL
var clearUrl = $(this).attr('data-href');
// 如果URL存在且不为空
if (clearUrl != undefined && clearUrl != '' && clearUrl != null) {
// 发送GET请求到服务器清理缓存
$.getJSON(clearUrl, function (data, status) {
// 关闭加载动画
layer.close(loading);
// 根据服务器返回的状态码判断是否成功
if (data.code != 1) {
// 清理失败,显示错误信息
return miniAdmin.error(data.msg);
} else {
// 清理成功,显示成功信息
return miniAdmin.success(data.msg);
}
}).fail(function () {
// 请求失败,关闭加载动画并显示错误信息
layer.close(loading);
return miniAdmin.error('清理缓存接口有误');
});
} else {
// URL不存在或为空直接关闭加载动画并显示成功信息
layer.close(loading);
return miniAdmin.success('清除缓存成功');
}
});
/**
* 刷新
*/
$('body').on('click', '[data-refresh]', function () {
// 当点击带有 data-refresh 属性的元素时,触发此事件处理函数
miniPage.refresh(options);
// 调用 miniPage 对象的 refresh 方法,并传入 options 参数进行页面刷新
miniAdmin.success('刷新成功');
// 调用 miniAdmin 对象的 success 方法,显示“刷新成功”的提示信息
});
/**
* 监听提示信息
*/
$("body").on("mouseenter", ".layui-nav-tree .menu-li", function () {
// 如果当前是移动设备,则不执行后续代码
if (miniAdmin.checkMobile()) {
return false;
}
// 获取当前元素的class属性值
var classInfo = $(this).attr('class'),
// 获取当前元素的HTML内容
tips = $(this).prop("innerHTML"),
// 获取工具栏的折叠状态
isShow = $('.layuimini-tool i').attr('data-side-fold');
// 如果工具栏未折叠且tips存在
if (isShow == 0 && tips) {
// 构建提示信息HTML结构
tips = "<ul class='layuimini-menu-left-zoom layui-nav layui-nav-tree layui-this'><li class='layui-nav-item layui-nav-itemed'>"+tips+"</li></ul>";
// 显示提示信息
window.openTips = layer.tips(tips, $(this), {
tips: [2, '#2f4056'], // 设置提示信息的位置和颜色
time: 300000, // 设置提示信息的显示时间
skin:"popup-tips", // 设置提示信息的样式
// 成功回调函数
success:function (el) {
// 调整提示信息的位置
var left = $(el).position().left - 10;
$(el).css({ left:left });
// 重新渲染元素
element.render();
}
});
}
});
$("body").on("mouseleave", ".popup-tips", function () {
// 当鼠标离开具有类名 'popup-tips' 的元素时触发事件
if (miniAdmin.checkMobile()) {
// 如果当前设备是移动设备,则直接返回 false不执行后续代码
return false;
}
// 获取具有类名 'layuimini-tool i' 的元素的 'data-side-fold' 属性值
var isShow = $('.layuimini-tool i').attr('data-side-fold');
if (isShow == 0) {
// 如果 'data-side-fold' 属性值为 0表示侧边栏未展开
try {
// 尝试关闭弹出提示框
layer.close(window.openTips);
} catch (e) {
// 如果关闭过程中发生异常,捕获异常并打印错误信息到控制台
console.log(e.message);
}
}
});
/**
* 全屏
*/
$('body').on('click', '[data-check-screen]', function () {
// 获取当前元素的 data-check-screen 属性值
var check = $(this).attr('data-check-screen');
// 如果属性值为 'full',则进入全屏模式
if (check == 'full') {
// 调用 miniAdmin 的 fullScreen 方法进入全屏模式
miniAdmin.fullScreen();
// 将属性值改为 'exit'
$(this).attr('data-check-screen', 'exit');
// 修改按钮图标为压缩图标
$(this).html('<i class="fa fa-compress"></i>');
} else {
// 否则退出全屏模式
miniAdmin.exitFullScreen();
// 将属性值改为 'full'
$(this).attr('data-check-screen', 'full');
// 修改按钮图标为箭头图标
$(this).html('<i class="fa fa-arrows-alt"></i>');
}
});
/**
* 点击遮罩层
*/
$('body').on('click', '.layuimini-make', function () {
// 调用 miniAdmin 的 renderDevice 方法重新渲染设备
miniAdmin.renderDevice();
});
}
};
// 导出 miniAdmin 模块
exports("miniAdmin", miniAdmin);
});