//视图路由
|
layui
|
.extend({
|
loadBar: 'lay/modules/loadBar',
|
dropdown: 'lay/modules/dropdown'
|
})
|
.define(
|
['jquery', 'laytpl', 'element', 'form', 'loadBar', 'dropdown'],
|
function (exports) {
|
var $ = layui.jquery;
|
var laytpl = layui.laytpl;
|
var conf = layui.conf;
|
conf.viewTabs = currentUser.isTab === '1';
|
var loadBar = layui.loadBar;
|
var self = {
|
ie8:
|
navigator.appName === 'Microsoft Internet Explorer' &&
|
navigator.appVersion.split(';')[1].replace(/[ ]/g, '') === 'MSIE8.0',
|
container: $('#' + conf.container),
|
containerBody: null
|
};
|
self.loadBar = loadBar;
|
/**
|
* 字符串是否含有html标签的检测
|
* @param htmlStr
|
*/
|
self.checkHtml = function (htmlStr) {
|
var reg = /<[^>]+>/g;
|
return reg.test(htmlStr)
|
};
|
self.parse = function (container) {
|
if (container === undefined) container = self.containerBody;
|
var template =
|
container.get(0).tagName === 'SCRIPT'
|
? container
|
: container.find('[template]');
|
|
var renderTemplate = function (template, data, callback) {
|
laytpl(template.html()).render(data, function (html) {
|
try {
|
html = $(
|
self.checkHtml(html) ? html : '<span>' + html + '</span>'
|
)
|
} catch (err) {
|
html = $('<span>' + html + '</span>')
|
}
|
|
html.attr('is-template', true);
|
template.after(html);
|
if ($.isFunction(callback)) callback(html)
|
})
|
};
|
|
layui.each(template, function (index, t) {
|
var tem = $(t);
|
var url = tem.attr('lay-url') || '';
|
var api = tem.attr('lay-api') || '';
|
var type = tem.attr('lay-type') || 'get';
|
var data = new Function('return ' + tem.attr('lay-data'))();
|
var done = tem.attr('lay-done') || '';
|
|
if (url || api) {
|
//进行AJAX请求
|
self.request({
|
url: url,
|
api: api,
|
type: type,
|
data: data,
|
success: function (res) {
|
templateData = data;
|
renderTemplate(tem, res.data);
|
if (done) new Function(done)()
|
}
|
})
|
} else {
|
renderTemplate(
|
tem,
|
{},
|
self.ie8
|
? function (elem) {
|
if (elem[0] && elem[0].tagName !== 'LINK') return;
|
container.hide();
|
elem.load(function () {
|
container.show()
|
})
|
}
|
: null
|
);
|
if (done) new Function(done)()
|
}
|
})
|
};
|
self.loading = function (elem) {
|
elem.append(
|
(this.elemLoad = $(
|
'<i class="layui-anim layui-anim-rotate layui-anim-loop layui-icon layui-icon-loading febs-loading"></i>'
|
))
|
)
|
};
|
self.loadend = function () {
|
this.elemLoad && this.elemLoad.remove()
|
};
|
|
self.setTitle = function (title) {
|
$(document).attr({title: title + ' - ' + conf.name})
|
};
|
self.clear = function () {
|
self.containerBody.html('')
|
};
|
|
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:20px;height:36px;line-height:46px;padding-bottom:0;'
|
];
|
params = $.extend(
|
{
|
skin: 'layui-layer-admin-modal febs-alert',
|
area: [$(window).width() <= 750 ? '60%' : '400px'],
|
closeBtn: 0,
|
shadeClose: false
|
},
|
params
|
);
|
layer.alert(msg, params);
|
};
|
|
self.notify = 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.loadHtml = function (url, callback) {
|
url = url || conf.entry;
|
loadBar.start();
|
var queryIndex = url.indexOf('?');
|
if (queryIndex !== -1) url = url.slice(0, queryIndex);
|
$.ajax({
|
url:
|
(url.indexOf(conf.base) === 0 ? '' : conf.views) +
|
url +
|
conf.engine +
|
'?v=' +
|
conf.v,
|
type: 'get',
|
data: {
|
'invalid_ie_cache': new Date().getTime()
|
},
|
dataType: 'html',
|
success: function (r) {
|
var result;
|
try {
|
result = JSON.parse(r);
|
} catch (e) {
|
result = {'code': 'err'};
|
}
|
if (result.code === 401) {
|
self.notify('登录失效', '登录已失效,请重新登录', function () {
|
window.location.reload();
|
window.location.hash = '';
|
});
|
loadBar.finish();
|
return;
|
}
|
if (result.code === 403) {
|
self.tab.change('/403');
|
loadBar.finish();
|
return;
|
}
|
if (result.code === 404) {
|
self.tab.change('/404');
|
loadBar.finish();
|
return;
|
}
|
if (result.code === 500) {
|
self.tab.change('/500');
|
loadBar.finish();
|
return;
|
}
|
callback({html: r, url: url});
|
loadBar.finish()
|
},
|
error: function (res) {
|
if (res.status === 404) {
|
self.tab.change('/404');
|
}
|
if (res.status === 403) {
|
self.tab.change('/403');
|
}
|
if (res.status === 500) {
|
self.tab.change('/500');
|
}
|
self.log(
|
'请求视图文件异常\n文件路径:' + url + '\n状态:' + res.status
|
);
|
loadBar.error();
|
}
|
})
|
};
|
|
self.tab = {
|
isInit: false,
|
data: [],
|
tabMenuTplId: 'TPL-app-tabsmenu',
|
minLeft: null,
|
maxLeft: null,
|
wrap: '.febs-tabs-wrap',
|
menu: '.febs-tabs-menu',
|
next: '.febs-tabs-next',
|
prev: '.febs-tabs-prev',
|
step: 200,
|
init: function () {
|
var tab = this;
|
var btnCls = tab.wrap + ' .febs-tabs-btn';
|
|
layui.dropdown.render({
|
elem: '.febs-tabs-down',
|
click: function (name) {
|
if (name === 'all') {
|
tab.delAll();
|
}
|
if (name === 'other') {
|
tab.delOther();
|
}
|
if (name === 'current') {
|
tab.del(layui.febs.route.fileurl);
|
}
|
if (name === 'refresh') {
|
tab.refresh();
|
}
|
},
|
options: [
|
{
|
name: 'current',
|
title: '关闭当前选项卡'
|
},
|
{
|
name: 'other',
|
title: '关闭其他选项卡'
|
},
|
{
|
name: 'all',
|
title: '关闭所有选项卡'
|
},
|
{
|
name: 'refresh',
|
title: '刷新当前选项卡'
|
}
|
]
|
});
|
|
$(document).on('click', btnCls, function (e) {
|
var url = $(this).attr('lay-url');
|
if ($(e.target).hasClass('febs-tabs-close')) {
|
tab.del(url)
|
} else {
|
var type = $(this).attr('data-type');
|
if (type === 'page') {
|
tab.change(tab.has(url))
|
} else if (type === 'prev' || type === 'next') {
|
tab.menuElem = $(tab.menu);
|
var menu = tab.menuElem;
|
tab.minLeft = tab.minLeft || parseInt(menu.css('left'));
|
tab.maxLeft = tab.maxLeft || $(tab.next).offset().left;
|
|
var left = 0;
|
if (type === 'prev') {
|
left = parseInt(menu.css('left')) + tab.step;
|
if (left >= tab.minLeft) left = tab.minLeft
|
} else {
|
left = parseInt(menu.css('left')) - tab.step;
|
var last = menu.find('li:last');
|
if (last.offset().left + last.width() < tab.maxLeft) return
|
}
|
menu.css('left', left)
|
}
|
}
|
});
|
|
$('.febs-tabs-hidden').addClass('layui-show');
|
this.isInit = true
|
},
|
has: function (url) {
|
var exists = false;
|
layui.each(this.data, function (i, data) {
|
if (data.fileurl === url) return (exists = data)
|
});
|
return exists
|
},
|
delAll: function (type) {
|
var tab = this;
|
var menuBtnClas = tab.menu + ' .febs-tabs-btn';
|
$(menuBtnClas).each(function () {
|
var url = $(this).attr('lay-url');
|
if (url === conf.entry) return true;
|
tab.del(url)
|
})
|
},
|
delOther: function () {
|
var tab = this;
|
var menuBtnClas = tab.menu + ' .febs-tabs-btn';
|
$(menuBtnClas + '.febs-tabs-active')
|
.siblings()
|
.each(function () {
|
var url = $(this).attr('lay-url');
|
tab.del(url)
|
})
|
},
|
del: function (url, backgroundDel) {
|
var tab = this;
|
if (tab.data.length <= 1 && backgroundDel === undefined) return;
|
layui.each(tab.data, function (i, data) {
|
if (data.fileurl === url) {
|
tab.data.splice(i, 1);
|
return true
|
}
|
});
|
|
var lay = '[lay-url="' + url + '"]';
|
var thisBody = $(
|
'#' + conf.containerBody + ' > .febs-tabs-item' + lay
|
);
|
var thisMenu = $(this.menu).find(lay);
|
thisMenu.remove();
|
thisBody.remove();
|
|
if (backgroundDel === undefined) {
|
if (thisMenu.hasClass('febs-tabs-active')) {
|
$(this.menu + ' li:last').click()
|
}
|
}
|
},
|
refresh: function (url) {
|
url = url || layui.febs.route.fileurl;
|
if (this.has(url)) {
|
this.del(url, true);
|
self.renderTabs(url)
|
}
|
},
|
clear: function () {
|
this.data = [];
|
this.isInit = false;
|
$(document).off('click', this.wrap + ' .febs-tabs-btn')
|
},
|
change: function (route, callback) {
|
if (typeof route == 'string') {
|
route = layui.router('#' + route);
|
route.fileurl = '/' + route.path.join('/')
|
}
|
var fileurl = route.fileurl;
|
var tab = this;
|
if (tab.isInit === false) tab.init();
|
|
var changeView = function (lay) {
|
$('#' + conf.containerBody + ' > .febs-tabs-item' + lay)
|
.show()
|
.siblings()
|
.hide()
|
};
|
|
var lay = '[lay-url="' + fileurl + '"]';
|
|
var activeCls = 'febs-tabs-active';
|
|
var existsTab = tab.has(fileurl);
|
if (existsTab) {
|
var menu = $(this.menu);
|
var currentMenu = menu.find(lay);
|
|
if (existsTab.href !== route.href) {
|
tab.del(existsTab.fileurl, true);
|
tab.change(route);
|
return false
|
//tab.del(route.fileurl)
|
}
|
currentMenu
|
.addClass(activeCls)
|
.siblings()
|
.removeClass(activeCls);
|
|
changeView(lay);
|
|
this.minLeft = this.minLeft || parseInt(menu.css('left'));
|
|
var offsetLeft = currentMenu.offset().left;
|
if (offsetLeft - this.minLeft - $(this.next).width() < 0) {
|
$(this.prev).click()
|
} else if (offsetLeft - this.minLeft > menu.width() * 0.5) {
|
$(this.next).click()
|
}
|
$(document).scrollTop(-100);
|
|
layui.febs.navigate(route.href)
|
} else {
|
self.loadHtml(fileurl, function (res) {
|
var htmlElem = $(
|
"<div><div class='febs-tabs-item' lay-url='" +
|
fileurl +
|
"'>" +
|
res.html +
|
'</div></div>'
|
);
|
var params = self.fillHtml(fileurl, htmlElem, 'prepend');
|
route.title = params.title;
|
tab.data.push(route);
|
layui.febs.render(tab.tabMenuTplId);
|
|
var currentMenu = $(tab.menu + ' ' + lay);
|
currentMenu.addClass(activeCls);
|
|
changeView(lay);
|
|
if ($.isFunction(callback)) callback(params)
|
})
|
}
|
layui.febs.sidebarFocus(route.href);
|
return false
|
},
|
onChange: function () {
|
}
|
};
|
|
self.fillHtml = function (url, htmlElem, modeName) {
|
var fluid = htmlElem.find('.layui-fluid[lay-title]');
|
var title = '';
|
if (fluid.length > 0) {
|
title = fluid.attr('lay-title');
|
// self.setTitle(title)
|
}
|
|
var container = self.containerBody || self.container;
|
container[modeName](htmlElem.html());
|
if (modeName === 'prepend') {
|
self.parse(container.children('[lay-url="' + url + '"]'))
|
} else {
|
self.parse(container)
|
}
|
return {title: title, url: url, htmlElem: htmlElem}
|
};
|
//解析普通文件
|
self.render = function (fileurl, callback) {
|
self.loadHtml(fileurl, function (res) {
|
var htmlElem = $('<div>' + res.html + '</div>');
|
var params = self.fillHtml(res.url, htmlElem, 'html');
|
if ($.isFunction(callback)) callback(params)
|
})
|
};
|
//加载 tab
|
self.renderTabs = function (route, callback) {
|
var tab = self.tab;
|
tab.change(route, callback)
|
};
|
//加载layout文件
|
self.renderLayout = function (callback, url) {
|
if (url === undefined) url = 'layout';
|
self.containerBody = null;
|
|
self.render(url, function (res) {
|
self.containerBody = $('#' + conf.containerBody);
|
if (conf.viewTabs === true) {
|
self.containerBody.addClass('febs-tabs-body')
|
}
|
layui.febs.appBody = self.containerBody;
|
if ($.isFunction(callback)) callback()
|
})
|
};
|
//加载单页面
|
self.renderIndPage = function (fileurl, callback) {
|
self.renderLayout(function () {
|
self.containerBody = null;
|
if ($.isFunction(callback)) callback()
|
}, fileurl)
|
};
|
self.log = function (msg, type) {
|
if (conf.debug === false) return;
|
if (type === undefined) type = 'error';
|
console.error(msg)
|
};
|
self.createRequestParams = function (params) {
|
var success = params.success;
|
var error = params.error;
|
|
if (params.api) {
|
if (!layui.api[params.api]) {
|
self.log('请求错误 api.' + params.api + ' 不存在');
|
return
|
}
|
params.url = conf.requestUrl + layui.api[params.api]
|
} else if (params.url) {
|
params.url = conf.requestUrl + params.url
|
}
|
|
var defaultParams = {
|
timeout: 5000,
|
type: 'get',
|
dataType: 'json',
|
headers: conf.requestHeaders || {},
|
success: function (res) {
|
if ($.isFunction(success)) success(res)
|
},
|
error: function (res) {
|
if (res.status === conf.logoutHttpCode) {
|
// do nothing
|
} else {
|
layer.msg('请检查您的网络连接');
|
self.log('请检查您的网络连接,错误信息:' + JSON.stringify(res))
|
}
|
|
if ($.isFunction(error)) error(res)
|
}
|
};
|
|
if (self.ie8) {
|
if (conf.debug) $.support.cors = true;
|
defaultParams.cache = false
|
}
|
delete params.success;
|
delete params.error;
|
|
return $.extend(defaultParams, params)
|
};
|
self.request = function (params) {
|
params = self.createRequestParams(params);
|
$.ajax(params)
|
};
|
exports('view', self)
|
}
|
);
|