easy-admin.js 74 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605
  1. define(["jquery", "tableSelect", "ckeditor"], function ($, tableSelect, undefined) {
  2. var form = layui.form,
  3. layer = layui.layer,
  4. table = layui.table,
  5. laydate = layui.laydate,
  6. upload = layui.upload,
  7. element = layui.element,
  8. laytpl = layui.laytpl,
  9. tableSelect = layui.tableSelect,
  10. util = layui.util;
  11. layer.config({
  12. skin: 'layui-layer-easy'
  13. });
  14. var init = {
  15. table_elem: '#currentTable',
  16. table_render_id: 'currentTableRenderId',
  17. upload_url: 'ajax/upload',
  18. upload_exts: 'doc|gif|ico|icon|jpg|mp3|mp4|p12|pem|png|rar',
  19. };
  20. var admin = {
  21. config: {
  22. shade: [0.02, '#000'],
  23. },
  24. url: function (url) {
  25. return '/' + CONFIG.ADMIN + '/' + url;
  26. },
  27. headers: function () {
  28. return {'X-CSRF-TOKEN': window.CONFIG.CSRF_TOKEN};
  29. },
  30. //js版empty,判断变量是否为空
  31. empty: function (r) {
  32. var n, t, e, f = [void 0, null, !1, 0, "", "0"];
  33. for (t = 0, e = f.length; t < e; t++) if (r === f[t]) return !0;
  34. if ("object" == typeof r) {
  35. for (n in r) if (r.hasOwnProperty(n)) return !1;
  36. return !0
  37. }
  38. return !1
  39. },
  40. checkAuth: function (node, elem) {
  41. if (CONFIG.IS_SUPER_ADMIN) {
  42. return true;
  43. }
  44. if ($(elem).attr('data-auth-' + node) === '1') {
  45. return true;
  46. } else {
  47. return false;
  48. }
  49. },
  50. parame: function (param, defaultParam) {
  51. return param !== undefined ? param : defaultParam;
  52. },
  53. request: {
  54. post: function (option, ok, no, ex) {
  55. return admin.request.ajax('post', option, ok, no, ex);
  56. },
  57. get: function (option, ok, no, ex) {
  58. return admin.request.ajax('get', option, ok, no, ex);
  59. },
  60. ajax: function (type, option, ok, no, ex) {
  61. type = type || 'get';
  62. option.url = option.url || '';
  63. option.data = option.data || {};
  64. option.prefix = option.prefix || false;
  65. option.statusName = option.statusName || 'code';
  66. option.statusCode = option.statusCode || 1;
  67. ok = ok || function (res) {
  68. };
  69. no = no || function (res) {
  70. var msg = res.msg == undefined ? '返回数据格式有误' : res.msg;
  71. admin.msg.error(msg);
  72. return false;
  73. };
  74. ex = ex || function (res) {
  75. };
  76. if (option.url == '') {
  77. admin.msg.error('请求地址不能为空');
  78. return false;
  79. }
  80. if (option.prefix == true) {
  81. option.url = admin.url(option.url);
  82. }
  83. var index = admin.msg.loading('加载中');
  84. $.ajax({
  85. url: option.url,
  86. type: type,
  87. contentType: "application/x-www-form-urlencoded; charset=UTF-8",
  88. dataType: "json",
  89. headers:admin.headers(),
  90. data: option.data,
  91. timeout: 60000,
  92. success: function (res) {
  93. admin.msg.close(index);
  94. if (eval('res.' + option.statusName) == option.statusCode) {
  95. return ok(res);
  96. } else {
  97. return no(res);
  98. }
  99. },
  100. error: function (xhr, textstatus, thrown) {
  101. admin.msg.error('Status:' + xhr.status + ',' + xhr.statusText + ',请稍后再试!', function () {
  102. ex(this);
  103. });
  104. return false;
  105. },
  106. complete: function(){
  107. // @todo 刷新csrf-token
  108. }
  109. });
  110. }
  111. },
  112. common: {
  113. parseNodeStr: function (node) {
  114. var array = node.split('/');
  115. $.each(array, function (key, val) {
  116. if (key === 0) {
  117. val = val.split('.');
  118. $.each(val, function (i, v) {
  119. val[i] = admin.common.humpToLine(v.replace(v[0], v[0].toLowerCase()));
  120. });
  121. val = val.join(".");
  122. array[key] = val;
  123. }
  124. });
  125. node = array.join("/");
  126. return node;
  127. },
  128. lineToHump: function (name) {
  129. return name.replace(/\_(\w)/g, function (all, letter) {
  130. return letter.toUpperCase();
  131. });
  132. },
  133. humpToLine: function (name) {
  134. return name.replace(/([A-Z])/g, "_$1").toLowerCase();
  135. },
  136. },
  137. msg: {
  138. // 成功消息
  139. success: function (msg, callback) {
  140. if (callback === undefined) {
  141. callback = function () {
  142. }
  143. }
  144. var index = layer.msg(msg, {icon: 1, shade: admin.config.shade, scrollbar: false, time: 2000, shadeClose: true}, callback);
  145. return index;
  146. },
  147. // 失败消息
  148. error: function (msg, callback) {
  149. if (callback === undefined) {
  150. callback = function () {
  151. }
  152. }
  153. var index = layer.msg(msg, {icon: 2, shade: admin.config.shade, scrollbar: false, time: 3000, shadeClose: true}, callback);
  154. return index;
  155. },
  156. // 警告消息框
  157. alert: function (msg, callback) {
  158. var index = layer.alert(msg, {end: callback, scrollbar: false});
  159. return index;
  160. },
  161. // 对话框
  162. confirm: function (msg, ok, no) {
  163. var index = layer.confirm(msg, {title: '操作确认', btn: ['确认', '取消']}, function () {
  164. typeof ok === 'function' && ok.call(this);
  165. }, function () {
  166. typeof no === 'function' && no.call(this);
  167. self.close(index);
  168. });
  169. return index;
  170. },
  171. // 消息提示
  172. tips: function (msg, time, callback) {
  173. var index = layer.msg(msg, {time: (time || 3) * 1000, shade: this.shade, end: callback, shadeClose: true});
  174. return index;
  175. },
  176. // 加载中提示
  177. loading: function (msg, callback) {
  178. var index = msg ? layer.msg(msg, {icon: 16, scrollbar: false, shade: this.shade, time: 0, end: callback}) : layer.load(2, {time: 0, scrollbar: false, shade: this.shade, end: callback});
  179. return index;
  180. },
  181. // 关闭消息框
  182. close: function (index) {
  183. return layer.close(index);
  184. }
  185. },
  186. table: {
  187. render: function (options) {
  188. options.init = options.init || init;
  189. options.modifyReload = admin.parame(options.modifyReload, true);
  190. options.elem = options.elem || options.init.table_elem;
  191. options.id = options.id || options.init.table_render_id;
  192. options.layFilter = options.id + '_LayFilter';
  193. options.url = options.url || admin.url(options.init.index_url);
  194. options.headers = admin.headers();
  195. options.page = admin.parame(options.page, true);
  196. options.search = admin.parame(options.search, true);
  197. options.skin = options.skin || 'line';
  198. options.limit = options.limit || 15;
  199. options.limits = options.limits || [10, 15, 20, 25, 50, 100];
  200. options.cols = options.cols || [];
  201. options.defaultToolbar = (options.defaultToolbar === undefined && !options.search) ? ['filter', 'print', 'exports'] : ['filter', 'print', 'exports', {
  202. title: '搜索',
  203. layEvent: 'TABLE_SEARCH',
  204. icon: 'layui-icon-search',
  205. extend: 'data-table-id="' + options.id + '"'
  206. }];
  207. // 判断是否为移动端
  208. if (admin.checkMobile()) {
  209. options.defaultToolbar = !options.search ? ['filter'] : ['filter', {
  210. title: '搜索',
  211. layEvent: 'TABLE_SEARCH',
  212. icon: 'layui-icon-search',
  213. extend: 'data-table-id="' + options.id + '"'
  214. }];
  215. }
  216. // 判断元素对象是否有嵌套的
  217. options.cols = admin.table.formatCols(options.cols, options.init);
  218. // 初始化表格lay-filter
  219. $(options.elem).attr('lay-filter', options.layFilter);
  220. // 初始化表格搜索
  221. if (options.search === true) {
  222. admin.table.renderSearch(options.cols, options.elem, options.id);
  223. }
  224. // 初始化表格左上方工具栏
  225. options.toolbar = options.toolbar || ['refresh', 'add', 'delete', 'export','import'];
  226. options.toolbar = admin.table.renderToolbar(options.toolbar, options.elem, options.id, options.init);
  227. // 判断是否有操作列表权限
  228. options.cols = admin.table.renderOperat(options.cols, options.elem);
  229. // 初始化表格
  230. var newTable = table.render(options);
  231. // 监听表格搜索开关显示
  232. admin.table.listenToolbar(options.layFilter, options.id);
  233. // 监听表格开关切换
  234. admin.table.renderSwitch(options.cols, options.init, options.id, options.modifyReload);
  235. // 监听表格开关切换
  236. admin.table.listenEdit(options.init, options.layFilter, options.id, options.modifyReload);
  237. return newTable;
  238. },
  239. renderToolbar: function (data, elem, tableId, init) {
  240. data = data || [];
  241. var toolbarHtml = '';
  242. $.each(data, function (i, v) {
  243. if (v === 'refresh') {
  244. toolbarHtml += ' <button class="layui-btn layui-btn-sm layuimini-btn-primary" data-table-refresh="' + tableId + '"><i class="fa fa-refresh"></i> </button>\n';
  245. } else if (v === 'add') {
  246. if (admin.checkAuth('add', elem)) {
  247. toolbarHtml += '<button class="layui-btn layui-btn-normal layui-btn-sm" data-open="' + init.add_url + '" data-title="添加"><i class="fa fa-plus"></i> 添加</button>\n';
  248. }
  249. } else if (v === 'delete') {
  250. if (admin.checkAuth('delete', elem)) {
  251. toolbarHtml += '<button class="layui-btn layui-btn-sm layui-btn-danger" data-url="' + init.delete_url + '" data-table-delete="' + tableId + '"><i class="fa fa-trash-o"></i> 删除</button>\n';
  252. }
  253. }else if (v === 'setting') {
  254. if (admin.checkAuth('delete', elem)) {
  255. toolbarHtml += '<button class="layui-btn layui-btn-sm layui-btn-normal" data-url="' + init.setting_url + '" data-table-setting="' + tableId + '"> 批量编辑</button>\n';
  256. }
  257. } else if (v === 'export') {
  258. if (admin.checkAuth('export', elem)) {
  259. toolbarHtml += '<button class="layui-btn layui-btn-sm layui-btn-success easyadmin-export-btn" data-url="' + init.export_url + '" data-table-export="' + tableId + '"><i class="fa fa-file-excel-o"></i> 导出</button>\n';
  260. }
  261. } else if (v === 'import') {//新增加的
  262. toolbarHtml += '<button class="layui-btn layui-btn-sm layui-btn-success easyadmin-export-btn" data-url="' + init.import_url + '" data-table-import="' + tableId + '"><i class="fa fa-file-excel-o"></i> 导入</button>\n'+
  263. '<input type="file" name="dataimport" id="dataimport" style="display: none;">';
  264. // if (admin.checkAuth('import', elem)) {
  265. // toolbarHtml += '<button class="layui-btn layui-btn-sm layui-btn-success easyadmin-export-btn" data-url="' + init.import_url + '" data-table-import="' + tableId + '"><i class="fa fa-file-excel-o"></i> 导入</button>\n'+
  266. // '<input type="file" name="dataimport" id="dataimport" style="display: none;">';
  267. // }
  268. } else if (typeof v === "object") {
  269. $.each(v, function (ii, vv) {
  270. vv.class = vv.class || '';
  271. vv.icon = vv.icon || '';
  272. vv.auth = vv.auth || '';
  273. vv.url = vv.url || '';
  274. vv.method = vv.method || 'open';
  275. vv.title = vv.title || vv.text;
  276. vv.text = vv.text || vv.title;
  277. vv.extend = vv.extend || '';
  278. vv.checkbox = vv.checkbox || false;
  279. if (admin.checkAuth(vv.auth, elem)) {
  280. toolbarHtml += admin.table.buildToolbarHtml(vv, tableId);
  281. }
  282. });
  283. }
  284. });
  285. return '<div>' + toolbarHtml + '</div>';
  286. },
  287. renderSearch: function (cols, elem, tableId) {
  288. // TODO 只初始化第一个table搜索字段,如果存在多个(绝少数需求),得自己去扩展
  289. cols = cols[0] || {};
  290. var newCols = [];
  291. var formHtml = '';
  292. $.each(cols, function (i, d) {
  293. d.field = d.field || false;
  294. d.fieldAlias = admin.parame(d.fieldAlias, d.field);
  295. d.title = d.title || d.field || '';
  296. d.selectList = d.selectList || {};
  297. d.search = admin.parame(d.search, true);
  298. d.searchTip = d.searchTip || '请输入' + d.title || '';
  299. d.searchValue = d.searchValue || '';
  300. d.searchOp = d.searchOp || '%*%';
  301. d.timeType = d.timeType || 'datetime';
  302. if (d.field !== false && d.search !== false) {
  303. switch (d.search) {
  304. case true:
  305. formHtml += '\t<div class="layui-form-item layui-inline">\n' +
  306. '<label class="layui-form-label">' + d.title + '</label>\n' +
  307. '<div class="layui-input-inline">\n' +
  308. '<input id="c-' + d.fieldAlias + '" name="' + d.fieldAlias + '" data-search-op="' + d.searchOp + '" value="' + d.searchValue + '" placeholder="' + d.searchTip + '" class="layui-input">\n' +
  309. '</div>\n' +
  310. '</div>';
  311. break;
  312. case 'select':
  313. d.searchOp = '=';
  314. var selectHtml = '';
  315. $.each(d.selectList, function (sI, sV) {
  316. var selected = '';
  317. if (sI === d.searchValue) {
  318. selected = 'selected=""';
  319. }
  320. selectHtml += '<option value="' + sI + '" ' + selected + '>' + sV + '</option>/n';
  321. });
  322. formHtml += '\t<div class="layui-form-item layui-inline">\n' +
  323. '<label class="layui-form-label">' + d.title + '</label>\n' +
  324. '<div class="layui-input-inline">\n' +
  325. '<select class="layui-select" id="c-' + d.fieldAlias + '" name="' + d.fieldAlias + '" data-search-op="' + d.searchOp + '" >\n' +
  326. '<option value="">- 全部 -</option> \n' +
  327. selectHtml +
  328. '</select>\n' +
  329. '</div>\n' +
  330. '</div>';
  331. break;
  332. case 'range':
  333. d.searchOp = 'range';
  334. formHtml += '\t<div class="layui-form-item layui-inline">\n' +
  335. '<label class="layui-form-label">' + d.title + '</label>\n' +
  336. '<div class="layui-input-inline">\n' +
  337. '<input id="c-' + d.fieldAlias + '" name="' + d.fieldAlias + '" data-search-op="' + d.searchOp + '" value="' + d.searchValue + '" placeholder="' + d.searchTip + '" class="layui-input">\n' +
  338. '</div>\n' +
  339. '</div>';
  340. break;
  341. case 'time':
  342. d.searchOp = '=';
  343. formHtml += '\t<div class="layui-form-item layui-inline">\n' +
  344. '<label class="layui-form-label">' + d.title + '</label>\n' +
  345. '<div class="layui-input-inline">\n' +
  346. '<input id="c-' + d.fieldAlias + '" name="' + d.fieldAlias + '" data-search-op="' + d.searchOp + '" value="' + d.searchValue + '" placeholder="' + d.searchTip + '" class="layui-input">\n' +
  347. '</div>\n' +
  348. '</div>';
  349. break;
  350. }
  351. newCols.push(d);
  352. }
  353. });
  354. if (formHtml !== '') {
  355. $(elem).before('<fieldset id="searchFieldset_' + tableId + '" class="table-search-fieldset layui-hide">\n' +
  356. '<legend>条件搜索</legend>\n' +
  357. '<form class="layui-form layui-form-pane form-search">\n' +
  358. formHtml +
  359. '<div class="layui-form-item layui-inline" style="margin-left: 115px">\n' +
  360. '<button type="submit" class="layui-btn layui-btn-normal" data-type="tableSearch" data-table="' + tableId + '" lay-submit lay-filter="' + tableId + '_filter"> 搜 索</button>\n' +
  361. '<button type="reset" class="layui-btn layui-btn-primary" data-table-reset="' + tableId + '"> 重 置 </button>\n' +
  362. ' </div>' +
  363. '</form>' +
  364. '</fieldset>');
  365. admin.table.listenTableSearch(tableId);
  366. // 初始化form表单
  367. form.render();
  368. $.each(newCols, function (ncI, ncV) {
  369. if (ncV.search === 'range') {
  370. laydate.render({range: true, type: ncV.timeType, elem: '[name="' + ncV.fieldAlias + '"]'});
  371. }
  372. if (ncV.search === 'time') {
  373. laydate.render({type: ncV.timeType, elem: '[name="' + ncV.fieldAlias + '"]'});
  374. }
  375. });
  376. }
  377. },
  378. renderSwitch: function (cols, tableInit, tableId, modifyReload) {
  379. tableInit.modify_url = tableInit.modify_url || false;
  380. cols = cols[0] || {};
  381. tableId = tableId || init.table_render_id;
  382. if (cols.length > 0) {
  383. $.each(cols, function (i, v) {
  384. v.filter = v.filter || false;
  385. if (v.filter !== false && tableInit.modify_url !== false) {
  386. admin.table.listenSwitch({filter: v.filter, url: tableInit.modify_url, tableId: tableId, modifyReload: modifyReload});
  387. }
  388. });
  389. }
  390. },
  391. renderOperat(data, elem) {
  392. for (dk in data) {
  393. var col = data[dk];
  394. var operat = col[col.length - 1].operat;
  395. if (operat !== undefined) {
  396. var check = false;
  397. for (key in operat) {
  398. var item = operat[key];
  399. if (typeof item === 'string') {
  400. if (admin.checkAuth(item, elem)) {
  401. check = true;
  402. break;
  403. }
  404. } else {
  405. for (k in item) {
  406. var v = item[k];
  407. if (v.auth !== undefined && admin.checkAuth(v.auth, elem)) {
  408. check = true;
  409. break;
  410. }
  411. }
  412. }
  413. }
  414. if (!check) {
  415. data[dk].pop()
  416. }
  417. }
  418. }
  419. return data;
  420. },
  421. buildToolbarHtml: function (toolbar, tableId) {
  422. var html = '';
  423. toolbar.class = toolbar.class || '';
  424. toolbar.icon = toolbar.icon || '';
  425. toolbar.auth = toolbar.auth || '';
  426. toolbar.url = toolbar.url || '';
  427. toolbar.extend = toolbar.extend || '';
  428. toolbar.method = toolbar.method || 'open';
  429. toolbar.field = toolbar.field || 'id';
  430. toolbar.title = toolbar.title || toolbar.text;
  431. toolbar.text = toolbar.text || toolbar.title;
  432. toolbar.checkbox = toolbar.checkbox || false;
  433. var formatToolbar = toolbar;
  434. formatToolbar.icon = formatToolbar.icon !== '' ? '<i class="' + formatToolbar.icon + '"></i> ' : '';
  435. formatToolbar.class = formatToolbar.class !== '' ? 'class="' + formatToolbar.class + '" ' : '';
  436. if (toolbar.method === 'open') {
  437. formatToolbar.method = formatToolbar.method !== '' ? 'data-open="' + formatToolbar.url + '" data-title="' + formatToolbar.title + '" ' : '';
  438. } else if (toolbar.method === 'none'){ // 常用于与extend配合,自定义监听按钮
  439. formatToolbar.method = '';
  440. } else {
  441. formatToolbar.method = formatToolbar.method !== '' ? 'data-request="' + formatToolbar.url + '" data-title="' + formatToolbar.title + '" ' : '';
  442. }
  443. formatToolbar.checkbox = toolbar.checkbox ? ' data-checkbox="true" ' : '';
  444. formatToolbar.tableId = tableId !== undefined ? ' data-table="' + tableId + '" ' : '';
  445. html = '<button ' + formatToolbar.class + formatToolbar.method + formatToolbar.extend + formatToolbar.checkbox + formatToolbar.tableId + '>' + formatToolbar.icon + formatToolbar.text + '</button>';
  446. return html;
  447. },
  448. buildOperatHtml: function (operat) {
  449. var html = '';
  450. operat.class = operat.class || '';
  451. operat.icon = operat.icon || '';
  452. operat.auth = operat.auth || '';
  453. operat.url = operat.url || '';
  454. operat.extend = operat.extend || '';
  455. operat.method = operat.method || 'open';
  456. operat.field = operat.field || 'id';
  457. operat.title = operat.title || operat.text;
  458. operat.text = operat.text || operat.title;
  459. var formatOperat = operat;
  460. formatOperat.icon = formatOperat.icon !== '' ? '<i class="' + formatOperat.icon + '"></i> ' : '';
  461. formatOperat.class = formatOperat.class !== '' ? 'class="' + formatOperat.class + '" ' : '';
  462. if (operat.method === 'open') {
  463. formatOperat.method = formatOperat.method !== '' ? 'data-open="' + formatOperat.url + '" data-title="' + formatOperat.title + '" ' : '';
  464. } else if (operat.method === 'none'){ // 常用于与extend配合,自定义监听按钮
  465. formatOperat.method = '';
  466. } else {
  467. formatOperat.method = formatOperat.method !== '' ? 'data-request="' + formatOperat.url + '" data-title="' + formatOperat.title + '" ' : '';
  468. }
  469. html = '<a ' + formatOperat.class + formatOperat.method + formatOperat.extend + '>' + formatOperat.icon + formatOperat.text + '</a>';
  470. return html;
  471. },
  472. toolSpliceUrl(url, field, data) {
  473. url = url.indexOf("?") !== -1 ? url + '&' + field + '=' + data[field] : url + '?' + field + '=' + data[field];
  474. return url;
  475. },
  476. formatCols: function (cols, init) {
  477. for (i in cols) {
  478. var col = cols[i];
  479. for (index in col) {
  480. var val = col[index];
  481. // 判断是否包含初始化数据
  482. if (val.init === undefined) {
  483. cols[i][index]['init'] = init;
  484. }
  485. // 格式化列操作栏
  486. if (val.templet === admin.table.tool && val.operat === undefined) {
  487. cols[i][index]['operat'] = ['edit', 'delete'];
  488. }
  489. // 判断是否包含开关组件
  490. if (val.templet === admin.table.switch && val.filter === undefined) {
  491. cols[i][index]['filter'] = val.field;
  492. }
  493. // 判断是否含有搜索下拉列表
  494. if (val.selectList !== undefined && val.search === undefined) {
  495. cols[i][index]['search'] = 'select';
  496. }
  497. // 判断是否初始化对齐方式
  498. if (val.align === undefined) {
  499. cols[i][index]['align'] = 'center';
  500. }
  501. // 部分字段开启排序
  502. var sortDefaultFields = ['id', 'sort'];
  503. if (val.sort === undefined && sortDefaultFields.indexOf(val.field) >= 0) {
  504. cols[i][index]['sort'] = true;
  505. }
  506. // 初始化图片高度
  507. if (val.templet === admin.table.image && val.imageHeight === undefined) {
  508. cols[i][index]['imageHeight'] = 40;
  509. }
  510. // 判断是否多层对象
  511. if (val.field !== undefined && val.field.split(".").length > 1) {
  512. if (val.templet === undefined) {
  513. cols[i][index]['templet'] = admin.table.value;
  514. }
  515. }
  516. // 判断是否列表数据转换
  517. if (val.selectList !== undefined && val.templet === undefined) {
  518. cols[i][index]['templet'] = admin.table.list;
  519. }
  520. }
  521. }
  522. return cols;
  523. },
  524. tool: function (data, option) {
  525. option.operat = option.operat || ['edit', 'delete'];
  526. var elem = option.init.table_elem || init.table_elem;
  527. var html = '';
  528. $.each(option.operat, function (i, item) {
  529. if (typeof item === 'string') {
  530. switch (item) {
  531. case 'edit':
  532. var operat = {
  533. class: 'layui-btn layui-btn-success layui-btn-xs',
  534. method: 'open',
  535. field: 'id',
  536. icon: '',
  537. text: '编辑',
  538. title: '编辑信息',
  539. auth: 'edit',
  540. url: option.init.edit_url,
  541. extend: ""
  542. };
  543. operat.url = admin.table.toolSpliceUrl(operat.url, operat.field, data);
  544. if (admin.checkAuth(operat.auth, elem)) {
  545. html += admin.table.buildOperatHtml(operat);
  546. }
  547. break;
  548. case 'delete':
  549. var operat = {
  550. class: 'layui-btn layui-btn-danger layui-btn-xs',
  551. method: 'get',
  552. field: 'id',
  553. icon: '',
  554. text: '删除',
  555. title: '确定删除?',
  556. auth: 'delete',
  557. url: option.init.delete_url,
  558. extend: ""
  559. };
  560. operat.url = admin.table.toolSpliceUrl(operat.url, operat.field, data);
  561. if (admin.checkAuth(operat.auth, elem)) {
  562. html += admin.table.buildOperatHtml(operat);
  563. }
  564. break;
  565. }
  566. } else if (typeof item === 'object') {
  567. $.each(item, function (i, operat) {
  568. operat.class = operat.class || '';
  569. operat.icon = operat.icon || '';
  570. operat.auth = operat.auth || '';
  571. operat.url = operat.url || '';
  572. operat.method = operat.method || 'open';
  573. operat.field = operat.field || 'id';
  574. operat.title = operat.title || operat.text;
  575. operat.text = operat.text || operat.title;
  576. operat.extend = operat.extend || '';
  577. // 自定义表格opreat按钮的弹窗标题风格,extra是表格里的欲加入标题中的字段
  578. operat.extra = operat.extra || '';
  579. if (data[operat.extra] !== undefined) {
  580. operat.title = data[operat.extra] + ' - ' + operat.title;
  581. }
  582. operat.url = admin.table.toolSpliceUrl(operat.url, operat.field, data);
  583. if (admin.checkAuth(operat.auth, elem)) {
  584. html += admin.table.buildOperatHtml(operat);
  585. }
  586. });
  587. }
  588. });
  589. return html;
  590. },
  591. list: function (data, option) {
  592. option.selectList = option.selectList || {};
  593. var field = option.field;
  594. try {
  595. var value = eval("data." + field);
  596. } catch (e) {
  597. var value = undefined;
  598. }
  599. if (option.selectList[value] === undefined || option.selectList[value] === '' || option.selectList[value] === null) {
  600. return value;
  601. } else {
  602. return option.selectList[value];
  603. }
  604. },
  605. image: function (data, option) {
  606. option.imageWidth = option.imageWidth || 200;
  607. option.imageHeight = option.imageHeight || 40;
  608. option.imageSplit = option.imageSplit || '|';
  609. option.imageJoin = option.imageJoin || '<br>';
  610. option.title = option.title || option.field;
  611. var field = option.field,
  612. title = data[option.title];
  613. try {
  614. var value = eval("data." + field);
  615. } catch (e) {
  616. var value = undefined;
  617. }
  618. if (value === undefined || value===null) {
  619. return '<img style="max-width: ' + option.imageWidth + 'px; max-height: ' + option.imageHeight + 'px;" src="' + value + '" data-image="' + title + '">';
  620. } else {
  621. var values = value.split(option.imageSplit),
  622. valuesHtml = [];
  623. values.forEach((value, index) => {
  624. valuesHtml.push('<img style="max-width: ' + option.imageWidth + 'px; max-height: ' + option.imageHeight + 'px;" src="' + value + '" data-image="' + title + '">');
  625. });
  626. return valuesHtml.join(option.imageJoin);
  627. }
  628. },
  629. url: function (data, option) {
  630. var field = option.field;
  631. try {
  632. var value = eval("data." + field);
  633. } catch (e) {
  634. var value = undefined;
  635. }
  636. return '<a class="layuimini-table-url" href="' + value + '" target="_blank" class="label bg-green">' + value + '</a>';
  637. },
  638. switch: function (data, option) {
  639. var field = option.field;
  640. option.filter = option.filter || option.field || null;
  641. option.checked = option.checked || 1;
  642. option.tips = option.tips || '开|关';
  643. try {
  644. var value = eval("data." + field);
  645. } catch (e) {
  646. var value = undefined;
  647. }
  648. var checked = value === option.checked ? 'checked' : '';
  649. return laytpl('<input type="checkbox" name="' + option.field + '" value="' + data.id + '" lay-skin="switch" lay-text="' + option.tips + '" lay-filter="' + option.filter + '" ' + checked + ' >').render(data);
  650. },
  651. price: function (data, option) {
  652. var field = option.field;
  653. try {
  654. var value = eval("data." + field);
  655. } catch (e) {
  656. var value = undefined;
  657. }
  658. return '<span>¥' + value + '</span>';
  659. },
  660. percent: function (data, option) {
  661. var field = option.field;
  662. try {
  663. var value = eval("data." + field);
  664. } catch (e) {
  665. var value = undefined;
  666. }
  667. return '<span>' + value + '%</span>';
  668. },
  669. icon: function (data, option) {
  670. var field = option.field;
  671. try {
  672. var value = eval("data." + field);
  673. } catch (e) {
  674. var value = undefined;
  675. }
  676. return '<i class="' + value + '"></i>';
  677. },
  678. text: function (data, option) {
  679. var field = option.field;
  680. try {
  681. var value = eval("data." + field);
  682. } catch (e) {
  683. var value = undefined;
  684. }
  685. return '<span class="line-limit-length">' + value + '</span>';
  686. },
  687. value: function (data, option) {
  688. var field = option.field;
  689. try {
  690. var value = eval("data." + field);
  691. } catch (e) {
  692. var value = undefined;
  693. }
  694. return '<span>' + value + '</span>';
  695. },
  696. //时间戳转日期
  697. date: function (data, option) {
  698. var field = option.field, value = '';
  699. try {
  700. value = eval("data." + field);
  701. } catch (e) {}
  702. if (!admin.empty(value)){
  703. value = util.toDateString(value * 1000, option.format || 'yyyy-MM-dd HH:mm:ss');
  704. }
  705. return '<span>' + value + '</span>';
  706. },
  707. listenTableSearch: function (tableId) {
  708. form.on('submit(' + tableId + '_filter)', function (data) {
  709. var dataField = data.field;
  710. var formatFilter = {},
  711. formatOp = {};
  712. $.each(dataField, function (key, val) {
  713. if (val !== '') {
  714. formatFilter[key] = val;
  715. var op = $('#c-' + key).attr('data-search-op');
  716. op = op || '%*%';
  717. formatOp[key] = op;
  718. }
  719. });
  720. table.reload(tableId, {
  721. page: {
  722. curr: 1
  723. }
  724. , where: {
  725. filter: JSON.stringify(formatFilter),
  726. op: JSON.stringify(formatOp)
  727. }
  728. }, 'data');
  729. return false;
  730. });
  731. },
  732. listenSwitch: function (option, ok) {
  733. option.filter = option.filter || '';
  734. option.url = option.url || '';
  735. option.field = option.field || option.filter || '';
  736. option.tableId = option.tableId || init.table_render_id;
  737. option.modifyReload = option.modifyReload || false;
  738. form.on('switch(' + option.filter + ')', function (obj) {
  739. var checked = obj.elem.checked ? 1 : 0;
  740. if (typeof ok === 'function') {
  741. return ok({
  742. id: obj.value,
  743. checked: checked,
  744. });
  745. } else {
  746. var data = {
  747. id: obj.value,
  748. field: option.field,
  749. value: checked,
  750. };
  751. admin.request.post({
  752. url: option.url,
  753. prefix: true,
  754. data: data,
  755. }, function (res) {
  756. if (option.modifyReload) {
  757. table.reload(option.tableId);
  758. }
  759. }, function (res) {
  760. admin.msg.error(res.msg, function () {
  761. table.reload(option.tableId);
  762. });
  763. }, function () {
  764. table.reload(option.tableId);
  765. });
  766. }
  767. });
  768. },
  769. listenToolbar: function (layFilter, tableId) {
  770. table.on('toolbar(' + layFilter + ')', function (obj) {
  771. // 搜索表单的显示
  772. switch (obj.event) {
  773. case 'TABLE_SEARCH':
  774. var searchFieldsetId = 'searchFieldset_' + tableId;
  775. var _that = $("#" + searchFieldsetId);
  776. if (_that.hasClass("layui-hide")) {
  777. _that.removeClass('layui-hide');
  778. } else {
  779. _that.addClass('layui-hide');
  780. }
  781. break;
  782. }
  783. });
  784. },
  785. listenEdit: function (tableInit, layFilter, tableId, modifyReload) {
  786. tableInit.modify_url = tableInit.modify_url || false;
  787. tableId = tableId || init.table_render_id;
  788. if (tableInit.modify_url !== false) {
  789. table.on('edit(' + layFilter + ')', function (obj) {
  790. var value = obj.value,
  791. data = obj.data,
  792. id = data.id,
  793. field = obj.field;
  794. var _data = {
  795. id: id,
  796. field: field,
  797. value: value,
  798. };
  799. admin.request.post({
  800. url: tableInit.modify_url,
  801. prefix: true,
  802. data: _data,
  803. }, function (res) {
  804. if (modifyReload) {
  805. table.reload(tableId);
  806. }
  807. }, function (res) {
  808. admin.msg.error(res.msg, function () {
  809. table.reload(tableId);
  810. });
  811. }, function () {
  812. table.reload(tableId);
  813. });
  814. });
  815. }
  816. },
  817. },
  818. checkMobile: function () {
  819. var userAgentInfo = navigator.userAgent;
  820. var mobileAgents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
  821. var mobile_flag = false;
  822. //根据userAgent判断是否是手机
  823. for (var v = 0; v < mobileAgents.length; v++) {
  824. if (userAgentInfo.indexOf(mobileAgents[v]) > 0) {
  825. mobile_flag = true;
  826. break;
  827. }
  828. }
  829. var screen_width = window.screen.width;
  830. var screen_height = window.screen.height;
  831. //根据屏幕分辨率判断是否是手机
  832. if (screen_width < 600 && screen_height < 800) {
  833. mobile_flag = true;
  834. }
  835. return mobile_flag;
  836. },
  837. open: function (title, url, width, height, isResize, shadeClose = false) {
  838. isResize = isResize === undefined ? true : isResize;
  839. var index = layer.open({
  840. title: title,
  841. type: 2,
  842. area: [width, height],
  843. content: url,
  844. maxmin: true,
  845. moveOut: true,
  846. shadeClose: shadeClose,
  847. success: function (layero, index) {
  848. var body = layer.getChildFrame('body', index);
  849. if (body.length > 0) {
  850. $.each(body, function (i, v) {
  851. // todo 优化弹出层背景色修改
  852. $(v).before('<style>\n' +
  853. 'html, body {\n' +
  854. ' background: #ffffff;\n' +
  855. '}\n' +
  856. '</style>');
  857. });
  858. }
  859. },
  860. end: function () {
  861. index = null
  862. }
  863. });
  864. if (admin.checkMobile() || width === undefined || height === undefined) {
  865. layer.full(index);
  866. }
  867. if (isResize) {
  868. $(window).on("resize", function () {
  869. index && layer.full(index);
  870. })
  871. }
  872. },
  873. listen: function (preposeCallback, ok, no, ex) {
  874. // 监听表单是否为必填项
  875. admin.api.formRequired();
  876. // 监听表单提交事件
  877. admin.api.formSubmit(preposeCallback, ok, no, ex);
  878. // 初始化图片显示以及监听上传事件
  879. admin.api.upload();
  880. // 监听富文本初始化
  881. admin.api.editor();
  882. // 监听下拉选择生成
  883. admin.api.select();
  884. // 监听时间控件生成
  885. admin.api.date();
  886. // 初始化layui表单
  887. form.render();
  888. // 表格修改
  889. $("body").on("mouseenter", ".table-edit-tips", function () {
  890. var openTips = layer.tips('点击行内容可以进行修改', $(this), {tips: [2, '#e74c3c'], time: 4000});
  891. });
  892. // 监听弹出层的打开
  893. $('body').on('click', '[data-open]', function () {
  894. var clienWidth = $(this).attr('data-width'),
  895. clientHeight = $(this).attr('data-height'),
  896. dataFull = $(this).attr('data-full'),
  897. checkbox = $(this).attr('data-checkbox'),
  898. url = $(this).attr('data-open'),
  899. external = $(this).attr('data-external') || false,
  900. tableId = $(this).attr('data-table');
  901. if(checkbox === 'true'){
  902. tableId = tableId || init.table_render_id;
  903. var checkStatus = table.checkStatus(tableId),
  904. data = checkStatus.data;
  905. if (data.length <= 0) {
  906. admin.msg.error('请勾选需要操作的数据');
  907. return false;
  908. }
  909. var ids = [];
  910. $.each(data, function (i, v) {
  911. ids.push(v.id);
  912. });
  913. if (url.indexOf("?") === -1) {
  914. url += '?id=' + ids.join(',');
  915. } else {
  916. url += '&id=' + ids.join(',');
  917. }
  918. }
  919. if (clienWidth === undefined || clientHeight === undefined) {
  920. var width = document.body.clientWidth,
  921. height = document.body.clientHeight;
  922. if (width >= 800 && height >= 600) {
  923. clienWidth = '800px';
  924. clientHeight = '600px';
  925. } else {
  926. clienWidth = '100%';
  927. clientHeight = '100%';
  928. }
  929. }
  930. if (dataFull === 'true') {
  931. clienWidth = '100%';
  932. clientHeight = '100%';
  933. }
  934. admin.open(
  935. $(this).attr('data-title'),
  936. external ? url : admin.url(url),
  937. clienWidth,
  938. clientHeight,
  939. );
  940. });
  941. // 放大图片
  942. $('body').on('click', '[data-image]', function () {
  943. var title = $(this).attr('data-image'),
  944. src = $(this).attr('src'),
  945. alt = $(this).attr('alt');
  946. var photos = {
  947. "title": title,
  948. "id": Math.random(),
  949. "data": [
  950. {
  951. "alt": alt,
  952. "pid": Math.random(),
  953. "src": src,
  954. "thumb": src
  955. }
  956. ]
  957. };
  958. layer.photos({
  959. photos: photos,
  960. anim: 5
  961. });
  962. return false;
  963. });
  964. // 放大一组图片
  965. $('body').on('click', '[data-images]', function () {
  966. var title = $(this).attr('data-images'),
  967. // 从当前元素向上找layuimini-upload-show找到第一个后停止, 再找其所有子元素li
  968. doms = $(this).closest(".layuimini-upload-show").children("li"),
  969. // 被点击的图片地址
  970. now_src = $(this).attr('src'),
  971. alt = $(this).attr('alt'),
  972. data = [];
  973. $.each(doms, function(key, value){
  974. var src = $(value).find('img').attr('src');
  975. if(src != now_src){
  976. // 压入其他图片地址
  977. data.push({
  978. "alt": alt,
  979. "pid": Math.random(),
  980. "src": src,
  981. "thumb": src
  982. });
  983. }else{
  984. // 把当前图片插入到头部
  985. data.unshift({
  986. "alt": alt,
  987. "pid": Math.random(),
  988. "src": now_src,
  989. "thumb": now_src
  990. });
  991. }
  992. });
  993. var photos = {
  994. "title": title,
  995. "id": Math.random(),
  996. "data": data,
  997. };
  998. layer.photos({
  999. photos: photos,
  1000. anim: 5
  1001. });
  1002. return false;
  1003. });
  1004. // 监听动态表格刷新
  1005. $('body').on('click', '[data-table-refresh]', function () {
  1006. var tableId = $(this).attr('data-table-refresh');
  1007. if (tableId === undefined || tableId === '' || tableId == null) {
  1008. tableId = init.table_render_id;
  1009. }
  1010. table.reload(tableId);
  1011. });
  1012. // 监听搜索表格重置
  1013. $('body').on('click', '[data-table-reset]', function () {
  1014. var tableId = $(this).attr('data-table-reset');
  1015. if (tableId === undefined || tableId === '' || tableId == null) {
  1016. tableId = init.table_render_id;
  1017. }
  1018. table.reload(tableId, {
  1019. page: {
  1020. curr: 1
  1021. }
  1022. , where: {
  1023. filter: '{}',
  1024. op: '{}'
  1025. }
  1026. }, 'data');
  1027. });
  1028. // 监听请求
  1029. $('body').on('click', '[data-request]', function () {
  1030. var title = $(this).attr('data-title'),
  1031. url = $(this).attr('data-request'),
  1032. tableId = $(this).attr('data-table'),
  1033. addons = $(this).attr('data-addons'),
  1034. checkbox = $(this).attr('data-checkbox'),
  1035. direct = $(this).attr('data-direct'),
  1036. field = $(this).attr('data-field') || 'id';
  1037. title = title || '确定进行该操作?';
  1038. if (direct === 'true') {
  1039. admin.msg.confirm(title, function () {
  1040. window.location.href = url;
  1041. });
  1042. return false;
  1043. }
  1044. var postData = {};
  1045. if(checkbox === 'true'){
  1046. tableId = tableId || init.table_render_id;
  1047. var checkStatus = table.checkStatus(tableId),
  1048. data = checkStatus.data;
  1049. if (data.length <= 0) {
  1050. admin.msg.error('请勾选需要操作的数据');
  1051. return false;
  1052. }
  1053. var ids = [];
  1054. $.each(data, function (i, v) {
  1055. ids.push(v[field]);
  1056. });
  1057. postData[field] = ids;
  1058. }
  1059. if (addons !== true && addons !== 'true') {
  1060. url = admin.url(url);
  1061. }
  1062. tableId = tableId || init.table_render_id;
  1063. admin.msg.confirm(title, function () {
  1064. admin.request.post({
  1065. url: url,
  1066. data: postData,
  1067. }, function (res) {
  1068. admin.msg.success(res.msg, function () {
  1069. table.reload(tableId);
  1070. });
  1071. })
  1072. });
  1073. return false;
  1074. });
  1075. // excel导出
  1076. $('body').on('click', '[data-table-export]', function () {
  1077. var tableId = $(this).attr('data-table-export'),
  1078. url = $(this).attr('data-url');
  1079. var index = admin.msg.confirm('根据查询进行导出,确定导出?', function () {
  1080. window.location = admin.url(url);
  1081. layer.close(index);
  1082. });
  1083. });
  1084. // excel导入
  1085. $('body').on('click', '[data-table-import]', function () {
  1086. // 监听上传事件
  1087. // console.log(admin.url(init.upload_url));
  1088. // console.log(admin.headers());
  1089. var url = $(this).attr('data-url');
  1090. var input = $("#dataimport");
  1091. input.trigger("click");
  1092. var data = '';
  1093. var fileobj = '';
  1094. var formFile = new FormData();
  1095. input.change(function () {
  1096. // 如果value不为空,调用文件加载方法
  1097. // if ($(this).val() !== "") {
  1098. var fileobj = document.getElementById("dataimport").files[0];
  1099. //console.log(filestring);
  1100. formFile.append("file", fileobj); //加入文件对象
  1101. formFile.append("upload_type", 'local');
  1102. var data = formFile;
  1103. $.ajax({
  1104. url: admin.url(url) ,
  1105. type: 'POST',
  1106. data: data,
  1107. dataType: "json",
  1108. async: false,
  1109. cache: false,
  1110. contentType: false,
  1111. processData: false,
  1112. success: function (result) {
  1113. location.reload();
  1114. console.log(result);
  1115. },
  1116. });
  1117. // }
  1118. })
  1119. });
  1120. // 数据表格多删除
  1121. $('body').on('click', '[data-table-delete]', function () {
  1122. var tableId = $(this).attr('data-table-delete'),
  1123. url = $(this).attr('data-url');
  1124. tableId = tableId || init.table_render_id;
  1125. url = url !== undefined ? admin.url(url) : window.location.href;
  1126. var checkStatus = table.checkStatus(tableId),
  1127. data = checkStatus.data;
  1128. if (data.length <= 0) {
  1129. admin.msg.error('请勾选需要删除的数据');
  1130. return false;
  1131. }
  1132. var ids = [];
  1133. $.each(data, function (i, v) {
  1134. ids.push(v.id);
  1135. });
  1136. admin.msg.confirm('确定删除?', function () {
  1137. admin.request.post({
  1138. url: url,
  1139. data: {
  1140. id: ids
  1141. },
  1142. }, function (res) {
  1143. admin.msg.success(res.msg, function () {
  1144. table.reload(tableId);
  1145. });
  1146. });
  1147. });
  1148. return false;
  1149. });
  1150. // 数据表格多设置
  1151. $('body').on('click', '[data-table-setting]', function () {
  1152. var tableId = $(this).attr('data-table-setting'),
  1153. url = $(this).attr('data-url');
  1154. tableId = tableId || init.table_render_id;
  1155. url = url !== undefined ? admin.url(url) : window.location.href;
  1156. var checkStatus = table.checkStatus(tableId),
  1157. data = checkStatus.data;
  1158. if (data.length <= 0) {
  1159. admin.msg.error('请勾选需要设置的数据');
  1160. return false;
  1161. }
  1162. var ids = [];
  1163. $.each(data, function (i, v) {
  1164. ids.push(v.id);
  1165. });
  1166. url += '?id=' + ids.join(',');
  1167. var clienWidth = $(this).attr('data-width'),
  1168. clientHeight = $(this).attr('data-height'),
  1169. dataFull = $(this).attr('data-full');
  1170. if (clienWidth === undefined || clientHeight === undefined) {
  1171. var width = document.body.clientWidth,
  1172. height = document.body.clientHeight;
  1173. if (width >= 800 && height >= 600) {
  1174. clienWidth = '800px';
  1175. clientHeight = '600px';
  1176. } else {
  1177. clienWidth = '100%';
  1178. clientHeight = '100%';
  1179. }
  1180. }
  1181. if (dataFull === 'true') {
  1182. clienWidth = '100%';
  1183. clientHeight = '100%';
  1184. }
  1185. admin.open(
  1186. '批量编辑',
  1187. url,
  1188. clienWidth,
  1189. clientHeight,
  1190. );
  1191. });
  1192. },
  1193. api: {
  1194. form: function (url, data, ok, no, ex, refreshTable) {
  1195. if (refreshTable === undefined) {
  1196. refreshTable = true;
  1197. }
  1198. ok = ok || function (res) {
  1199. res.msg = res.msg || '';
  1200. admin.msg.success(res.msg, function () {
  1201. admin.api.closeCurrentOpen({
  1202. refreshTable: refreshTable
  1203. });
  1204. });
  1205. return false;
  1206. };
  1207. admin.request.post({
  1208. url: url,
  1209. data: data,
  1210. }, ok, no, ex);
  1211. return false;
  1212. },
  1213. closeCurrentOpen: function (option) {
  1214. option = option || {};
  1215. option.refreshTable = option.refreshTable || false;
  1216. option.refreshFrame = option.refreshFrame || false;
  1217. if (option.refreshTable === true) {
  1218. option.refreshTable = init.table_render_id;
  1219. }
  1220. var index = parent.layer.getFrameIndex(window.name);
  1221. parent.layer.close(index);
  1222. if (option.refreshTable !== false) {
  1223. parent.layui.table.reload(option.refreshTable);
  1224. }
  1225. if (option.refreshFrame) {
  1226. parent.location.reload();
  1227. }
  1228. return false;
  1229. },
  1230. refreshFrame: function () {
  1231. parent.location.reload();
  1232. return false;
  1233. },
  1234. refreshTable: function (tableName) {
  1235. tableName = tableName || 'currentTable';
  1236. table.reload(tableName);
  1237. },
  1238. formRequired: function () {
  1239. var verifyList = document.querySelectorAll("[lay-verify]");
  1240. if (verifyList.length > 0) {
  1241. $.each(verifyList, function (i, v) {
  1242. var verify = $(this).attr('lay-verify');
  1243. // todo 必填项处理
  1244. if (verify.includes('required')) {
  1245. var label = $(this).parent().prev();
  1246. if (label.is('label') && !label.hasClass('required')) {
  1247. label.addClass('required');
  1248. }
  1249. if ($(this).attr('lay-reqtext') === undefined && $(this).attr('placeholder') !== undefined) {
  1250. $(this).attr('lay-reqtext', $(this).attr('placeholder'));
  1251. }
  1252. if ($(this).attr('placeholder') === undefined && $(this).attr('lay-reqtext') !== undefined) {
  1253. $(this).attr('placeholder', $(this).attr('lay-reqtext'));
  1254. }
  1255. }
  1256. });
  1257. }
  1258. },
  1259. formSubmit: function (preposeCallback, ok, no, ex) {
  1260. var formList = document.querySelectorAll("[lay-submit]");
  1261. // 表单提交自动处理
  1262. if (formList.length > 0) {
  1263. $.each(formList, function (i, v) {
  1264. var filter = $(this).attr('lay-filter'),
  1265. type = $(this).attr('data-type'),
  1266. refresh = $(this).attr('data-refresh'),
  1267. url = $(this).attr('lay-submit');
  1268. // 表格搜索不做自动提交
  1269. if (type === 'tableSearch') {
  1270. return false;
  1271. }
  1272. // 判断是否需要刷新表格
  1273. if (refresh === 'false') {
  1274. refresh = false;
  1275. } else {
  1276. refresh = true;
  1277. }
  1278. // 自动添加layui事件过滤器
  1279. if (filter === undefined || filter === '') {
  1280. filter = 'save_form_' + (i + 1);
  1281. $(this).attr('lay-filter', filter)
  1282. }
  1283. if (url === undefined || url === '' || url === null) {
  1284. url = window.location.href;
  1285. } else {
  1286. url = admin.url(url);
  1287. }
  1288. form.on('submit(' + filter + ')', function (data) {
  1289. var dataField = data.field;
  1290. // 富文本数据处理
  1291. var editorList = document.querySelectorAll(".editor");
  1292. if (editorList.length > 0) {
  1293. $.each(editorList, function (i, v) {
  1294. var name = $(this).attr("name");
  1295. dataField[name] = CKEDITOR.instances[name].getData();
  1296. });
  1297. }
  1298. if (typeof preposeCallback === 'function') {
  1299. dataField = preposeCallback(dataField);
  1300. }
  1301. admin.api.form(url, dataField, ok, no, ex, refresh);
  1302. return false;
  1303. });
  1304. });
  1305. }
  1306. },
  1307. upload: function () {
  1308. var uploadList = document.querySelectorAll("[data-upload]");
  1309. var uploadSelectList = document.querySelectorAll("[data-upload-select]");
  1310. if (uploadList.length > 0) {
  1311. $.each(uploadList, function (i, v) {
  1312. var uploadExts = $(this).attr('data-upload-exts') || init.upload_exts,
  1313. uploadName = $(this).attr('data-upload'),
  1314. uploadNumber = $(this).attr('data-upload-number') || 'one',
  1315. uploadSign = $(this).attr('data-upload-sign') || '|',
  1316. uploadAccept = $(this).attr('data-upload-accept') || 'file',
  1317. uploadAcceptMime = $(this).attr('data-upload-mimetype') || '',
  1318. elem = "input[name='" + uploadName + "']",
  1319. uploadElem = this;
  1320. // 监听上传事件
  1321. upload.render({
  1322. elem: this,
  1323. url: admin.url(init.upload_url),
  1324. exts: uploadExts,
  1325. accept: uploadAccept,//指定允许上传时校验的文件类型
  1326. acceptMime: uploadAcceptMime,//规定打开文件选择框时,筛选出的文件类型
  1327. multiple: uploadNumber !== 'one',//是否多文件上传
  1328. headers:admin.headers(),
  1329. done: function (res) {
  1330. if (res.code === 1) {
  1331. var url = res.data.url;
  1332. if (uploadNumber !== 'one') {
  1333. var oldUrl = $(elem).val();
  1334. if (oldUrl !== '') {
  1335. url = oldUrl + uploadSign + url;
  1336. }
  1337. }
  1338. $(elem).val(url);
  1339. $(elem).trigger("input");
  1340. admin.msg.success(res.msg);
  1341. } else {
  1342. admin.msg.error(res.msg);
  1343. }
  1344. return false;
  1345. }
  1346. });
  1347. // 监听上传input值变化
  1348. $(elem).bind("input propertychange", function (event) {
  1349. var urlString = $(this).val(),
  1350. urlArray = urlString.split(uploadSign),
  1351. uploadIcon = $(uploadElem).attr('data-upload-icon') || "file";
  1352. $('#bing-' + uploadName).remove();
  1353. if (urlString.length > 0) {
  1354. var parant = $(this).parent('div');
  1355. var liHtml = '';
  1356. $.each(urlArray, function (i, v) {
  1357. liHtml += '<li><a><img src="' + v + '" data-image onerror="this.src=\'' + BASE_URL + 'admin/images/upload-icons/' + uploadIcon + '.png\';this.onerror=null"></a><small class="uploads-delete-tip bg-red badge" data-upload-delete="' + uploadName + '" data-upload-url="' + v + '" data-upload-sign="' + uploadSign + '">×</small></li>\n';
  1358. });
  1359. parant.after('<ul id="bing-' + uploadName + '" class="layui-input-block layuimini-upload-show">\n' + liHtml + '</ul>');
  1360. }
  1361. });
  1362. // 非空初始化图片显示
  1363. if ($(elem).val() !== '') {
  1364. $(elem).trigger("input");
  1365. }
  1366. });
  1367. // 监听上传文件的删除事件
  1368. $('body').on('click', '[data-upload-delete]', function () {
  1369. var uploadName = $(this).attr('data-upload-delete'),
  1370. deleteUrl = $(this).attr('data-upload-url'),
  1371. sign = $(this).attr('data-upload-sign');
  1372. var confirm = admin.msg.confirm('确定删除?', function () {
  1373. var elem = "input[name='" + uploadName + "']";
  1374. var currentUrl = $(elem).val();
  1375. var url = '';
  1376. if (currentUrl !== deleteUrl) {
  1377. url = currentUrl.search(deleteUrl) === 0 ? currentUrl.replace(deleteUrl + sign, '') : currentUrl.replace(sign + deleteUrl, '');
  1378. $(elem).val(url);
  1379. $(elem).trigger("input");
  1380. } else {
  1381. $(elem).val(url);
  1382. $('#bing-' + uploadName).remove();
  1383. }
  1384. admin.msg.close(confirm);
  1385. });
  1386. return false;
  1387. });
  1388. }
  1389. if (uploadSelectList.length > 0) {
  1390. $.each(uploadSelectList, function (i, v) {
  1391. var uploadName = $(this).attr('data-upload-select'),
  1392. uploadNumber = $(this).attr('data-upload-number') || 'one',
  1393. uploadSign = $(this).attr('data-upload-sign') || '|';
  1394. var selectCheck = uploadNumber === 'one' ? 'radio' : 'checkbox';
  1395. var elem = "input[name='" + uploadName + "']",
  1396. uploadElem = $(this).attr('id');
  1397. tableSelect.render({
  1398. elem: "#" + uploadElem,
  1399. checkedKey: 'id',
  1400. searchType: 'more',
  1401. searchList: [
  1402. {searchKey: 'title', searchPlaceholder: '请输入文件名'},
  1403. ],
  1404. table: {
  1405. url: admin.url('ajax/getUploadFiles'),
  1406. cols: [[
  1407. {type: selectCheck},
  1408. {field: 'id', title: 'ID'},
  1409. {field: 'url', minWidth: 80, search: false, title: '图片信息', imageHeight: 40, align: "center", templet: admin.table.image},
  1410. {field: 'original_name', width: 150, title: '文件原名', align: "center"},
  1411. {field: 'mime_type', width: 120, title: 'mime类型', align: "center"},
  1412. {field: 'create_time', width: 200, title: '创建时间', align: "center", search: 'range'},
  1413. ]]
  1414. },
  1415. done: function (e, data) {
  1416. var urlArray = [];
  1417. $.each(data.data, function (index, val) {
  1418. urlArray.push(val.url)
  1419. });
  1420. var url = urlArray.join(uploadSign);
  1421. admin.msg.success('选择成功', function () {
  1422. $(elem).val(url);
  1423. $(elem).trigger("input");
  1424. });
  1425. }
  1426. })
  1427. });
  1428. }
  1429. },
  1430. editor: function () {
  1431. CKEDITOR.tools.setCookie('ckCsrfToken', window.CONFIG.CSRF_TOKEN);
  1432. var editorList = document.querySelectorAll(".editor");
  1433. if (editorList.length > 0) {
  1434. $.each(editorList, function (i, v) {
  1435. CKEDITOR.replace(
  1436. $(this).attr("name"),
  1437. {
  1438. height: $(this).height(),
  1439. filebrowserImageUploadUrl: admin.url('ajax/uploadEditor'),
  1440. });
  1441. });
  1442. }
  1443. },
  1444. select: function () {
  1445. var selectList = document.querySelectorAll("[data-select]");
  1446. $.each(selectList, function (i, v) {
  1447. var url = $(this).attr('data-select'),
  1448. selectFields = $(this).attr('data-fields'),
  1449. value = $(this).attr('data-value'),
  1450. that = this,
  1451. html = '<option value=""></option>';
  1452. var fields = selectFields.replace(/\s/g, "").split(',');
  1453. if (fields.length !== 2) {
  1454. return admin.msg.error('下拉选择字段有误');
  1455. }
  1456. admin.request.get(
  1457. {
  1458. url: url,
  1459. data: {
  1460. selectFields: selectFields
  1461. },
  1462. }, function (res) {
  1463. var list = res.data;
  1464. list.forEach(val => {
  1465. var key = val[fields[0]];
  1466. if (value !== undefined && key.toString() === value) {
  1467. html += '<option value="' + key + '" selected="">' + val[fields[1]] + '</option>';
  1468. } else {
  1469. html += '<option value="' + key + '">' + val[fields[1]] + '</option>';
  1470. }
  1471. });
  1472. $(that).html(html);
  1473. form.render();
  1474. }
  1475. );
  1476. });
  1477. },
  1478. date: function () {
  1479. var dateList = document.querySelectorAll("[data-date]");
  1480. if (dateList.length > 0) {
  1481. $.each(dateList, function (i, v) {
  1482. var format = $(this).attr('data-date'),
  1483. type = $(this).attr('data-date-type'),
  1484. range = $(this).attr('data-date-range');
  1485. if(type === undefined || type === '' || type ===null){
  1486. type = 'datetime';
  1487. }
  1488. var options = {
  1489. elem: this,
  1490. type: type,
  1491. };
  1492. if (format !== undefined && format !== '' && format !== null) {
  1493. options['format'] = format;
  1494. }
  1495. if (range !== undefined) {
  1496. if(range === null || range === ''){
  1497. range = '-';
  1498. }
  1499. options['range'] = range;
  1500. }
  1501. laydate.render(options);
  1502. });
  1503. }
  1504. },
  1505. },
  1506. };
  1507. return admin;
  1508. });