layui.extend({
conf: 'config',
api: 'lay/modules/api',
view: 'lay/modules/view'
}).define(['conf', 'view', 'api', 'jquery', 'table'], function (exports) {
POPUP_DATA = {};
var conf = layui.conf;
var layuiTable = layui.table;
var view = layui.view;
var element = layui.element;
var $ = layui.jquery;
var $bread = $('#febs-layout .febs-breadcrumb');
layui.extend(conf.extend);
var self = {};
var windowWidth = $(window).width();
conf.viewTabs = currentUser.isTab === '1';
self.route = layui.router();
self.view = view;
self.api = layui.api;
self.closeOnceHashChange = false;
self.ie8 = view.ie8;
self.get = view.request;
self.appBody = null;
self.shrinkCls = 'febs-sidebar-shrink';
self.isInit = false;
self.routeLeaveFunc = null;
self.routeLeave = function (callback) {
this.routeLeaveFunc = callback
};
self.render = function (elem) {
if (typeof elem == 'string') elem = $('#' + elem);
var action = elem.get(0).tagName === 'SCRIPT' ? 'next' : 'find';
elem[action]('[is-template]').remove();
view.parse(elem)
};
//初始化整个页面
self.initPage = function (initCallback) {
//加载样式文件
layui.each(layui.conf.style, function (index, url) {
layui.link(url + '?v=' + conf.v)
});
self.initView(self.route)
String.prototype.startsWith = function (str) {
if (str == null || str === "" || this.length === 0 || str.length > this.length) {
return false;
}
return this.substr(0, str.length) === str;
};
};
self.post = function (params) {
view.request($.extend({type: 'post'}, params))
};
//初始化视图区域
self.initView = function (route) {
if (!self.route.href || self.route.href === '/') {
self.route = layui.router('#' + conf.entry);
route = self.route
}
route.fileurl = '/' + route.path.join('/');
if ($.inArray(route.fileurl, conf.indPage) === -1) {
var loadRenderPage = function (params) {
if (conf.viewTabs === true) {
view.renderTabs(route)
} else {
view.render(route.fileurl)
}
};
if (view.containerBody == null) {
//加载layout文件
view.renderLayout(function () {
//重新渲染导航
element.render('nav', 'febs-sidebar');
//加载视图文件
loadRenderPage()
})
} else {
//layout文件已加载,加载视图文件
loadRenderPage()
}
} else {
//加载单页面
view.renderIndPage(route.fileurl, function () {
if (conf.viewTabs === true) view.tab.clear()
})
}
};
//根据当前加载的 URL高亮左侧导航
self.sidebarFocus = function (url) {
url = url || self.route.href;
var elem = $('#app-sidebar')
.find('[lay-href="' + url + '"]')
.eq(0);
// $bread.empty();
if (elem.length > 0) {
// 生成面包屑
// var breadHtml = '';
// elem.parents('dl').prev('a').each(function (k, v) {
// var $this = $(this);
// breadHtml += '' + $this[0].innerText + ' / ';
// });
// breadHtml += '' + elem[0].innerText+ ' ';
// $bread.append(breadHtml);
elem.parents('.layui-nav-item').addClass('layui-nav-itemed')
.siblings().removeClass('layui-nav-itemed');
elem.click();
}
};
self.flexible = function (open) {
if (open === true) {
view.container.removeClass(self.shrinkCls)
} else {
view.container.addClass(self.shrinkCls)
}
};
self.on = function (name, callback) {
return layui.onevent(conf.eventName, 'system(' + name + ')', callback)
};
self.event = function (name, params) {
layui.event(conf.eventName, 'system(' + name + ')', params)
};
self.csshref = function (name) {
name = name === undefined ? self.route.path.join('/') : name;
return conf.css + 'views/' + name + '.css' + '?v=' + conf.v
};
self.prev = function (n) {
if (n === undefined) n = -1;
window.history.go(n)
};
self.navigate = function (url) {
if (url === conf.entry) url = '/';
window.location.hash = url
};
self.data = function (settings, storage) {
if (settings === undefined) return layui.data(conf.tableName);
if ($.isArray(settings)) {
layui.each(settings, function (i) {
layui.data(conf.tableName, settings[i], storage)
})
} else {
layui.data(conf.tableName, settings, storage)
}
};
self.isUrl = function (str) {
return /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/.test(
str
)
};
self.popup = function (params) {
var url = params.url || '';
var success = params.success || function () {
};
params.skin = 'layui-layer-admin-page';
POPUP_DATA = params.data || {};
var defaultParams = {
type: 1,
area: $(window).width() <= 750 ? ['90%', '90%'] : ['60%', '90%'],
shadeClose: true
};
if (self.isUrl(url)) {
params.type = 2;
params.content = url;
layer.open($.extend(defaultParams, params));
return
}
view.tab.del(url);
view.loadHtml(conf.views + url, function (res) {
var htmlElem = $('
' + res.html + '
');
if (params.title === undefined) {
params.title = htmlElem.find('title').text() || '信息';
if (params.title) htmlElem.find('title').remove()
}
params.content = htmlElem.html();
params.success = function (layer, index) {
success(layer, index);
view.parse(layer);
};
params = $.extend(defaultParams, params);
layer.open($.extend(defaultParams, params));
});
};
//当小于这个尺寸的时候会进行手机端的适配
var mobileWidth = 991;
var isMobileAdapter = false;
function mobileAdapter() {
self.flexible(false);
var device = layui.device();
if (device.weixin || device.android || device.ios) {
//点击空白处关闭侧边栏
$(document).on('click', '#' + conf.containerBody, function () {
if (
$(window).width() < mobileWidth &&
!view.container.hasClass(self.shrinkCls)
) {
self.flexible(false)
}
})
}
isMobileAdapter = true
}
$(window).on('resize', function (e) {
if ($(window).width() < mobileWidth) {
if (isMobileAdapter === true) return;
mobileAdapter()
} else {
isMobileAdapter = false
}
});
$(window).on('hashchange', function (e) {
//移动端跳转链接先把导航关闭
if ($(window).width() < mobileWidth) {
self.flexible(false)
}
self.route = layui.router();
layer.closeAll();
self.initView(self.route)
});
$(document).on('click', '[lay-href]', function (e) {
var href = $(this).attr('lay-href');
var target = $(this).attr('target');
if (href === '') return;
if (href.startsWith('http')) {
window.open(href)
}
if (self.isUrl(href)) {
next()
}
function next() {
target === '__blank' ? window.open(href) : self.navigate(href)
}
if ($.isFunction(self.routeLeaveFunc)) {
self.routeLeaveFunc(self.route + "asdfasdf", href, next)
} else {
next()
}
return false
});
$(document).on('click', '[lay-popup]', function (e) {
var params = $(this).attr('lay-popup');
self.popup(
params.indexOf('{') === 0
? new Function('return ' + $(this).attr('lay-popup'))()
: {url: params}
);
return false
});
$(document).on('mouseenter', '[lay-tips]', function (e) {
var title = $(this).attr('lay-tips');
var dire = $(this).attr('lay-dire') || 3;
if (title) {
layer.tips(title, $(this), {
tips: [dire, '#263147']
})
}
});
$(document).on('mouseleave', '[lay-tips]', function (e) {
layer.closeAll('tips')
});
$(document).on('click', '*[' + conf.eventName + ']', function (e) {
self.event($(this).attr(conf.eventName), $(this))
});
var shrinkSidebarBtn =
'.' + self.shrinkCls + ' #app-sidebar .layui-nav-item a';
$(document).on('click', shrinkSidebarBtn, function (e) {
if (isMobileAdapter === true) return;
var chileLength = $(this)
.parent()
.find('.layui-nav-child').length;
if (chileLength > 0) {
self.flexible(true);
layer.closeAll('tips')
}
});
$(document).on('mouseenter', shrinkSidebarBtn, function (e) {
var title = $(this).attr('title');
if (title) {
layer.tips(title, $(this).find('.layui-icon'), {
tips: [2, '#263147']
})
}
});
$(document).on('mouseleave', shrinkSidebarBtn, function (e) {
layer.closeAll('tips')
});
self.on('flexible', function (init) {
var status = view.container.hasClass(self.shrinkCls);
self.flexible(status);
self.data({key: 'flexible', value: status})
});
self.on('refresh', function (e) {
var url = self.route.href;
if (conf.viewTabs === true) {
//view.tab.refresh(url);
} else {
view.render(location.hash)
}
});
self.on('prev', function (e) {
self.prev()
});
if ($(window).width() <= mobileWidth) {
mobileAdapter()
} else {
var flexibleOpen = self.data().flexible;
self.flexible(flexibleOpen === undefined ? true : flexibleOpen)
}
self.modal = {};
self.modal.base = function (msg, params) {
params = params || {};
params.titleIcoColor = params.titleIcoColor || '#5a8bff';
params.titleIco = params.titleIco || 'exclaimination';
params.title = params.title || [
'' +
params.titleValue,
'background:#fff;border:none;font-weight:bold;font-size:16px;color:#08132b;padding-top:10px;height:36px;line-height:46px;padding-bottom:0;'
];
params = $.extend(
{
skin: 'layui-layer-admin-modal febs-alert',
area: [windowWidth <= 750 ? '60%' : '400px'],
closeBtn: 0,
shadeClose: false
},
params
);
layer.alert(msg, params);
};
// ----------------- 弹窗类 --------------------- //
self.alert = {};
function alertParams(msg, params) {
params.time = 3000;
params.shade = 0;
params.btn = null;
params.title = [
'' +
(msg || '请填写提示信息'),
'background:#fff;border:none;font-weight:500;font-size:14px;color:#08132b;margin-bottom:-50px;padding:16px;height:45px;line-height:14px;padding-bottom:0;'
];
params.offset = '40px';
params.area = [windowWidth <= 750 ? '80%' : '400px'];
}
self.alert.success = function (msg, params) {
params = params || {};
params.titleIco = 'ok';
params.titleIcoColor = '#30d180';
alertParams(msg, params);
self.modal.base('', params);
};
self.alert.warn = function (msg, params) {
params = params || {};
params.titleIco = 'exclaimination';
params.titleIcoColor = '#ffc107';
alertParams(msg, params);
self.modal.base('', params);
};
self.alert.error = function (msg, params) {
params = params || {};
params.titleIco = 'close';
params.titleIcoColor = '#ff5652';
alertParams(msg, params);
self.modal.base('', params);
};
self.alert.info = function (msg, params) {
params = params || {};
params.titleIco = 'infomation';
params.titleIcoColor = '#2db7f5';
alertParams(msg, params);
self.modal.base('', params);
};
// ----------------- 模态框类 --------------------- //
self.modal.confirm = function (title, msg, yes, no, params) {
params = params || {};
params.titleIco = 'exclaimination';
params.titleIcoColor = '#ffc107';
params.titleValue = title;
params.shadeClose = false;
params = $.extend({
btn: ['确定', '取消']
, yes: function (index, layero) {
yes && (yes)();
layer.close(index);
}
, btn2: function (index, layero) {
no && (no)();
}
}, params);
self.modal.base(msg, params);
};
self.modal.info = function (title, msg, yes, params) {
params = params || {};
params.titleIco = 'infomation';
params.titleIcoColor = '#2db7f5';
params.titleValue = title;
params.shadeClose = false;
params = $.extend({
btn: ['确定']
, yes: function (index, layero) {
yes && (yes)();
layer.close(index);
}
}, params);
self.modal.base(msg, params);
};
self.modal.warn = function (title, msg, yes, params) {
params = params || {};
params.titleIco = 'exclaimination';
params.titleIcoColor = '#ffc107';
params.titleValue = title;
params.shadeClose = false;
params = $.extend({
btn: ['确定']
, yes: function (index, layero) {
yes && (yes)();
layer.close(index);
}
}, params);
self.modal.base(msg, params);
};
self.modal.success = function (title, msg, yes, params) {
params = params || {};
params.titleIco = 'ok';
params.titleIcoColor = '#30d180';
params.titleValue = title;
params.shadeClose = false;
params = $.extend({
btn: ['确定']
, yes: function (index, layero) {
yes && (yes)();
layer.close(index);
}
}, params);
self.modal.base(msg, params);
};
self.modal.error = function (title, msg, yes, params) {
params = params || {};
params.titleIco = 'close';
params.titleIcoColor = '#ff5652';
params.titleValue = title;
params.shadeClose = false;
params = $.extend({
btn: ['确定']
, yes: function (index, layero) {
yes && (yes)();
layer.close(index);
}
}, params);
self.modal.base(msg, params);
};
self.modal.open = function (title, url, params) {
params = $.extend({
url: url,
maxmin: true,
shadeClose: false,
title: [
(title || '请填写头部信息'),
'font-size:16px;color:#08132b;line-height:46px;padding-bottom:0;border-bottom:1px solid #fcfcfc;background-color:#fcfcfc'
]
}, params);
self.popup(params);
};
self.modal.view = function (title, url, params) {
params = $.extend({
url: url,
maxmin: false,
shadeClose: false,
title: [
title,
'font-size:15px;color:#08132b;line-height:46px;height:48px;padding-bottom:0;background-color:#fff;border-bottom:none'
],
area: $(window).width() <= 750 ? ['80%', '80%'] : ['50%', '60%']
}, params);
self.popup(params);
};
// 数据表封装
self.table = {};
self.table.init = function (params) {
var defaultSetting = {
cellMinWidth: 80,
page: true,
skin: 'line row',
limit: 10,
limits: [5, 10, 20, 30, 40, 100],
autoSort: false,
request: {
pageName: 'pageNum',
limitName: 'pageSize'
},
parseData: function (res) {
return {
"code": res.code === 200 ? 0 : res.code,
"count": res.data.total,
"data": res.data.rows
}
}
};
return layuiTable.render(
$.extend({}, defaultSetting, params)
);
};
// ajax get请求
self.get = function (url, params, success) {
if (params) {
params.invalidate_ie_cache = new Date();
}
$.get(url, params, function (r) {
resolveResponse(r, success);
})
};
// ajax post请求
self.post = function (url, params, success) {
if (params) {
params.invalidate_ie_cache = new Date();
}
$.post(url, params, function (r) {
resolveResponse(r, success);
})
};
self.postForJson = function (url, params, success) {
if (params) {
params.invalidate_ie_cache = new Date();
}
$.post(url, params, function (r) {
resolveResponse(r, success);
}, "json")
};
// 文件下载
self.download = function (url, params, fileName) {
self.view.loadBar.start();
url += '?' + parseParams(params);
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = "blob";
xhr.onload = function () {
if (this.status === 200) {
self.view.loadBar.finish();
var fileType = this.response.type;
var blob = this.response;
var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = function (e) {
if ('msSaveOrOpenBlob' in navigator) { // IE,Edge
var base64file = e.target.result + '';
window.navigator.msSaveOrOpenBlob(createFile(base64file.replace('data:' + fileType + ';base64,', ''), fileType), fileName);
} else { // chrome,firefox
var link = document.createElement('a');
link.style.display = 'none';
link.href = e.target.result;
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
$(link).remove();
}
}
} else {
self.view.loadBar.error();
self.alert.error('下载失败');
}
};
xhr.send();
};
// 判断 a种的属性是否 b都有,并且弱相等
self.nativeEqual = function (a, b) {
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i];
if (!compare(a[propName], b[propName])) {
return false;
}
}
return true;
};
function resolveResponse(r, f) {
if (r.code === 200) {
f(r) && (f)();
} else if (r.code === 401) {
self.modal.info('登录失效', '登录已失效,请重新登录', function () {
window.location.href = ctx + 'login';
});
} else if (r.code === 403) {
self.alert.warn('对不起,您暂无该操作权限');
} else {
self.alert.error(r.message ? r.message : '操作失败');
console.error(r);
}
}
function compare(a, b) {
if (a === '' && b === null) {
return true;
} else if (a === null && b === '') {
return true;
} else {
return a == b;
}
}
function parseParams(param, key, encode) {
if (param == null) return '';
var arr = [];
var t = typeof (param);
if (t === 'string' || t === 'number' || t === 'boolean') {
arr.push(key + '=' + ((encode == null || encode) ? encodeURIComponent(param) : param));
} else {
for (var i in param) {
var k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i);
arr.push(parseParams(param[i], k, encode));
}
}
return arr.join("&");
}
// 解析 BASE64文件内容 for IE,Edge
function createFile(urlData, fileType) {
var bytes = window.atob(urlData),
n = bytes.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bytes.charCodeAt(n);
}
return new Blob([u8arr], {type: fileType});
}
exports('febs', self)
});