main.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. // layui 配置
  2. layui.use(['element', 'form', 'layer', 'upload'], function () {
  3. var $ = layui.jquery;
  4. var element = layui.element; //加载 element 模块
  5. var layer = layui.layer; //加载 layer 模块
  6. var upload = layui.upload; //加载 upload 模块
  7. /* 侧边栏开关 */
  8. $(".side-toggle").on("click", function (e) {
  9. e.preventDefault();
  10. var to = $(".layui-layout-admin");
  11. to.toggleClass("layui-side-shrink");
  12. to.attr("toggle") === 'on' ? to.attr("toggle", "off") : to.attr("toggle", "on");
  13. });
  14. $(".layui-side").on("click", function () {
  15. var to = $(".layui-layout-admin");
  16. if (to.attr("toggle") === 'on') {
  17. to.attr("toggle", "off");
  18. to.removeClass("layui-side-shrink");
  19. }
  20. });
  21. /* 最大化窗口 */
  22. $(".timo-screen-full").on("click", function (e) {
  23. e.preventDefault();
  24. if (!$(this).hasClass("full-on")) {
  25. var docElm = document.documentElement;
  26. var full = docElm.requestFullScreen || docElm.webkitRequestFullScreen ||
  27. docElm.mozRequestFullScreen || docElm.msRequestFullscreen;
  28. "undefined" !== typeof full && full && full.call(docElm);
  29. } else {
  30. document.exitFullscreen ? document.exitFullscreen()
  31. : document.mozCancelFullScreen ? document.mozCancelFullScreen()
  32. : document.webkitCancelFullScreen ? document.webkitCancelFullScreen()
  33. : document.msExitFullscreen && document.msExitFullscreen()
  34. }
  35. $(this).toggleClass("full-on");
  36. });
  37. /* 新建或切换标签栏 */
  38. var tabs = function (url) {
  39. var item = $('[lay-url="' + url + '"]');
  40. if (url !== undefined && url !== '#' && item.length > 0) {
  41. var bootLay = $('[lay-id="' + url + '"]');
  42. if (bootLay.length === 0) {
  43. var title = item.attr("lay-icon") === 'true' ? item.html()
  44. : item.children(".layui-nav-title").text();
  45. var iframeUrl = (window.location.pathname + url).replace('//','/');
  46. element.tabAdd('iframe-tabs', {
  47. title: title
  48. , content: '<iframe src="' + iframeUrl + '" frameborder="0" class="layui-layout-iframe"></iframe>'
  49. , id: url
  50. });
  51. }
  52. element.tabChange('iframe-tabs', url);
  53. }
  54. };
  55. /* 监听导航栏事件,实现标签页的切换 */
  56. element.on("nav(layui-nav-side)", function ($this) {
  57. var url = $this.attr('lay-url');
  58. tabs(url);
  59. });
  60. /* 监听标签栏事件,实现导航栏高亮显示 */
  61. element.on("tab(iframe-tabs)", function () {
  62. var layId = $(this).attr("lay-id");
  63. $(".layui-side .layui-this").removeClass("layui-this");
  64. $('[lay-url="' + layId + '"]').parent().addClass("layui-this");
  65. // 改变地址hash值
  66. location.hash = this.getAttribute('lay-id');
  67. });
  68. /* 监听hash来切换选项卡*/
  69. window.onhashchange = function (e) {
  70. var url = location.hash.replace(/^#/, '');
  71. var index = $(".layui-layout-admin .layui-side .layui-nav-item")[0];
  72. $(index).children("a").attr("lay-icon", "true");
  73. if (url === "" || url === undefined) {
  74. url = $(index).children("[lay-url]").attr("lay-url");
  75. }
  76. tabs(url);
  77. };
  78. window.onhashchange();
  79. /* 初始化时展开子菜单 */
  80. $("dd.layui-this").parents(".layui-nav-child").parent()
  81. .addClass("layui-nav-itemed");
  82. /* 刷新iframe页面 */
  83. $(".refresh-btn").click(function () {
  84. location.reload();
  85. });
  86. /* ajax 请求默认选项,处理连接超时问题 */
  87. $.ajaxSetup({
  88. beforeSend: function () {
  89. layer.load(0);
  90. },
  91. complete: function (xhr) {
  92. layer.closeAll('loading');
  93. if (xhr.status === 401) {
  94. layer.confirm('session连接超时,是否重新登录?', {
  95. btn: ['是', '否']
  96. }, function () {
  97. if (window.parent.window !== window) {
  98. window.top.location = window.location.pathname + '/login';
  99. }
  100. });
  101. }
  102. }
  103. });
  104. /* 漂浮消息 */
  105. $.fn.Messager = function (result) {
  106. if (result.code === 0) {
  107. layer.msg(result.msg, {offset: '15px', time: 5000, icon: 1});
  108. setTimeout(function () {
  109. if (result.data === 'submit[refresh]') {
  110. parent.location.reload();
  111. return;
  112. }
  113. if (result.data != null && result.data.url != null) {
  114. window.location.href = result.data.url;
  115. } else {
  116. window.location.reload();
  117. }
  118. }, 1000);
  119. } else {
  120. layer.msg(result.msg, {offset: '15px', time: 5000, icon: 2});
  121. }
  122. };
  123. /* 提交表单数据(返回 application/json 数据) */
  124. $(document).on("click", ".ajax-submit", function (e) {
  125. e.preventDefault();
  126. var form = $(this).parents("form");
  127. var url = form.attr("action");
  128. var serializeArray = form.serializeArray();
  129. $.post(url, serializeArray, function (result) {
  130. if (result.data == null) {
  131. result.data = 'submit[refresh]';
  132. }
  133. $.fn.Messager(result);
  134. });
  135. });
  136. $(document).on("click", ".ajax-submit-json", function (e) {
  137. e.preventDefault();
  138. var form = $(this).parents("form");
  139. var url = form.attr("action");
  140. var serializeArray = form.serializeArray();
  141. var jsonData = form.serialize();
  142. $.ajax({
  143. url: url,
  144. type: 'post',
  145. data: jsonData,
  146. dataType: 'json',
  147. success: function (result) {
  148. if (result.data == null) {
  149. result.data = 'submit[refresh]';
  150. }
  151. $.fn.Messager(result);
  152. }
  153. });
  154. /*$.post(url, serializeArray, function (result) {
  155. if (result.data == null) {
  156. result.data = 'submit[refresh]';
  157. }
  158. $.fn.Messager(result);
  159. });*/
  160. });
  161. /* get 方式异步 */
  162. $(document).on("click", ".ajax-get", function (e) {
  163. e.preventDefault();
  164. var msg = $(this).data("msg");
  165. if (msg !== undefined) {
  166. layer.confirm(msg + '?', {
  167. title: '提示',
  168. btn: ['确认', '取消']
  169. }, function () {
  170. $.get(e.target.href, function (result) {
  171. $.fn.Messager(result);
  172. });
  173. });
  174. } else {
  175. $.get(e.target.href, function (result) {
  176. $.fn.Messager(result);
  177. });
  178. }
  179. });
  180. /* ajax 重定向 */
  181. $(document).on("click", ".ajax-redirect", function (e) {
  182. e.preventDefault();
  183. $.get(e.target.href, function (result) {
  184. if (result.code === 0) {
  185. window.location.href = result.msg
  186. } else {
  187. $.fn.Messager(result);
  188. }
  189. });
  190. });
  191. /* ajax delete 操作 */
  192. $(document).on("click", ".ajax-delete", function (e) {
  193. e.preventDefault();
  194. var msg = $(this).data("msg");
  195. if (msg !== undefined) {
  196. layer.confirm(msg + '?', {
  197. title: '提示',
  198. btn: ['确认', '取消']
  199. }, function () {
  200. $.ajax({
  201. url: e.target.href,
  202. type: 'DELETE',
  203. success: function (result) {
  204. $.fn.Messager(result);
  205. }
  206. })
  207. });
  208. } else {
  209. $.ajax({
  210. url: e.target.href,
  211. type: 'DELETE',
  212. success: function (result) {
  213. $.fn.Messager(result);
  214. }
  215. })
  216. }
  217. });
  218. /* ajax post 操作 */
  219. $(document).on("click", ".ajax-post", function (e) {
  220. e.preventDefault();
  221. var msg = $(this).data("msg");
  222. if (msg !== undefined) {
  223. layer.confirm(msg + '?', {
  224. title: '提示',
  225. btn: ['确认', '取消']
  226. }, function () {
  227. $.ajax({
  228. url: e.target.href,
  229. type: 'POST',
  230. success: function (result) {
  231. $.fn.Messager(result);
  232. }
  233. })
  234. });
  235. } else {
  236. $.ajax({
  237. url: e.target.href,
  238. type: 'POST',
  239. success: function (result) {
  240. $.fn.Messager(result);
  241. }
  242. })
  243. }
  244. });
  245. /* post 方式异步-操作状态 */
  246. $(".ajax-status").on("click", function (e) {
  247. e.preventDefault();
  248. var checked = [];
  249. var tdcheckbox = $(".timo-table td .timo-checkbox :checkbox:checked");
  250. if (tdcheckbox.length > 0) {
  251. tdcheckbox.each(function (key, val) {
  252. checked.push("ids=" + $(val).attr("value"));
  253. });
  254. $.post(e.target.href, checked.join("&"), function (result) {
  255. $.fn.Messager(result);
  256. });
  257. } else {
  258. layer.msg('至少应该选择一条记录');
  259. }
  260. });
  261. /* 添加/修改弹出层 */
  262. $(document).on("click", ".open-popup, .open-popup-param", function () {
  263. var title = $(this).data("title");
  264. var url = $(this).attr("data-url");
  265. if ($(this).hasClass("open-popup-param")) {
  266. var tdcheckbox = $(".timo-table td .timo-checkbox :checkbox:checked");
  267. var param = '';
  268. if (tdcheckbox.length === 0) {
  269. layer.msg('请选择一条或多条记录');
  270. return;
  271. }
  272. if (tdcheckbox.length > 1 && $(this).data("type") === 'radio') {
  273. layer.msg('只允许选中一条记录');
  274. return;
  275. }
  276. tdcheckbox.each(function (key, val) {
  277. param += "ids=" + $(val).attr("value") + "&";
  278. });
  279. param = param.substr(0, param.length - 1);
  280. url += "?" + param;
  281. }
  282. var size = $(this).attr("data-size"), layerArea;
  283. if (size === undefined || size === "auto" || size === "max") {
  284. layerArea = ['50%', '80%'];
  285. }else if (size.indexOf(',') !== -1) {
  286. var split = size.split(",");
  287. layerArea = [split[0] + 'px', split[1] + 'px'];
  288. }
  289. window.layerIndex = layer.open({
  290. type: 2,
  291. title: title,
  292. shadeClose: true,
  293. maxmin: true,
  294. area: layerArea,
  295. content: [url, 'on']
  296. });
  297. if (size === "max") {
  298. layer.full(layerIndex);
  299. }
  300. });
  301. /* 关闭弹出层 */
  302. $(".close-popup").click(function (e) {
  303. e.preventDefault();
  304. parent.layer.close(window.parent.layerIndex);
  305. });
  306. /* 下拉按钮组 */
  307. $(".btn-group").click(function (e) {
  308. e.stopPropagation();
  309. $this = $(this);
  310. $this.toggleClass("show");
  311. $(document).one("click", function () {
  312. if ($this.hasClass("show")) {
  313. $this.removeClass("show");
  314. }
  315. });
  316. });
  317. // 展示数据列表-多选框
  318. var thcheckbox = $(".timo-table th .timo-checkbox :checkbox");
  319. thcheckbox.on("change", function () {
  320. var tdcheckbox = $(".timo-table td .timo-checkbox :checkbox");
  321. if (thcheckbox.is(':checked')) {
  322. tdcheckbox.prop("checked", true);
  323. } else {
  324. tdcheckbox.prop("checked", false);
  325. }
  326. });
  327. // 检测列表数据是否为空
  328. var timoTable = $(".timo-table tbody");
  329. if (timoTable.length > 0) {
  330. var children = timoTable.children();
  331. if (children.length === 0) {
  332. var length = $(".timo-table thead th").length;
  333. var trNullInfo = "<tr><td class='timo-table-null' colspan='"
  334. + length + "'>没有找到匹配的记录</td></tr>";
  335. timoTable.append(trNullInfo);
  336. }
  337. }
  338. // 携带参数跳转
  339. var paramSkip = function () {
  340. var getSearch = "";
  341. // 搜索框参数
  342. $('.timo-search-box [name]').each(function (key, val) {
  343. if ($(val).val() !== "" && $(val).val() !== undefined) {
  344. getSearch += $(val).attr("name") + "=" + $(val).val() + "&";
  345. }
  346. });
  347. // 页数参数
  348. var pageSize = $(".page-number").val();
  349. if (pageSize !== undefined && pageSize !== "") {
  350. getSearch += "size=" + pageSize + "&";
  351. }
  352. // 排序参数
  353. var asc = $(".sortable.asc").data("field");
  354. if(asc !== undefined){
  355. getSearch += "orderByColumn=" + asc + "&isAsc=asc&";
  356. }
  357. var desc = $(".sortable.desc").data("field");
  358. if(desc !== undefined){
  359. getSearch += "orderByColumn=" + desc + "&isAsc=desc&";
  360. }
  361. if (getSearch !== "") {
  362. getSearch = "?" + getSearch.substr(0, getSearch.length - 1);
  363. }
  364. console.log('搜索参数 -> ' + getSearch)
  365. window.location.href = window.location.pathname + getSearch;
  366. };
  367. /* 展示列表数据搜索 */
  368. $(document).on("click", ".timo-search-btn", function () {
  369. paramSkip();
  370. });
  371. /* 改变显示页数 */
  372. $(document).on("change", ".page-number", function () {
  373. paramSkip();
  374. });
  375. /* 触发字段排序 */
  376. $(document).on("click", ".sortable", function () {
  377. $(".sortable").not(this).removeClass("asc").removeClass("desc");
  378. if($(this).hasClass("asc")){
  379. $(this).removeClass("asc").addClass("desc");
  380. }else {
  381. $(this).removeClass("desc").addClass("asc");
  382. }
  383. paramSkip();
  384. });
  385. /* 参数化字段排序 */
  386. var getSearch = function(name) {
  387. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  388. var r = window.location.search.substr(1).match(reg);
  389. if (r != null) return unescape(r[2]);
  390. return null;
  391. };
  392. var field = getSearch("orderByColumn");
  393. var isAsc = getSearch("isAsc");
  394. if(field != null){
  395. $("[data-field='"+ field +"']").addClass(isAsc);
  396. }
  397. /* 上传文件操作 */
  398. upload.render({
  399. elem: '.upload-file' //绑定元素
  400. ,url: $('.upload-file').attr('up-url') //上传接口
  401. ,field: 'file' //文件域的字段名
  402. ,accept: 'file'
  403. //,field: 'image' //文件域的字段名
  404. //,acceptMime: 'image/*' //选择文件类型
  405. //,exts: 'jpg|jpeg|png|gif' //支持的图片格式
  406. ,multiple: true //开启多文件选择
  407. ,done: function(res, index, upload){
  408. console.log(res)
  409. }
  410. });
  411. /* 上传图片操作 */
  412. upload.render({
  413. elem: '.upload-image' //绑定元素
  414. ,url: $('.upload-image').attr('up-url') //上传接口
  415. ,field: 'file' //文件域的字段名
  416. ,accept: 'file'
  417. //,field: 'image' //文件域的字段名
  418. //,acceptMime: 'image/*' //选择文件类型
  419. //,exts: 'jpg|jpeg|png|gif' //支持的图片格式
  420. ,multiple: true //开启多文件选择
  421. ,choose: function (obj) {
  422. obj.preview(function (index, file, result) {
  423. var upload = $('.upload-image');
  424. var name = upload.attr('name');
  425. var show = upload.parents('.layui-form-item').children('.upload-show');
  426. show.append("<div class='upload-item'><img src='"+ result +"'/>" +
  427. "<input id='"+ index +"' type='hidden' name='"+name+"'/>" +
  428. "<i class='upload-item-close layui-icon layui-icon-close'></i></div>");
  429. });
  430. }
  431. ,done: function(res, index, upload){
  432. var field = $('.upload-image').attr('up-field') || 'id';
  433. // 解决节点渲染和异步上传不同步问题
  434. var interval = window.setInterval(function(){
  435. var hide = $("#"+index);
  436. if(hide.length > 0){
  437. var item = hide.parent('.upload-item');
  438. if (res.code === 200) {
  439. hide.val(res.data[field]);
  440. item.addClass('succeed');
  441. }else {
  442. hide.remove();
  443. item.addClass('error');
  444. }
  445. clearInterval(interval);
  446. }
  447. }, 100);
  448. }
  449. });
  450. // 删除上传图片展示项
  451. $(document).on("click", ".upload-item-close", function () {
  452. $(this).parent('.upload-item').remove();
  453. });
  454. });