截流自动化的商城平台
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. /**
  2. @Name:layuiAdmin iframe版核心模块
  3. @Author:贤心
  4. @Site:http://www.layui.com/admin/
  5. @License:LPPL
  6. */
  7. layui.define('view', function(exports){
  8. var $ = layui.jquery
  9. ,laytpl = layui.laytpl
  10. ,element = layui.element
  11. ,setter = layui.setter
  12. ,view = layui.view
  13. ,device = layui.device()
  14. ,$win = $(window), $body = $('body')
  15. ,container = $('#'+ setter.container)
  16. ,SHOW = 'layui-show', HIDE = 'layui-hide', THIS = 'layui-this', DISABLED = 'layui-disabled', TEMP = 'template'
  17. ,APP_BODY = '#LAY_app_body', APP_FLEXIBLE = 'LAY_app_flexible'
  18. ,FILTER_TAB_TBAS = 'layadmin-layout-tabs'
  19. ,APP_SPREAD_SM = 'layadmin-side-spread-sm', TABS_BODY = 'layadmin-tabsbody-item'
  20. ,ICON_SHRINK = 'layui-icon-shrink-right', ICON_SPREAD = 'layui-icon-spread-left'
  21. ,SIDE_SHRINK = 'layadmin-side-shrink', SIDE_MENU = 'LAY-system-side-menu'
  22. //通用方法
  23. ,admin = {
  24. v: '1.4.0 std'
  25. //数据的异步请求
  26. ,req: view.req
  27. //清除本地 token,并跳转到登入页
  28. ,exit: view.exit
  29. //xss 转义
  30. ,escape: function(html){
  31. return String(html || '').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&')
  32. .replace(/</g, '&lt;').replace(/>/g, '&gt;')
  33. .replace(/'/g, '&#39;').replace(/"/g, '&quot;');
  34. }
  35. //事件监听
  36. ,on: function(events, callback){
  37. return layui.onevent.call(this, setter.MOD_NAME, events, callback);
  38. }
  39. //发送验证码
  40. ,sendAuthCode: function(options){
  41. options = $.extend({
  42. seconds: 60
  43. ,elemPhone: '#LAY_phone'
  44. ,elemVercode: '#LAY_vercode'
  45. }, options);
  46. var seconds = options.seconds
  47. ,btn = $(options.elem)
  48. ,token = null
  49. ,timer, countDown = function(loop){
  50. seconds--;
  51. if(seconds < 0){
  52. btn.removeClass(DISABLED).html('获取验证码');
  53. seconds = options.seconds;
  54. clearInterval(timer);
  55. } else {
  56. btn.addClass(DISABLED).html(seconds + '秒后重获');
  57. }
  58. if(!loop){
  59. timer = setInterval(function(){
  60. countDown(true);
  61. }, 1000);
  62. }
  63. };
  64. options.elemPhone = $(options.elemPhone);
  65. options.elemVercode = $(options.elemVercode);
  66. btn.on('click', function(){
  67. var elemPhone = options.elemPhone
  68. ,value = elemPhone.val();
  69. if(seconds !== options.seconds || $(this).hasClass(DISABLED)) return;
  70. if(!/^1\d{10}$/.test(value)){
  71. elemPhone.focus();
  72. return layer.msg('请输入正确的手机号')
  73. };
  74. if(typeof options.ajax === 'object'){
  75. var success = options.ajax.success;
  76. delete options.ajax.success;
  77. }
  78. admin.req($.extend(true, {
  79. url: '/auth/code'
  80. ,type: 'get'
  81. ,data: {
  82. phone: value
  83. }
  84. ,success: function(res){
  85. layer.msg('验证码已发送至你的手机,请注意查收', {
  86. icon: 1
  87. ,shade: 0
  88. });
  89. options.elemVercode.focus();
  90. countDown();
  91. success && success(res);
  92. }
  93. }, options.ajax));
  94. });
  95. }
  96. //屏幕类型
  97. ,screen: function(){
  98. var width = $win.width()
  99. if(width > 1200){
  100. return 3; //大屏幕
  101. } else if(width > 992){
  102. return 2; //中屏幕
  103. } else if(width > 768){
  104. return 1; //小屏幕
  105. } else {
  106. return 0; //超小屏幕
  107. }
  108. }
  109. //侧边伸缩
  110. ,sideFlexible: function(status){
  111. var app = container
  112. ,iconElem = $('#'+ APP_FLEXIBLE)
  113. ,screen = admin.screen();
  114. //设置状态,PC:默认展开、移动:默认收缩
  115. if(status === 'spread'){
  116. //切换到展开状态的 icon,箭头:←
  117. iconElem.removeClass(ICON_SPREAD).addClass(ICON_SHRINK);
  118. //移动:从左到右位移;PC:清除多余选择器恢复默认
  119. if(screen < 2){
  120. app.addClass(APP_SPREAD_SM);
  121. } else {
  122. app.removeClass(APP_SPREAD_SM);
  123. }
  124. app.removeClass(SIDE_SHRINK)
  125. } else {
  126. //切换到搜索状态的 icon,箭头:→
  127. iconElem.removeClass(ICON_SHRINK).addClass(ICON_SPREAD);
  128. //移动:清除多余选择器恢复默认;PC:从右往左收缩
  129. if(screen < 2){
  130. app.removeClass(SIDE_SHRINK);
  131. } else {
  132. app.addClass(SIDE_SHRINK);
  133. }
  134. app.removeClass(APP_SPREAD_SM)
  135. }
  136. layui.event.call(this, setter.MOD_NAME, 'side({*})', {
  137. status: status
  138. });
  139. }
  140. //弹出面板
  141. ,popup: view.popup
  142. //右侧面板
  143. ,popupRight: function(options){
  144. //layer.close(admin.popup.index);
  145. return admin.popup.index = layer.open($.extend({
  146. type: 1
  147. ,id: 'LAY_adminPopupR'
  148. ,anim: -1
  149. ,title: false
  150. ,closeBtn: false
  151. ,offset: 'r'
  152. ,shade: 0.1
  153. ,shadeClose: true
  154. ,skin: 'layui-anim layui-anim-rl layui-layer-adminRight'
  155. ,area: '300px'
  156. }, options));
  157. }
  158. //主题设置
  159. ,theme: function(options){
  160. var theme = setter.theme
  161. ,local = layui.data(setter.tableName)
  162. ,id = 'LAY_layadmin_theme'
  163. ,style = document.createElement('style')
  164. ,styleText = laytpl([
  165. //主题色
  166. '.layui-side-menu,'
  167. ,'.layadmin-pagetabs .layui-tab-title li:after,'
  168. ,'.layadmin-pagetabs .layui-tab-title li.layui-this:after,'
  169. ,'.layui-layer-admin .layui-layer-title,'
  170. ,'.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-item>.layui-nav-child'
  171. ,'{background-color:{{d.color.main}} !important;}'
  172. //选中色
  173. ,'.layui-nav-tree .layui-this,'
  174. ,'.layui-nav-tree .layui-this>a,'
  175. ,'.layui-nav-tree .layui-nav-child dd.layui-this,'
  176. ,'.layui-nav-tree .layui-nav-child dd.layui-this a'
  177. ,'{background-color:{{d.color.selected}} !important;}'
  178. //logo
  179. ,'.layui-layout-admin .layui-logo{background-color:{{d.color.logo || d.color.main}} !important;}'
  180. //头部色
  181. ,'{{# if(d.color.header){ }}'
  182. ,'.layui-layout-admin .layui-header{background-color:{{ d.color.header }};}'
  183. ,'.layui-layout-admin .layui-header a,'
  184. ,'.layui-layout-admin .layui-header a cite{color: #f8f8f8;}'
  185. ,'.layui-layout-admin .layui-header a:hover{color: #fff;}'
  186. ,'.layui-layout-admin .layui-header .layui-nav .layui-nav-more{border-top-color: #fbfbfb;}'
  187. ,'.layui-layout-admin .layui-header .layui-nav .layui-nav-mored{border-color: transparent; border-bottom-color: #fbfbfb;}'
  188. ,'.layui-layout-admin .layui-header .layui-nav .layui-this:after, .layui-layout-admin .layui-header .layui-nav-bar{background-color: #fff; background-color: rgba(255,255,255,.5);}'
  189. ,'.layadmin-pagetabs .layui-tab-title li:after{display: none;}'
  190. ,'{{# } }}'
  191. ].join('')).render(options = $.extend({}, local.theme, options))
  192. ,styleElem = document.getElementById(id);
  193. //添加主题样式
  194. if('styleSheet' in style){
  195. style.setAttribute('type', 'text/css');
  196. style.styleSheet.cssText = styleText;
  197. } else {
  198. style.innerHTML = styleText;
  199. }
  200. style.id = id;
  201. styleElem && $body[0].removeChild(styleElem);
  202. $body[0].appendChild(style);
  203. $body.attr('layadmin-themealias', options.color.alias);
  204. //本地存储记录
  205. local.theme = local.theme || {};
  206. layui.each(options, function(key, value){
  207. local.theme[key] = value;
  208. });
  209. layui.data(setter.tableName, {
  210. key: 'theme'
  211. ,value: local.theme
  212. });
  213. }
  214. //初始化主题
  215. ,initTheme: function(index){
  216. var theme = setter.theme;
  217. index = index || 0;
  218. if(theme.color[index]){
  219. theme.color[index].index = index;
  220. admin.theme({
  221. color: theme.color[index]
  222. });
  223. }
  224. }
  225. //记录最近一次点击的页面标签数据
  226. ,tabsPage: {}
  227. //获取页面标签主体元素
  228. ,tabsBody: function(index){
  229. return $(APP_BODY).find('.'+ TABS_BODY).eq(index || 0);
  230. }
  231. //切换页面标签主体
  232. ,tabsBodyChange: function(index, options){
  233. options = options || {};
  234. admin.tabsBody(index).addClass(SHOW).siblings().removeClass(SHOW);
  235. events.rollPage('auto', index);
  236. // 如果是控制台 关闭菜单那状态
  237. var id = $(TABS_HEADER).eq(index).find('span').attr('data-id');
  238. var text = $(TABS_HEADER).eq(index).find('span').html();
  239. if (id === undefined || text === "修改密码") {
  240. $(".first-nav .layui-nav-tree .layui-nav-item").removeClass("activate");
  241. $("#LAY_app_body").addClass("hide-second-nav");
  242. $("#view").html("");
  243. } else {
  244. // 如果是点击选项卡进行切换
  245. if (!("text" in options)) {
  246. // 1、得到二级菜单
  247. var menus = JSON.parse(localStorage.getItem("menus"));
  248. var data = [];
  249. menus.forEach(function (item) {
  250. if (parseInt(id) === item['id']) {
  251. data = item;
  252. }
  253. });
  254. // 2、切换一级菜单选择状态
  255. $(".first-nav .layui-nav .layui-nav-item").removeClass("activate");
  256. $(".first-nav .layui-nav .layui-nav-item[data-id="+id+"]").addClass("activate");
  257. // 3、是否存在二级菜单,不存在则隐藏
  258. if (data) {
  259. $("#LAY_app_body").removeClass('hide-second-nav');
  260. } else {
  261. $("#LAY_app_body").addClass('hide-second-nav');
  262. }
  263. // 使用模板引擎, 渲染二三级菜单
  264. var getTpl = document.getElementById('subMenu').innerHTML;
  265. var view = document.getElementById('view');
  266. laytpl(getTpl).render(data, function(html){
  267. view.innerHTML = html;
  268. });
  269. // 4、切换二级菜单选择状态
  270. $(".second-nav .layui-nav .layui-nav-item").removeClass("layui-this");
  271. $(".second-nav .layui-nav-tree .layui-nav-itemed dl dd").removeClass("layui-this");
  272. $(".second-nav .layui-nav .layui-nav-item a[lay-href='"+options.url+"']").parent().addClass("layui-this");
  273. }
  274. }
  275. //执行 {setter.MOD_NAME}.tabsPage 下的事件
  276. layui.event.call(this, setter.MOD_NAME, 'tabsPage({*})', {
  277. url: options.url
  278. ,text: options.text
  279. });
  280. }
  281. //resize事件管理
  282. ,resize: function(fn){
  283. var router = layui.router()
  284. ,key = router.path.join('-');
  285. if(admin.resizeFn[key]){
  286. $win.off('resize', admin.resizeFn[key]);
  287. delete admin.resizeFn[key];
  288. }
  289. if(fn === 'off') return; //如果是清除 resize 事件,则终止往下执行
  290. fn(), admin.resizeFn[key] = fn;
  291. $win.on('resize', admin.resizeFn[key]);
  292. }
  293. ,resizeFn: {}
  294. ,runResize: function(){
  295. var router = layui.router()
  296. ,key = router.path.join('-');
  297. admin.resizeFn[key] && admin.resizeFn[key]();
  298. }
  299. ,delResize: function(){
  300. this.resize('off');
  301. }
  302. //关闭当前 pageTabs
  303. ,closeThisTabs: function(){
  304. if(!admin.tabsPage.index) return;
  305. $(TABS_HEADER).eq(admin.tabsPage.index).find('.layui-tab-close').trigger('click');
  306. // 切换回上一级菜单
  307. var id = $(TABS_HEADER).eq(admin.tabsPage.index).find('span').attr('data-id');
  308. $(".first-nav .layui-nav .layui-nav-item").removeClass("activate");
  309. $(".first-nav .layui-nav .layui-nav-item[data-id="+id+"]").trigger("click");
  310. }
  311. //全屏
  312. ,fullScreen: function(){
  313. var ele = document.documentElement
  314. ,reqFullScreen = ele.requestFullScreen || ele.webkitRequestFullScreen
  315. || ele.mozRequestFullScreen || ele.msRequestFullscreen;
  316. if(typeof reqFullScreen !== 'undefined' && reqFullScreen) {
  317. reqFullScreen.call(ele);
  318. };
  319. }
  320. //退出全屏
  321. ,exitScreen: function(){
  322. var ele = document.documentElement
  323. if (document.exitFullscreen) {
  324. document.exitFullscreen();
  325. } else if (document.mozCancelFullScreen) {
  326. document.mozCancelFullScreen();
  327. } else if (document.webkitCancelFullScreen) {
  328. document.webkitCancelFullScreen();
  329. } else if (document.msExitFullscreen) {
  330. document.msExitFullscreen();
  331. }
  332. }
  333. //……
  334. };
  335. //事件
  336. var events = admin.events = {
  337. //伸缩
  338. flexible: function(othis){
  339. var iconElem = othis.find('#'+ APP_FLEXIBLE)
  340. ,isSpread = iconElem.hasClass(ICON_SPREAD);
  341. admin.sideFlexible(isSpread ? 'spread' : null);
  342. }
  343. //刷新
  344. ,refresh: function(){
  345. var ELEM_IFRAME = '.layadmin-iframe'
  346. ,length = $('.'+ TABS_BODY).length;
  347. if(admin.tabsPage.index >= length){
  348. admin.tabsPage.index = length - 1;
  349. }
  350. var iframe = admin.tabsBody(admin.tabsPage.index).find(ELEM_IFRAME);
  351. iframe[0].contentWindow.location.reload(true);
  352. }
  353. //输入框搜索
  354. ,serach: function(othis){
  355. othis.off('keypress').on('keypress',function(e){
  356. if(!this.value.replace(/\s/g, '')) return;
  357. //回车跳转
  358. if(e.keyCode === 13){
  359. var href = othis.attr('lay-action')
  360. ,text = othis.attr('lay-text') || '搜索';
  361. href = href + this.value;
  362. text = text + ' <span style="color: #FF5722;">'+ admin.escape(this.value) +'</span>';
  363. //打开标签页
  364. layui.index.openTabsPage(href, text);
  365. //如果搜索关键词已经打开,则刷新页面即可
  366. events.serach.keys || (events.serach.keys = {});
  367. events.serach.keys[admin.tabsPage.index] = this.value;
  368. if(this.value === events.serach.keys[admin.tabsPage.index]){
  369. events.refresh(othis);
  370. }
  371. //清空输入框
  372. this.value = '';
  373. }
  374. });
  375. }
  376. //点击消息
  377. ,message: function(othis){
  378. othis.find('.layui-badge-dot').remove();
  379. }
  380. //弹出主题面板
  381. ,theme: function(){
  382. admin.popupRight({
  383. id: 'LAY_adminPopupTheme'
  384. ,success: function(){
  385. view(this.id).render('system/theme')
  386. }
  387. });
  388. }
  389. //便签
  390. ,note: function(othis){
  391. var mobile = admin.screen() < 2
  392. ,note = layui.data(setter.tableName).note;
  393. events.note.index = admin.popup({
  394. title: '便签'
  395. ,shade: 0
  396. ,offset: [
  397. '41px'
  398. ,(mobile ? null : (othis.offset().left - 250) + 'px')
  399. ]
  400. ,anim: -1
  401. ,id: 'LAY_adminNote'
  402. ,skin: 'layadmin-note layui-anim layui-anim-upbit'
  403. ,content: '<textarea placeholder="内容"></textarea>'
  404. ,resize: false
  405. ,success: function(layero, index){
  406. var textarea = layero.find('textarea')
  407. ,value = note === undefined ? '便签中的内容会存储在本地,这样即便你关掉了浏览器,在下次打开时,依然会读取到上一次的记录。是个非常小巧实用的本地备忘录' : note;
  408. textarea.val(value).focus().on('keyup', function(){
  409. layui.data(setter.tableName, {
  410. key: 'note'
  411. ,value: this.value
  412. });
  413. });
  414. }
  415. })
  416. }
  417. //全屏
  418. ,fullscreen: function(othis){
  419. var SCREEN_FULL = 'layui-icon-screen-full'
  420. ,SCREEN_REST = 'layui-icon-screen-restore'
  421. ,iconElem = othis.children("i");
  422. if(iconElem.hasClass(SCREEN_FULL)){
  423. admin.fullScreen();
  424. iconElem.addClass(SCREEN_REST).removeClass(SCREEN_FULL);
  425. } else {
  426. admin.exitScreen();
  427. iconElem.addClass(SCREEN_FULL).removeClass(SCREEN_REST);
  428. }
  429. }
  430. //弹出关于面板
  431. ,about: function(){
  432. admin.popupRight({
  433. id: 'LAY_adminPopupAbout'
  434. ,success: function(){
  435. view(this.id).render('system/about');
  436. }
  437. });
  438. }
  439. //弹出更多面板
  440. ,more: function(){
  441. admin.popupRight({
  442. id: 'LAY_adminPopupMore'
  443. ,success: function(){
  444. view(this.id).render('system/more');
  445. }
  446. });
  447. }
  448. //返回上一页
  449. ,back: function(){
  450. history.back();
  451. }
  452. //主题设置
  453. ,setTheme: function(othis){
  454. var index = othis.data('index')
  455. ,nextIndex = othis.siblings('.layui-this').data('index');
  456. if(othis.hasClass(THIS)) return;
  457. othis.addClass(THIS).siblings('.layui-this').removeClass(THIS);
  458. admin.initTheme(index);
  459. }
  460. //左右滚动页面标签
  461. ,rollPage: function(type, index){
  462. var tabsHeader = $('#LAY_app_tabsheader')
  463. ,liItem = tabsHeader.children('li')
  464. ,scrollWidth = tabsHeader.prop('scrollWidth')
  465. ,outerWidth = tabsHeader.outerWidth()
  466. ,tabsLeft = parseFloat(tabsHeader.css('left'));
  467. //右左往右
  468. if(type === 'left'){
  469. if(!tabsLeft && tabsLeft <=0) return;
  470. //当前的left减去可视宽度,用于与上一轮的页标比较
  471. var prefLeft = -tabsLeft - outerWidth;
  472. liItem.each(function(index, item){
  473. var li = $(item)
  474. ,left = li.position().left;
  475. if(left >= prefLeft){
  476. tabsHeader.css('left', -left);
  477. return false;
  478. }
  479. });
  480. } else if(type === 'auto'){ //自动滚动
  481. (function(){
  482. var thisLi = liItem.eq(index), thisLeft;
  483. if(!thisLi[0]) return;
  484. thisLeft = thisLi.position().left;
  485. //当目标标签在可视区域左侧时
  486. if(thisLeft < -tabsLeft){
  487. return tabsHeader.css('left', -thisLeft);
  488. }
  489. //当目标标签在可视区域右侧时
  490. if(thisLeft + thisLi.outerWidth() >= outerWidth - tabsLeft){
  491. var subLeft = thisLeft + thisLi.outerWidth() - (outerWidth - tabsLeft);
  492. liItem.each(function(i, item){
  493. var li = $(item)
  494. ,left = li.position().left;
  495. //从当前可视区域的最左第二个节点遍历,如果减去最左节点的差 > 目标在右侧不可见的宽度,则将该节点放置可视区域最左
  496. if(left + tabsLeft > 0){
  497. if(left - tabsLeft > subLeft){
  498. tabsHeader.css('left', -left);
  499. return false;
  500. }
  501. }
  502. });
  503. }
  504. }());
  505. } else {
  506. //默认向左滚动
  507. liItem.each(function(i, item){
  508. var li = $(item)
  509. ,left = li.position().left;
  510. if(left + li.outerWidth() >= outerWidth - tabsLeft){
  511. tabsHeader.css('left', -left);
  512. return false;
  513. }
  514. });
  515. }
  516. }
  517. //向右滚动页面标签
  518. ,leftPage: function(){
  519. events.rollPage('left');
  520. }
  521. //向左滚动页面标签
  522. ,rightPage: function(){
  523. events.rollPage();
  524. }
  525. //关闭当前标签页
  526. ,closeThisTabs: function(){
  527. var topAdmin = parent === self ? admin : parent.layui.admin;
  528. topAdmin.closeThisTabs();
  529. }
  530. //关闭其它标签页
  531. ,closeOtherTabs: function(type){
  532. var TABS_REMOVE = 'LAY-system-pagetabs-remove';
  533. if(type === 'all'){
  534. $(TABS_HEADER+ ':gt(0)').remove();
  535. $(APP_BODY).find('.'+ TABS_BODY+ ':gt(0)').remove();
  536. $(TABS_HEADER).eq(0).trigger('click');
  537. } else {
  538. $(TABS_HEADER).each(function(index, item){
  539. if(index && index != admin.tabsPage.index){
  540. $(item).addClass(TABS_REMOVE);
  541. admin.tabsBody(index).addClass(TABS_REMOVE);
  542. }
  543. });
  544. $('.'+ TABS_REMOVE).remove();
  545. }
  546. }
  547. //关闭全部标签页
  548. ,closeAllTabs: function(){
  549. events.closeOtherTabs('all');
  550. $(".first-nav .layui-nav-tree .layui-nav-item").removeClass("activate");
  551. $("#LAY_app_body").addClass("hide-second-nav");
  552. $("#view").html("");
  553. //location.hash = '';
  554. }
  555. //遮罩
  556. ,shade: function(){
  557. admin.sideFlexible();
  558. }
  559. //检查更新
  560. ,update: function(){
  561. $.ajax({
  562. type: 'get',
  563. dataType: 'jsonp',
  564. data: {
  565. name: 'layuiAdmin'
  566. ,version: admin.v
  567. },
  568. url: 'https://fly.layui.com/api/product_update/',
  569. success: function(res){
  570. if(res.status === 0) {
  571. if(res.version === admin.v.replace(/\s|pro|std/g, '')){
  572. layer.alert('当前版本已经是最新版本');
  573. } else {
  574. layer.alert('检查到更新,是否前往下载?', {
  575. btn: ['更新', '暂不']
  576. }, function(index){
  577. layer.close(index);
  578. layer.open({
  579. type: 2
  580. ,content: 'https://fly.layui.com/user/product/'
  581. ,area: ['100%', '100%']
  582. ,title: '检查更新'
  583. });
  584. });
  585. }
  586. } else if(res.status == 1){
  587. layer.alert(res.msg, {
  588. btn: ['登入', '暂不']
  589. }, function(index){
  590. layer.close(index);
  591. layer.open({
  592. type: 2
  593. ,content: 'https://fly.layui.com/user/login/'
  594. ,area: ['100%', '100%']
  595. ,title: '检查更新'
  596. });
  597. });
  598. } else {
  599. layer.msg(res.msg || res.code, {shift: 6});
  600. }
  601. }, error: function(e){
  602. layer.msg('请求异常,请重试', {shift: 6});
  603. }
  604. });
  605. }
  606. //呼出IM 示例
  607. ,im: function(){
  608. admin.popup({
  609. id: 'LAY-popup-layim-demo' //定义唯一ID,防止重复弹出
  610. ,shade: 0
  611. ,area: ['800px', '300px']
  612. ,title: '面板外的操作示例'
  613. ,offset: 'lb'
  614. ,success: function(){
  615. //将 views 目录下的某视图文件内容渲染给该面板
  616. layui.view(this.id).render('layim/demo').then(function(){
  617. layui.use('im');
  618. });
  619. }
  620. })
  621. }
  622. };
  623. //初始
  624. !function(){
  625. //主题初始化,本地主题记录优先,其次为 initColorIndex
  626. var local = layui.data(setter.tableName);
  627. if(local.theme){
  628. admin.theme(local.theme);
  629. } else if(setter.theme){
  630. admin.initTheme(setter.theme.initColorIndex);
  631. }
  632. //常规版默认开启多标签页
  633. if(!('pageTabs' in layui.setter)) layui.setter.pageTabs = true;
  634. //不开启页面标签时
  635. if(!setter.pageTabs){
  636. $('#LAY_app_tabs').addClass(HIDE);
  637. container.addClass('layadmin-tabspage-none');
  638. }
  639. //低版本IE提示
  640. if(device.ie && device.ie < 10){
  641. view.error('IE'+ device.ie + '下访问可能不佳,推荐使用:Chrome / Firefox / Edge 等高级浏览器', {
  642. offset: 'auto'
  643. ,id: 'LAY_errorIE'
  644. });
  645. }
  646. }();
  647. //admin.prevRouter = {}; //上一个路由
  648. //监听 tab 组件切换,同步 index
  649. element.on('tab('+ FILTER_TAB_TBAS +')', function(data){
  650. admin.tabsPage.index = data.index;
  651. });
  652. //监听选项卡切换,改变菜单状态
  653. admin.on('tabsPage(setMenustatus)', function(router){
  654. var pathURL = router.url, getData = function(item){
  655. return {
  656. list: item.children('.layui-nav-child')
  657. ,a: item.children('*[lay-href]')
  658. }
  659. }
  660. ,sideMenu = $('#'+ SIDE_MENU)
  661. ,SIDE_NAV_ITEMD = 'layui-nav-itemed'
  662. //捕获对应菜单
  663. ,matchMenu = function(list){
  664. list.each(function(index1, item1){
  665. var othis1 = $(item1)
  666. ,data1 = getData(othis1)
  667. ,listChildren1 = data1.list.children('dd')
  668. ,matched1 = pathURL === data1.a.attr('lay-href');
  669. listChildren1.each(function(index2, item2){
  670. var othis2 = $(item2)
  671. ,data2 = getData(othis2)
  672. ,listChildren2 = data2.list.children('dd')
  673. ,matched2 = pathURL === data2.a.attr('lay-href');
  674. listChildren2.each(function(index3, item3){
  675. var othis3 = $(item3)
  676. ,data3 = getData(othis3)
  677. ,matched3 = pathURL === data3.a.attr('lay-href');
  678. if(matched3){
  679. var selected = data3.list[0] ? SIDE_NAV_ITEMD : THIS;
  680. othis3.addClass(selected).siblings().removeClass(selected); //标记选择器
  681. return false;
  682. }
  683. });
  684. if(matched2){
  685. var selected = data2.list[0] ? SIDE_NAV_ITEMD : THIS;
  686. othis2.addClass(selected).siblings().removeClass(selected); //标记选择器
  687. return false
  688. }
  689. });
  690. if(matched1){
  691. var selected = data1.list[0] ? SIDE_NAV_ITEMD : THIS;
  692. othis1.addClass(selected).siblings().removeClass(selected); //标记选择器
  693. return false;
  694. }
  695. });
  696. }
  697. //重置状态
  698. sideMenu.find('.'+ THIS).removeClass(THIS);
  699. //移动端点击菜单时自动收缩
  700. if(admin.screen() < 2) admin.sideFlexible();
  701. //开始捕获
  702. matchMenu(sideMenu.children('li'));
  703. });
  704. //监听侧边导航点击事件
  705. element.on('nav(layadmin-system-side-menu)', function(elem){
  706. if(elem.siblings('.layui-nav-child')[0] && container.hasClass(SIDE_SHRINK)){
  707. admin.sideFlexible('spread');
  708. layer.close(elem.data('index'));
  709. };
  710. admin.tabsPage.type = 'nav';
  711. });
  712. //监听选项卡的更多操作
  713. element.on('nav(layadmin-pagetabs-nav)', function(elem){
  714. var dd = elem.parent();
  715. dd.removeClass(THIS);
  716. dd.parent().removeClass(SHOW);
  717. });
  718. //同步路由
  719. var setThisRouter = function(othis){
  720. var layid = othis.attr('lay-id')
  721. ,attr = othis.attr('lay-attr')
  722. ,index = othis.index();
  723. admin.tabsBodyChange(index, {
  724. url: attr
  725. });
  726. //location.hash = layid === setter.entry ? '/' : attr;
  727. }
  728. ,TABS_HEADER = '#LAY_app_tabsheader>li';
  729. //标签页标题点击
  730. $body.on('click', TABS_HEADER, function(){
  731. var othis = $(this)
  732. ,index = othis.index();
  733. admin.tabsPage.type = 'tab';
  734. admin.tabsPage.index = index;
  735. setThisRouter(othis);
  736. });
  737. //监听 tabspage 删除
  738. element.on('tabDelete('+ FILTER_TAB_TBAS +')', function(obj){
  739. var othis = $(TABS_HEADER+ '.layui-this');
  740. obj.index && admin.tabsBody(obj.index).remove();
  741. setThisRouter(othis);
  742. //移除resize事件
  743. admin.delResize();
  744. });
  745. // 三级菜单收缩
  746. $body.on("click", ".second-nav .layui-nav-tree .layui-nav-itemed a", function () {
  747. var spanElem = $(this).children('i');
  748. if (spanElem.hasClass('up')) {
  749. spanElem.removeClass('up');
  750. $(this).next().show();
  751. } else {
  752. spanElem.addClass('up');
  753. $(this).next().hide();
  754. }
  755. });
  756. //页面跳转
  757. $body.on('click', '*[lay-href]', function(){
  758. var othis = $(this)
  759. ,href = othis.attr('lay-href')
  760. ,text = othis.attr('lay-text')
  761. ,menus_id = othis.attr('data-id')
  762. ,router = layui.router();
  763. admin.tabsPage.elem = othis;
  764. //admin.prevRouter[router.path[0]] = router.href; //记录上一次各菜单的路由信息
  765. // 解决选项卡 切换后 二级菜单点击样式 不会进行切换问题
  766. $(".second-nav .layui-nav .layui-nav-itemed dl dd").removeClass('layui-this');
  767. $(".second-nav .layui-nav .layui-nav-item").removeClass('layui-this');
  768. $(this).parent().addClass('layui-this');
  769. //执行跳转
  770. var topLayui = parent === self ? layui : top.layui;
  771. topLayui.index.openTabsPage(href, text || othis.text(), menus_id);
  772. //如果为当前页,则执行刷新
  773. if(href === admin.tabsBody(admin.tabsPage.index).find('iframe').attr('src')){
  774. admin.events.refresh();
  775. }
  776. });
  777. //点击事件
  778. $body.on('click', '*[layadmin-event]', function(){
  779. var othis = $(this)
  780. ,attrEvent = othis.attr('layadmin-event');
  781. events[attrEvent] && events[attrEvent].call(this, othis);
  782. });
  783. //tips
  784. $body.on('mouseenter', '*[lay-tips]', function(){
  785. var othis = $(this);
  786. if(othis.parent().hasClass('layui-nav-item') && !container.hasClass(SIDE_SHRINK)) return;
  787. var tips = othis.attr('lay-tips')
  788. ,offset = othis.attr('lay-offset')
  789. ,direction = othis.attr('lay-direction')
  790. ,index = layer.tips(tips, this, {
  791. tips: direction || 1
  792. ,time: -1
  793. ,success: function(layero, index){
  794. if(offset){
  795. layero.css('margin-left', offset + 'px');
  796. }
  797. }
  798. });
  799. othis.data('index', index);
  800. }).on('mouseleave', '*[lay-tips]', function(){
  801. layer.close($(this).data('index'));
  802. });
  803. //窗口resize事件
  804. var resizeSystem = layui.data.resizeSystem = function(){
  805. //layer.close(events.note.index);
  806. layer.closeAll('tips');
  807. if(!resizeSystem.lock){
  808. setTimeout(function(){
  809. admin.sideFlexible(admin.screen() < 2 ? '' : 'spread');
  810. delete resizeSystem.lock;
  811. }, 100);
  812. }
  813. resizeSystem.lock = true;
  814. }
  815. $win.on('resize', layui.data.resizeSystem);
  816. //接口输出
  817. exports('admin', admin);
  818. });