Common.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. /**
  2. * [Prompt 公共提示]
  3. * @author Devil
  4. * @blog http://gong.gg/
  5. * @version 0.0.1
  6. * @datetime 2016-12-10T14:32:39+0800
  7. * @param {[string]} msg [提示信息]
  8. * @param {[string]} type [类型(失败:danger, 成功success)]
  9. * @param {[int]} time [自动关闭时间(秒), 默认3秒]
  10. */
  11. var temp_time_out;
  12. function Prompt(msg, type, time)
  13. {
  14. if(msg != undefined && msg != '')
  15. {
  16. // 是否已存在提示条
  17. if($('#common-prompt').length > 0)
  18. {
  19. clearTimeout(temp_time_out);
  20. }
  21. // 提示信息添加
  22. $('#common-prompt').remove();
  23. if(type == undefined || type == '') type = 'danger';
  24. var html = '<div id="common-prompt" class="am-alert am-alert-'+type+' am-animation-shake" data-am-alert><button type="button" class="am-close am-close-spin">&times;</button><p>'+msg+'</p></div>';
  25. $('body').append(html);
  26. // 自动关闭提示
  27. if(time == undefined || time == '') time = 3;
  28. temp_time_out = setTimeout(function()
  29. {
  30. $('#common-prompt').remove();
  31. }, time*1000);
  32. }
  33. }
  34. /**
  35. * [ArrayTurnJson js数组转json]
  36. * @author Devil
  37. * @blog http://gong.gg/
  38. * @version 0.0.1
  39. * @datetime 2016-12-10T14:32:04+0800
  40. * @param {[array]} all [需要被转的数组]
  41. * @param {[object]} object [需要压进去的json对象]
  42. * @return {[object]} [josn对象]
  43. */
  44. function ArrayTurnJson(all, object)
  45. {
  46. for(var name in all)
  47. {
  48. object.append(name, all[name]);
  49. }
  50. return object;
  51. }
  52. /**
  53. * [GetFormVal 获取form表单的数据]
  54. * @author Devil
  55. * @blog http://gong.gg/
  56. * @version 0.0.1
  57. * @datetime 2016-12-10T14:31:19+0800
  58. * @param {[string]} element [元素的class或id]
  59. * @return {[object]} [josn对象]
  60. */
  61. function GetFormVal(element)
  62. {
  63. var object = new FormData();
  64. // input 常用类型
  65. $(element).find('input[type="hidden"], input[type="text"], input[type="password"], input[type="email"], input[type="number"], input[type="date"], input[type="url"], input[type="radio"]:checked, textarea, input[type="file"]').each(function(key, tmp)
  66. {
  67. if(tmp.type == 'file')
  68. {
  69. object.append(tmp.name, ($(this).get(0).files[0] == undefined) ? '' : $(this).get(0).files[0]);
  70. } else {
  71. object.append(tmp.name, tmp.value.replace(/^\s+|\s+$/g,""));
  72. }
  73. });
  74. // select 单选择和多选择
  75. var tmp_all = [];
  76. var i = 0;
  77. $(element).find('select').find('option, optgroup option').each(function(key, tmp)
  78. {
  79. var name = $(this).parents('select').attr('name');
  80. if(name != undefined && name != '')
  81. {
  82. if($(this).is(':selected'))
  83. {
  84. // 多选择
  85. if($(this).parent().attr('multiple') != undefined)
  86. {
  87. if(tmp_all[name] == undefined) tmp_all[name] = [];
  88. tmp_all[name][i] = tmp.value;
  89. i++;
  90. } else {
  91. // 单选择
  92. object.append(name, tmp.value);
  93. }
  94. }
  95. }
  96. });
  97. object = ArrayTurnJson(tmp_all, object);
  98. // input 复选框checkboox
  99. tmp_all = [];
  100. i = 0;
  101. $(element).find('input[type="checkbox"]').each(function(key, tmp)
  102. {
  103. if(tmp.name != undefined && tmp.name != '')
  104. {
  105. if($(this).is(':checked'))
  106. {
  107. if(tmp_all[tmp.name] == undefined) tmp_all[tmp.name] = [];
  108. tmp_all[tmp.name][i] = tmp.value;
  109. i++;
  110. }
  111. }
  112. });
  113. object = ArrayTurnJson(tmp_all, object);
  114. return object;
  115. }
  116. /**
  117. * [IsExitsFunction 方法是否已定义]
  118. * @author Devil
  119. * @blog http://gong.gg/
  120. * @version 0.0.1
  121. * @datetime 2016-12-10T14:30:37+0800
  122. * @param {[string]} fun_name [方法名]
  123. * @return {[boolean]} [已定义true, 则false]
  124. */
  125. function IsExitsFunction(fun_name)
  126. {
  127. try
  128. {
  129. if(typeof(eval(fun_name)) == "function") return true;
  130. } catch(e) {}
  131. return false;
  132. }
  133. /**
  134. * [$form.validator 公共表单校验, 添加class form-validation 类的表单自动校验]
  135. * @author Devil
  136. * @blog http://gong.gg/
  137. * @version 0.0.1
  138. * @datetime 2016-12-10T14:22:39+0800
  139. * @param {[string] [form_name] [标题class或id]}
  140. * @param {[string] [action] [请求地址]}
  141. * @param {[string] [method] [请求类型 POST, GET]}
  142. * @param {[string] [request-type] [回调类型 ajax-url, ajax-fun, ajax-reload]}
  143. * @param {[string] [request-value] [回调值 ajax-url地址 或 ajax-fun方法]}
  144. */
  145. function FromInit(form_name)
  146. {
  147. if(form_name == undefined)
  148. {
  149. form_name = 'form.form-validation';
  150. }
  151. var editor_tag_name = 'editor-tag';
  152. var $form = $(form_name);
  153. var $editor_tag = $form.find('[id='+editor_tag_name+']');
  154. var editor_count = $editor_tag.length;
  155. if(editor_count > 0)
  156. {
  157. // 编辑器初始化
  158. var editor = UE.getEditor(editor_tag_name);
  159. // 编辑器内容变化时同步到 textarea
  160. editor.addListener('contentChange', function()
  161. {
  162. editor.sync();
  163. // 触发验证
  164. $editor_tag.trigger('change');
  165. });
  166. }
  167. $form.validator(
  168. {
  169. onInValid: function(validity)
  170. {
  171. // 错误信息
  172. var $field = $(validity.field);
  173. var msg = $field.data('validationMessage') || this.getValidationMessage(validity);
  174. Prompt(msg);
  175. },
  176. submit: function(e)
  177. {
  178. if(editor_count > 0)
  179. {
  180. // 同步编辑器数据
  181. editor.sync();
  182. // 表单验证未成功,而且未成功的第一个元素为 UEEditor 时,focus 编辑器
  183. if (!this.isFormValid() && $form.find('.' + this.options.inValidClass).eq(0).is($editor_tag))
  184. {
  185. // 编辑器获取焦点
  186. editor.focus();
  187. // 错误信息
  188. var msg = $editor_tag.data('validationMessage') || $editor_tag.getValidationMessage(validity);
  189. Prompt(msg);
  190. }
  191. }
  192. // 通过验证
  193. if(this.isFormValid())
  194. {
  195. // button加载
  196. var $button = $form.find('button[type="submit"]');
  197. $button.button('loading');
  198. // 开启进度条
  199. $.AMUI.progress.start();
  200. // 获取表单数据
  201. var action = $form.attr('action');
  202. var method = $form.attr('method');
  203. var request_type = $form.attr('request-type');
  204. var request_value = $form.attr('request-value');
  205. var ajax_all = ['ajax-reload', 'ajax-url', 'ajax-fun'];
  206. // 参数校验
  207. if(ajax_all.indexOf(request_type) == -1 || action == undefined || action == '' || method == undefined || method == '')
  208. {
  209. $.AMUI.progress.done();
  210. $button.button('reset');
  211. Prompt('表单参数配置有误');
  212. return false;
  213. }
  214. // 类型不等于刷新的时候,类型值必须填写
  215. if(request_type != 'ajax-reload' && (request_value == undefined || request_value == ''))
  216. {
  217. $.AMUI.progress.done();
  218. $button.button('reset');
  219. Prompt('表单[类型值]参数配置有误');
  220. return false;
  221. }
  222. // ajax请求
  223. $.ajax({
  224. url:action,
  225. type:method,
  226. dataType:"json",
  227. timeout:10000,
  228. data:GetFormVal(form_name),
  229. processData:false,
  230. contentType:false,
  231. success:function(result)
  232. {
  233. // 调用自定义回调方法
  234. if(request_type == 'ajax-fun')
  235. {
  236. if(IsExitsFunction(request_value))
  237. {
  238. window[request_value](result);
  239. } else {
  240. $.AMUI.progress.done();
  241. $button.button('reset');
  242. Prompt('['+request_value+']表单定义的方法未定义');
  243. }
  244. } else if(request_type == 'ajax-url' || request_type == 'ajax-reload')
  245. {
  246. $.AMUI.progress.done();
  247. if(result.code == 0)
  248. {
  249. // url跳转
  250. if(request_type == 'ajax-url')
  251. {
  252. window.location.href = request_value;
  253. // 页面刷新
  254. } else if(request_type == 'ajax-reload')
  255. {
  256. Prompt(result.msg, 'success');
  257. setTimeout(function()
  258. {
  259. window.location.reload();
  260. }, 1500);
  261. }
  262. } else {
  263. Prompt(result.msg);
  264. $button.button('reset');
  265. }
  266. }
  267. },
  268. error:function(xhr, type)
  269. {
  270. $.AMUI.progress.done();
  271. $button.button('reset');
  272. Prompt('网络异常错误');
  273. }
  274. });
  275. }
  276. return false;
  277. }
  278. });
  279. }
  280. // 默认初始化一次,默认标签[form.form-validation]
  281. FromInit('form.form-validation');
  282. /**
  283. * [FormDataFill 表单数据填充]
  284. * @author Devil
  285. * @blog http://gong.gg/
  286. * @version 0.0.1
  287. * @datetime 2016-12-14T14:46:47+0800
  288. * @param {[json]} json [json数据对象]
  289. * @param {[string]} tag [tag标签]
  290. */
  291. function FormDataFill(json, tag)
  292. {
  293. if(json != undefined)
  294. {
  295. if(tag == undefined)
  296. {
  297. tag = 'form.form-validation';
  298. }
  299. $form = $(tag);
  300. for(var i in json)
  301. {
  302. $form.find('input[type="hidden"][name="'+i+'"], input[type="text"][name="'+i+'"], input[type="password"][name="'+i+'"], input[type="email"][name="'+i+'"], input[type="number"][name="'+i+'"], input[type="date"][name="'+i+'"], textarea[name="'+i+'"], select[name="'+i+'"], input[type="url"][name="'+i+'"]').val(json[i]);
  303. // input radio
  304. $form.find('input[type="radio"][name="'+i+'"]').each(function(temp_value, temp_tag)
  305. {
  306. var state = (json[i] == temp_value);
  307. this.checked = state;
  308. });
  309. }
  310. // 多选插件事件更新
  311. if($('.chosen-select').length > 0)
  312. {
  313. $('.chosen-select').trigger('chosen:updated');
  314. }
  315. }
  316. }
  317. /**
  318. * [Tree 树方法]
  319. * @author Devil
  320. * @blog http://gong.gg/
  321. * @version 0.0.1
  322. * @datetime 2017-01-13T10:30:23+0800
  323. * @param {[int]} id [节点id]
  324. * @param {[string]} url [请求url地址]
  325. * @param {[int]} level [层级]
  326. */
  327. function Tree(id, url, level)
  328. {
  329. $.ajax({
  330. url:url,
  331. type:'POST',
  332. dataType:"json",
  333. timeout:10000,
  334. data:{"id":id},
  335. success:function(result)
  336. {
  337. if(result.code == 0 && result.data.length > 0)
  338. {
  339. html = (id != 0) ? '' : '<table class="am-table am-table-striped am-table-hover">';
  340. for(var i in result.data)
  341. {
  342. // 数据 start
  343. var is_active = (result.data[i]['is_enable'] == 0) ? 'am-active' : '';
  344. html += '<tr id="data-list-'+result.data[i]['id']+'" class="tree-pid-'+id+' '+is_active+'"><td>';
  345. tmp_level = (id != 0) ? parseInt(level)+20 : parseInt(level);
  346. if(result.data[i]['is_son'] == 'ok')
  347. {
  348. html += '<i class="am-icon-plus c-p tree-submit" data-id="'+result.data[i]['id']+'" data-url="'+result.data[i]['ajax_url']+'" data-level="'+tmp_level+'" style="margin-right:8px;width:12px;';
  349. if(id != 0)
  350. {
  351. html += 'margin-left:'+tmp_level+'px;';
  352. }
  353. html += '"></i>';
  354. html += '<span>'+result.data[i]['name']+'</span>';
  355. } else {
  356. html += '<span style="padding-left:'+tmp_level+'px;">'+result.data[i]['name']+'</span>';
  357. }
  358. // 数据 end
  359. // 操作项 start
  360. html += '<div class="fr m-r-20 submit">';
  361. html += '<span class="am-icon-edit am-icon-sm c-p submit-edit" data-am-modal="{target: \'#data-save-win\'}" data-json=\''+result.data[i]['json']+'\' data-is_exist_son="'+result.data[i]['is_son']+'"></span>';
  362. if(result.data[i]['is_son'] != 'ok')
  363. {
  364. html += '<span class="am-icon-trash-o am-icon-sm c-p m-l-20 m-r-15 submit-delete" data-id="'+result.data[i]['id']+'" data-url="'+result.data[i]['delete_url']+'"></span>';
  365. }
  366. html += '</div>';
  367. // 操作项 end
  368. html += '</td></tr>';
  369. }
  370. html += (id != 0) ? '' : '</table>';
  371. // 防止网络慢的情况下重复添加
  372. if($('#data-list-'+id).find('.tree-submit').attr('state') != 'ok')
  373. {
  374. if(id == 0)
  375. {
  376. $('#tree').html(html);
  377. } else {
  378. $('#data-list-'+id).after(html);
  379. $('#data-list-'+id).find('.tree-submit').attr('state', 'ok');
  380. $('#data-list-'+id).find('.tree-submit').removeClass('am-icon-plus');
  381. $('#data-list-'+id).find('.tree-submit').addClass('am-icon-minus-square');
  382. }
  383. }
  384. } else {
  385. $('#tree').find('p').text(result.msg);
  386. $('#tree').find('img').remove();
  387. }
  388. },
  389. error:function(xhr, type)
  390. {
  391. $('#tree').find('p').text('网络异常出错');
  392. $('#tree').find('img').remove();
  393. }
  394. });
  395. }
  396. // 公共数据操作
  397. $(function()
  398. {
  399. // 多选插件初始化
  400. if($('.chosen-select').length > 0)
  401. {
  402. $('.chosen-select').chosen();
  403. }
  404. /**
  405. * [submit-delete 删除数据列表]
  406. * @author Devil
  407. * @blog http://gong.gg/
  408. * @version 0.0.1
  409. * @datetime 2016-12-10T14:22:39+0800
  410. * @param {[int] [data-id] [数据id]}
  411. * @param {[string] [data-url] [请求地址]}
  412. */
  413. $(document).on('click', '.submit-delete', function()
  414. {
  415. $('#common-confirm-delete').modal({
  416. relatedTarget: this,
  417. onConfirm: function(options)
  418. {
  419. // 获取参数
  420. var $tag = $(this.relatedTarget);
  421. var id = $tag.data('id');
  422. var url = $tag.data('url');
  423. var list_tag = $tag.data('list-tag') || '#data-list-'+id;
  424. if(id == undefined || url == undefined)
  425. {
  426. Prompt('参数配置有误');
  427. return false;
  428. }
  429. // 请求删除数据
  430. $.ajax({
  431. url:url,
  432. type:'POST',
  433. dataType:"json",
  434. timeout:10000,
  435. data:{"id":id},
  436. success:function(result)
  437. {
  438. if(result.code == 0)
  439. {
  440. Prompt(result.msg, 'success');
  441. // 成功则删除数据列表
  442. $(list_tag).remove();
  443. } else {
  444. Prompt(result.msg);
  445. }
  446. },
  447. error:function(xhr, type)
  448. {
  449. Prompt('网络异常出错');
  450. }
  451. });
  452. },
  453. onCancel: function(){}
  454. });
  455. });
  456. /**
  457. * [submit-state 公共数据状态操作]
  458. * @author Devil
  459. * @blog http://gong.gg/
  460. * @version 0.0.1
  461. * @datetime 2016-12-10T14:22:39+0800
  462. * @param {[int] [data-id] [数据id]}
  463. * @param {[int] [data-state][状态值]}
  464. * @param {[string] [data-url] [请求地址]}
  465. */
  466. $(document).on('click', '.submit-state', function()
  467. {
  468. // 获取参数
  469. var $tag = $(this);
  470. var id = $tag.data('id');
  471. var state = ($tag.data('state') == 1) ? 0 : 1;
  472. var url = $tag.data('url');
  473. if(id == undefined || url == undefined)
  474. {
  475. Prompt('参数配置有误');
  476. return false;
  477. }
  478. // 请求更新数据
  479. $.ajax({
  480. url:url,
  481. type:'POST',
  482. dataType:"json",
  483. timeout:10000,
  484. data:{"id":id, "state":state},
  485. success:function(result)
  486. {
  487. if(result.code == 0)
  488. {
  489. Prompt(result.msg, 'success');
  490. // 成功则更新数据样式
  491. if($tag.hasClass('am-success'))
  492. {
  493. $tag.removeClass('am-success');
  494. $tag.addClass('am-default');
  495. if($('#data-list-'+id).length > 0)
  496. {
  497. $('#data-list-'+id).addClass('am-active');
  498. }
  499. } else {
  500. $tag.removeClass('am-default');
  501. $tag.addClass('am-success');
  502. if($('#data-list-'+id).length > 0)
  503. {
  504. $('#data-list-'+id).removeClass('am-active');
  505. }
  506. }
  507. $tag.data('state', state);
  508. } else {
  509. Prompt(result.msg);
  510. }
  511. },
  512. error:function(xhr, type)
  513. {
  514. Prompt('网络异常出错');
  515. }
  516. });
  517. });
  518. /**
  519. * [submit-edit 公共编辑]
  520. * @author Devil
  521. * @blog http://gong.gg/
  522. * @version 0.0.1
  523. * @datetime 2016-12-14T13:53:13+0800
  524. */
  525. $(document).on('click', '.submit-edit', function()
  526. {
  527. // 窗口标签
  528. var tag = $(this).data('tag') || 'data-save-win';
  529. // 更改窗口名称
  530. if($('#'+tag).length > 0)
  531. {
  532. $title = $('#'+tag).find('.am-popup-title');
  533. $title.text($title.data('edit-title'));
  534. }
  535. // 填充数据
  536. FormDataFill($(this).data('json'), '#'+tag);
  537. });
  538. /**
  539. * [tree-submit 公共无限节点]
  540. * @author Devil
  541. * @blog http://gong.gg/
  542. * @version 0.0.1
  543. * @datetime 2016-12-25T22:12:10+0800
  544. */
  545. $('#tree').on('click', '.tree-submit', function()
  546. {
  547. var id = parseInt($(this).data('id')) || 0;
  548. // 状态
  549. if($('#data-list-'+id).find('.tree-submit').attr('state') == 'ok')
  550. {
  551. if($(this).hasClass('am-icon-plus'))
  552. {
  553. $(this).removeClass('am-icon-plus');
  554. $(this).addClass('am-icon-minus-square');
  555. } else {
  556. $(this).removeClass('am-icon-minus-square');
  557. $(this).addClass('am-icon-plus');
  558. }
  559. $('.tree-pid-'+id).toggle(100);
  560. } else {
  561. var url = $(this).data('url') || '';
  562. var level = parseInt($(this).data('level')) || 0;
  563. if(id > 0 && url != '')
  564. {
  565. Tree(id, url, level);
  566. } else {
  567. Prompt('参数有误');
  568. }
  569. }
  570. });
  571. /**
  572. * [tree-submit-add 公共无限节点新增按钮处理]
  573. * @author Devil
  574. * @blog http://gong.gg/
  575. * @version 0.0.1
  576. * @datetime 2016-12-25T22:11:34+0800
  577. */
  578. $('.tree-submit-add').on('click', function()
  579. {
  580. // 更改窗口名称
  581. $title = $('#data-save-win').find('.am-popup-title');
  582. $title.text($title.data('add-title'));
  583. // 清空表单
  584. FormDataFill({"id":"", "pid":0, "name":"", "sort":0, "is_enable":1});
  585. // 移除菜单禁止状态
  586. $('form select[name="pid"]').removeAttr('disabled');
  587. // 校验成功状态增加失去焦点
  588. $('form').find('.am-field-valid').each(function()
  589. {
  590. $(this).blur();
  591. });
  592. });
  593. });