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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. /**
  2. * NOTE: 核心框架
  3. * author: FZR
  4. * desc: 大鹏一日同风起, 扶摇直上九万里
  5. */
  6. layui.use(["form", "element"], function () {
  7. var $ = layui.jquery;
  8. var element = layui.element;
  9. var $body = $("body");
  10. var APP_BODY = "#LAY_app_body";
  11. var TABS_HEADER = "#LAY_app_tabsheader>li";
  12. var FILTER_TAB_TABS = "lay-layout-tabs";
  13. var TABS_BODY = 'lay-tabsbody-item'
  14. var SHOW = 'layui-show'
  15. //同步路由
  16. var admin = {
  17. tabsPage: {},
  18. //关闭当前 pageTabs
  19. closeThisTabs: function () {
  20. if (!admin.tabsPage.index) return;
  21. $(TABS_HEADER).eq(admin.tabsPage.index).find('.layui-tab-close').trigger('click');
  22. $(TABS_HEADER).eq(admin.tabsPage.index).trigger('click');
  23. },
  24. //获取页面标签主体元素
  25. tabsBody: function (index) {
  26. return $(APP_BODY).find('.' + TABS_BODY).eq(index || 0);
  27. }
  28. //resize事件管理
  29. , resize: function (fn) {
  30. var router = layui.router()
  31. , key = router.path.join('-');
  32. if (admin.resizeFn[key]) {
  33. $win.off('resize', admin.resizeFn[key]);
  34. delete admin.resizeFn[key];
  35. }
  36. if (fn === 'off') return; //如果是清除 resize 事件,则终止往下执行
  37. fn(), admin.resizeFn[key] = fn;
  38. $win.on('resize', admin.resizeFn[key]);
  39. }
  40. , resizeFn: {}
  41. , runResize: function () {
  42. var router = layui.router()
  43. , key = router.path.join('-');
  44. admin.resizeFn[key] && admin.resizeFn[key]();
  45. }
  46. , delResize: function () {
  47. this.resize('off');
  48. }
  49. };
  50. /**
  51. * 操作事件
  52. */
  53. let events = {
  54. // 左右滚动页面标签
  55. rollPage: function (type, index) {
  56. var tabsHeader = $('#LAY_app_tabsheader')
  57. , liItem = tabsHeader.children('li')
  58. , scrollWidth = tabsHeader.prop('scrollWidth')
  59. , outerWidth = tabsHeader.outerWidth()
  60. , tabsLeft = parseFloat(tabsHeader.css('left'));
  61. //右左往右
  62. if (type === 'left') {
  63. if (!tabsLeft && tabsLeft <= 0) return;
  64. //当前的left减去可视宽度,用于与上一轮的页标比较
  65. var prefLeft = -tabsLeft - outerWidth;
  66. liItem.each(function (index, item) {
  67. var li = $(item)
  68. , left = li.position().left;
  69. if (left >= prefLeft) {
  70. tabsHeader.css('left', -left);
  71. return false;
  72. }
  73. });
  74. } else if (type === 'auto') { //自动滚动
  75. (function () {
  76. var thisLi = liItem.eq(index), thisLeft;
  77. if (!thisLi[0]) return;
  78. thisLeft = thisLi.position().left;
  79. //当目标标签在可视区域左侧时
  80. if (thisLeft < -tabsLeft) {
  81. return tabsHeader.css('left', -thisLeft);
  82. }
  83. //当目标标签在可视区域右侧时
  84. if (thisLeft + thisLi.outerWidth() >= outerWidth - tabsLeft) {
  85. var subLeft = thisLeft + thisLi.outerWidth() - (outerWidth - tabsLeft);
  86. liItem.each(function (i, item) {
  87. var li = $(item)
  88. , left = li.position().left;
  89. //从当前可视区域的最左第二个节点遍历,如果减去最左节点的差 > 目标在右侧不可见的宽度,则将该节点放置可视区域最左
  90. if (left + tabsLeft > 0) {
  91. if (left - tabsLeft > subLeft) {
  92. tabsHeader.css('left', -left);
  93. return false;
  94. }
  95. }
  96. });
  97. }
  98. }());
  99. } else {
  100. //默认向左滚动
  101. liItem.each(function (i, item) {
  102. var li = $(item)
  103. , left = li.position().left;
  104. if (left + li.outerWidth() >= outerWidth - tabsLeft) {
  105. tabsHeader.css('left', -left);
  106. return false;
  107. }
  108. });
  109. }
  110. }
  111. // 向右滚动页面标签
  112. , leftPage: function () {
  113. events.rollPage('left');
  114. }
  115. // 向左滚动页面标签
  116. , rightPage: function () {
  117. events.rollPage();
  118. }
  119. //关闭当前标签页
  120. , closeThisTabs: function () {
  121. events.rollPage('auto', admin.tabsPage.index);
  122. var topAdmin = parent === self ? admin : parent.layui.admin;
  123. topAdmin.closeThisTabs();
  124. }
  125. //关闭其它标签页
  126. , closeOtherTabs: function (type) {
  127. events.rollPage('auto', 0);
  128. var TABS_REMOVE = 'LAY-system-pagetabs-remove';
  129. if (type === 'all') {
  130. $(TABS_HEADER + ':gt(0)').remove();
  131. $(APP_BODY).find('.' + TABS_BODY + ':gt(0)').remove();
  132. $(TABS_HEADER).eq(0).trigger('click');
  133. } else {
  134. $(TABS_HEADER).each(function (index, item) {
  135. if (index && index != admin.tabsPage.index) {
  136. $(item).addClass(TABS_REMOVE);
  137. admin.tabsBody(index).addClass(TABS_REMOVE);
  138. }
  139. });
  140. $('.' + TABS_REMOVE).remove();
  141. admin.tabsPage.index = 1
  142. }
  143. }
  144. //关闭全部标签页
  145. , closeAllTabs: function () {
  146. events.closeOtherTabs('all');
  147. // 需要删除 layui-body下面的容器, 保留工作台
  148. // 菜单切换到控制台的, 可以模拟点击标签, 看看能不能自动切换
  149. }
  150. };
  151. /**
  152. * 打开标签(用于侧边菜单点击)
  153. * @author FZR
  154. * @param url (要打开的URL)
  155. * @param text (标签文本)
  156. * @param menus_id (数据库中的菜单ID)
  157. */
  158. var openTabsPage = function (url, text, menus_id) {
  159. var matchTo;
  160. var tabs = $("#LAY_app_tabsheader > li");
  161. // 循环查找是否已存在标签栏中
  162. tabs.each(function () {
  163. var lay_id = $(this).attr('lay-id');
  164. var lay_url = $(this).attr("lay-attr");
  165. if (lay_url === url && lay_id === menus_id) {
  166. matchTo = true;
  167. }
  168. });
  169. // 如果标签不存在则创建
  170. if (!matchTo) {
  171. setTimeout(function () {
  172. $(APP_BODY).find(".lay-tabsbody-item").removeClass("layui-show");
  173. $(APP_BODY).append([
  174. '<div lay-id="' + menus_id + '" class="lay-tabsbody-item layui-show">'
  175. , '<iframe src="' + url + '" class="lay-iframe"></iframe>'
  176. , '</div>'
  177. ].join(''));
  178. }, 10);
  179. element.tabAdd(FILTER_TAB_TABS, {
  180. title: text || '新打开标签'
  181. , id: menus_id
  182. , attr: url
  183. });
  184. } else {
  185. //页面已存在,直接切换到页面就行,而不是重新加载新页面
  186. $(APP_BODY).find(".lay-tabsbody-item").removeClass("layui-show");
  187. $(APP_BODY).find(".lay-tabsbody-item[lay-id=" + menus_id + "]").addClass("layui-show");
  188. }
  189. // 定位到当前Tabs
  190. element.tabChange(FILTER_TAB_TABS, menus_id);
  191. };
  192. /**
  193. * 标签栏切换点击
  194. * @author FZR
  195. */
  196. $body.on("click", TABS_HEADER, function () {
  197. var url = $(this).attr('lay-attr');
  198. var text = $(this).children("span").html();
  199. var lay_id = $(this).attr('lay-id');
  200. var elem = $(".layui-sidebar .layui-side-menu li a[lay-id=" + lay_id + "]");
  201. // 切换到指定一级菜单
  202. elem.parents("li").siblings().find("a").removeClass("active");
  203. elem.parents("li").children("a").addClass("active");
  204. // 是否存在二级菜单
  205. if (elem.parents("li").has("dl").length) {
  206. $(".layui-sidebar > .layui-side-menu li dl").css("display", "");
  207. elem.parents("li").children("dl").css("display", "block");
  208. elem.parents("li").children("dl").find("a").removeClass("active");
  209. elem.parents("li").children("dl").find("a[lay-id=" + lay_id + "]").addClass("active");
  210. $(APP_BODY).css({ "left": "232px" });
  211. } else {
  212. $(APP_BODY).css({ "left": "110px" });
  213. $(".layui-sidebar > .layui-side-menu li > dl").css("display", "");
  214. }
  215. //页面已存在,直接切换到页面就行,而不是重新加载新页面
  216. $(APP_BODY).find(".lay-tabsbody-item").removeClass("layui-show");
  217. $(APP_BODY).find(".lay-tabsbody-item[lay-id=" + lay_id + "]").addClass("layui-show");
  218. });
  219. /**
  220. * 侧边菜单切换(一二级)
  221. * @author FZR
  222. */
  223. $body.on("click", ".layui-sidebar .layui-side-menu li", function () {
  224. if (!$(this).children("a").hasClass("active")) {
  225. // 一级菜单样式切换
  226. $(this).siblings().find("a").removeClass("active");
  227. $(this).children("a").addClass("active");
  228. // 二级菜单显示或隐藏
  229. if ($(this).has("dl").length) {
  230. $(".layui-sidebar > .layui-side-menu li dl").css("display", "");
  231. $(this).children("dl").css("display", "block");
  232. var towSubMenu = $(this).children("dl").find("dd > a");
  233. var Node = towSubMenu.eq(0).children("i").length ? towSubMenu.eq(1) : towSubMenu.eq(0);
  234. Node.addClass("active");
  235. $(APP_BODY).css({ "left": "232px" })
  236. var id = Node.attr("lay-id");
  237. var url = Node.attr("lay-href");
  238. var text = Node.html();
  239. openTabsPage(url, text, id)
  240. } else {
  241. $(".layui-sidebar > .layui-side-menu li > dl").css("display", "");
  242. $(APP_BODY).css({ "left": "110px" });
  243. var id = $(this).children("a").attr("lay-id");
  244. var url = $(this).children("a").attr("lay-href");
  245. var text = $(this).find("cite").html();
  246. openTabsPage(url, text, id)
  247. }
  248. }
  249. });
  250. /**
  251. * 三级菜单(显示/隐藏)
  252. * @author FZR
  253. */
  254. $body.on("click", ".layui-sidebar > .layui-side-menu .child-menu-title", function () {
  255. if ($(this).children("i").hasClass("layui-icon-triangle-d")) {
  256. $(this).children("i").removeClass("layui-icon-triangle-d");
  257. $(this).children("i").addClass("layui-icon-triangle-r");
  258. $(this).next().stop().slideUp();
  259. } else {
  260. $(this).children("i").removeClass("layui-icon-triangle-r");
  261. $(this).children("i").addClass("layui-icon-triangle-d");
  262. $(this).next().stop().slideDown();
  263. }
  264. });
  265. /**
  266. * 三级菜(样式切换)
  267. * @author FZR
  268. */
  269. $body.on("click", ".layui-sidebar > .layui-side-menu .child-menu dd", function () {
  270. if (!$(this).children("a").hasClass("child-menu-title")) {
  271. $(".layui-sidebar > .layui-side-menu .child-menu dd a").removeClass("active");
  272. $(this).children("a").addClass("active");
  273. // 打开标签
  274. var id = $(this).children("a").attr("lay-id");
  275. var url = $(this).children("a").attr("lay-href");
  276. var text = $(this).children("a").html();
  277. openTabsPage(url, text, id)
  278. }
  279. });
  280. /**
  281. * 快捷方式切换
  282. */
  283. $body.on("click", ".shortcut-list .shop-item > a", function () {
  284. var url = $(this).attr('lay-href');
  285. var id = $(this).attr('data-id');
  286. var text = $(this).attr('data-txt');
  287. console.log('aaaa')
  288. openTabsPage(url, text, id)
  289. });
  290. /**
  291. * 刷新页面
  292. */
  293. $body.on("click", ".layui-header .refresh", function () {
  294. var uri = $("#LAY_app_tabsheader li.layui-this").attr("lay-attr");
  295. $("#LAY_app_body .lay-tabsbody-item.layui-show .lay-iframe").attr("src", uri);
  296. });
  297. /**
  298. * 按键盘全屏或退出全屏
  299. * @author FZR
  300. */
  301. $body.on("keydown", "", function (event) {
  302. event = event || window.event || arguments.callee.caller.arguments[0];
  303. //按Esc
  304. if (event && event.keyCode === 27) {
  305. $(".fullscreen").children("i").eq(0).removeClass("layui-icon-screen-restore");
  306. }
  307. //按F11
  308. if (event && event.keyCode === 122) {
  309. $(".fullscreen").children("i").eq(0).addClass("layui-icon-screen-restore");
  310. }
  311. });
  312. /**
  313. * 点击按钮全屏或退出全屏
  314. * @author FZR
  315. */
  316. $body.on("click", ".fullscreen", function () {
  317. var docElm = document.documentElement;
  318. if ($(this).children("i").hasClass("layui-icon-screen-restore")) {
  319. document.exitFullscreen();
  320. $(this).children("i").eq(0).removeClass("layui-icon-screen-restore");
  321. } else {
  322. docElm.requestFullscreen();
  323. $(this).children("i").eq(0).addClass("layui-icon-screen-restore");
  324. }
  325. });
  326. //监听 tabspage 删除
  327. element.on('tabDelete(' + FILTER_TAB_TABS + ')', function (obj) {
  328. var othis = $(TABS_HEADER + '.layui-this');
  329. obj.index && admin.tabsBody(obj.index).remove();
  330. admin.tabsBody(obj.index).addClass(SHOW).siblings().removeClass(SHOW);
  331. events.rollPage('auto', obj.index);
  332. if(admin.tabsPage.index == obj.index + 1) return
  333. if(othis.index() + 1 == obj.index ) {
  334. $(TABS_HEADER).eq(obj.index - 1).trigger('click');
  335. }
  336. if(othis.index() - 1 == obj.index ) {
  337. $(TABS_HEADER).eq(obj.index + 1).trigger('click');
  338. }
  339. });
  340. /**
  341. * 点击事件
  342. */
  343. $body.on('click', '*[lay-event]', function () {
  344. var that = $(this);
  345. var attrEvent = that.attr('lay-event');
  346. events[attrEvent] && events[attrEvent].call(this, that);
  347. });
  348. element.on('tab(' + FILTER_TAB_TABS + ')', function (data) {
  349. admin.tabsPage.index = data.index;
  350. events.rollPage('auto', data.index);
  351. });
  352. });