| //视图路由 | 
| 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) | 
|         } | 
|     ); |