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 += '<a>' + $this[0].innerText + ' / </a>';
|
// });
|
// breadHtml += '<a>' + elem[0].innerText+ ' </a>';
|
// $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 = $('<div>' + res.html + '</div>');
|
|
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 || [
|
'<i class="layui-icon layui-icon-' +
|
params.titleIco +
|
'" style="font-size:12px;background:' +
|
params.titleIcoColor +
|
';display:inline-block;position:relative;top:-2px;height:21px;line-height:21px;text-align:center;width:21px;color:#fff;border-radius:50%;margin-right:12px;"></i>' +
|
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 = [
|
'<i class="layui-icon layui-icon-' +
|
params.titleIco +
|
'" style="font-size:12px;background:' +
|
params.titleIcoColor +
|
';display:inline-block;font-weight:600;position:relative;top:-2px;height:21px;line-height:21px;text-align:center;width:21px;color:#fff;border-radius:50%;margin-right:12px;"></i>' +
|
(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.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)
|
});
|