manage.html 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. {extend name="base"/}
  2. {block name="resources"}
  3. <style>
  4. .layui-layout-admin.admin-style-2 .layui-body .layui-tab + .body-content {padding-top: 65px!important;}
  5. .align-left {text-align: left!important;}
  6. .align-right {text-align: right!important;}
  7. .area-table .toggle {user-select: none;cursor: pointer;}
  8. .area-table .toggle .icon {display: inline-block;width: 10px;text-align: center}
  9. .area-table .flex-wrap {display: flex;align-items: center}
  10. .area-table .level-icon { margin-right: 10px; }
  11. .area-table .add-child {margin-left: 10px}
  12. .area-table tr th:first-child, .area-table tr td:first-child {padding: 9px 0 9px 10px}
  13. </style>
  14. {/block}
  15. {block name="main"}
  16. <div class="single-filter-box" style="display: block ">
  17. <button class="layui-btn add-area">添加地区</button>
  18. </div>
  19. <table class="layui-table area-table" lay-skin="nob">
  20. <colgroup>
  21. <col width="1%">
  22. <col width="50%">
  23. <col width="16%">
  24. <col width="17%">
  25. <col width="16%">
  26. </colgroup>
  27. <thead>
  28. <tr>
  29. <th></th>
  30. <th class="align-left">名称</th>
  31. <th class="align-left">简称</th>
  32. <th class="align-left">地区编码</th>
  33. <th class="align-right">操作</th>
  34. </tr>
  35. </thead>
  36. {foreach name="area" item="vo"}
  37. <tbody data-parent="0" data-id="{$vo.id}" data-level="1">
  38. <tr>
  39. {if $vo.child_num}
  40. <td class="toggle"><span class="icon text-color">+</span></td>
  41. {else/}
  42. <td></td>
  43. {/if}
  44. <td class="flex-wrap">
  45. <input type="text" class="layui-input len-mid" name="name" value="{$vo.name}">
  46. <a href="javascript:;" class="text-color add-child">添加下级地区</a>
  47. </td>
  48. <td>
  49. <input type="text" class="layui-input len-mid" name="shortname" value="{$vo.shortname}">
  50. </td>
  51. <td>{$vo.id}</td>
  52. <td class="align-right">
  53. <a href="javascript:;" class="text-color delete-area">删除</a>
  54. </td>
  55. </tr>
  56. </tbody>
  57. {/foreach}
  58. </table>
  59. <table>
  60. </table>
  61. {/block}
  62. {block name="script"}
  63. <script type="text/javascript">
  64. $(function(){
  65. // 点击展开子菜单
  66. $('body').on('click', '.area-table .toggle', function(){
  67. var data = $(this).parents('tbody').data();
  68. if (!$('.area-table tbody[data-parent="'+ data.id +'"][data-id]').length) {
  69. var child = getChild(data.id, data.level + 1);
  70. if (child.length) {
  71. var html = '';
  72. child.forEach(function(item){
  73. html += '<tbody data-parent="'+ data.id +'" data-id="'+ item.id +'" data-level="'+ (data.level + 1) +'"><tr>';
  74. if (item.child_num) html += '<td class="toggle"><span class="icon text-color">+</span></td>';
  75. else html += '<td></td>';
  76. html += '<td class="flex-wrap"><span class="level-icon">'+ (data.level == 1 ? '|--' : '|----') +'</span><input type="text" class="layui-input len-mid" name="name" value="'+ item.name +'">';
  77. if (data.level < 2) html += '<a href="javascript:;" class="add-child text-color">添加下级地区</a></td>';
  78. else html += '</td>';
  79. html += '<td><input type="text" class="layui-input len-mid" name="shortname" value="'+ item.shortname +'"></td>';
  80. html += '<td>'+ item.id +'</td>';
  81. html+= '<td class="align-right"><a href="javascript:;" class="text-color delete-area">删除</a></td>';
  82. html+= '</tr></tbody>';
  83. })
  84. $(this).parents('tbody').after(html);
  85. }
  86. $(this).html('<span class="icon text-color">-</span>');
  87. } else {
  88. if ($('.area-table tbody[data-parent="'+ data.id +'"][data-id]:eq(0)').is(':hidden')) {
  89. $('.area-table tbody[data-parent="'+ data.id +'"]').show();
  90. $(this).html('<span class="icon text-color">-</span>');
  91. } else {
  92. $('.area-table tbody[data-parent="'+ data.id +'"]').hide();
  93. $(this).html('<span class="icon text-color">+</span>');
  94. }
  95. }
  96. })
  97. // 添加子菜单
  98. $('body').on('click', '.area-table .add-child', function(){
  99. var data = $(this).parents('tbody').data();
  100. var html = '<tbody data-parent="'+ data.id +'" data-id="0" data-level="'+ (data.level + 1) +'"><tr>';
  101. html += '<td></td>';
  102. html += '<td class="flex-wrap"><span class="level-icon">'+ (data.level == 1 ? '|--' : '|----') +'</span><input type="text" class="layui-input len-mid" name="name" value=""></td>';
  103. html += '<td><input type="text" class="layui-input len-mid" name="shortname" value=""></td>';
  104. html += '<td><input type="text" class="layui-input len-short" name="id" value=""></td>';
  105. html += '<td class="align-right"></td>';
  106. html+= '</tr></tbody>';
  107. if (!$('.area-table tbody[data-parent="'+ data.id +'"]').length) {
  108. $(this).parents('tbody').after(html);
  109. } else {
  110. $('.area-table tbody[data-parent="'+ data.id +'"]:last').after(html);
  111. }
  112. })
  113. $('.add-area').click(function (){
  114. var html = `<tbody data-parent="0" data-id="0" data-level="1">
  115. <tr>
  116. <td></td>
  117. <td class="flex-wrap">
  118. <input type="text" class="layui-input len-mid" name="name" value="">
  119. </td>
  120. <td>
  121. <input type="text" class="layui-input len-mid" name="shortname" value="">
  122. </td>
  123. <td>
  124. <input type="text" class="layui-input len-short" name="id" value="">
  125. </td>
  126. <td class="align-right">
  127. </td>
  128. </tr>
  129. </tbody>`;
  130. $('.area-table thead').after(html);
  131. })
  132. // 保存或编辑地区
  133. $('body').on('change', '.area-table input', function(){
  134. var tbody = $(this).parents('tbody');
  135. var form = {
  136. id: tbody.attr('data-id') != 0 ? tbody.attr('data-id') : tbody.find('[name="id"]').val().trim(),
  137. pid: tbody.attr('data-parent'),
  138. level: tbody.attr('data-level'),
  139. name: tbody.find('[name="name"]').val().trim(),
  140. shortname: tbody.find('[name="shortname"]').val().trim(),
  141. };
  142. if (form.id == 0 || !form.name) return;
  143. $.ajax({
  144. url: ns.url('shop/address/savearea'),
  145. data: form,
  146. dataType: 'json',
  147. success: function(res){
  148. if (res.code == 0) {
  149. if (!tbody.attr('data-id')) tbody.attr('data-id', res.data);
  150. } else {
  151. layer.msg(res.message);
  152. }
  153. }
  154. })
  155. })
  156. var deleteRepeat = false;
  157. $('body').on('click', '.area-table .delete-area', function(){
  158. var tbody = $(this).parents('tbody');
  159. layer.confirm('删除该地区将会连该地区下级的地区也一并删除,是否要继续操作?', function() {
  160. if (deleteRepeat) return;
  161. deleteRepeat = true;
  162. $.ajax({
  163. url: ns.url('shop/address/deletearea'),
  164. data: {
  165. id: tbody.attr('data-id'),
  166. level: tbody.attr('data-level'),
  167. },
  168. dataType: 'json',
  169. success: function(res){
  170. deleteRepeat = false;
  171. if (res.code == 0) {
  172. layer.closeAll();
  173. tbody.remove();
  174. switch (tbody.attr('data-level')) {
  175. case '1':
  176. $('.area-table tbody[data-parent="'+ tbody.attr('data-id') +'"]').each(function (){
  177. let id = $(this).attr('data-id');
  178. $('.area-table tbody[data-parent="'+ id +'"]').remove();
  179. $(this).remove();
  180. })
  181. break;
  182. case '2':
  183. $('.area-table tbody[data-parent="'+ tbody.attr('data-id') +'"]').remove();
  184. break;
  185. }
  186. } else {
  187. layer.msg(res.message);
  188. }
  189. }
  190. })
  191. })
  192. })
  193. })
  194. function getChild(pid, level){
  195. var data = [];
  196. $.ajax({
  197. url: ns.url('shop/address/getAreaList'),
  198. data: {
  199. pid: pid,
  200. level: level,
  201. child: 1
  202. },
  203. dataType: 'json',
  204. async: false,
  205. success: function(res){
  206. if (res.code == 0 && res.data) {
  207. data = res.data;
  208. }
  209. }
  210. })
  211. return data;
  212. }
  213. </script>
  214. {/block}