form.html 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. <link rel="stylesheet" href="/static/plugs/layui/css/layui.css" media="all">
  2. <style>
  3. table .uploadimage{
  4. width: 50px;
  5. height: 50px;
  6. }
  7. </style>
  8. <div class="think-box-shadow" style="height: 100%">
  9. <form class="layui-form layui-card" id="subForm" action="{:request()->url()}" data-auto="true" method="post" autocomplete="off">
  10. <fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
  11. <legend>商品编辑</legend>
  12. </fieldset>
  13. <div class="layui-tab">
  14. <ul class="layui-tab-title">
  15. <li class="layui-this">基础设置</li>
  16. <li>其他</li>
  17. </ul>
  18. <div class="layui-tab-content">
  19. <!-- 基础设置-->
  20. <div class="layui-tab-item layui-show">
  21. <div class="layui-form-item">
  22. <label class="layui-form-label label-required">商品名称</label>
  23. <div class="layui-input-block">
  24. <input name="name" lay-verify="required" maxlength="50" value='{$vo.name|default=""}' placeholder="请输入商品名称" class="layui-input">
  25. </div>
  26. </div>
  27. <div class="layui-form-item">
  28. <label class="layui-form-label label-required">商品简介</label>
  29. <div class="layui-input-block">
  30. <input name="desc" maxlength="50" value='{$vo.desc|default=""}' placeholder="请输入商品简介" class="layui-input">
  31. </div>
  32. </div>
  33. <div class="layui-form-item">
  34. <label class="layui-form-label label-required">商品分类</label>
  35. <div class="layui-input-inline">
  36. <select name="first_classify" lay-filter ="first_classify">
  37. <option value="0">请选择</option>
  38. {if !empty($goods_cate)}
  39. {foreach $goods_cate as $ck=>$cv}
  40. {if $vo.first_classify == $cv['id'] }
  41. <option selected data-cl_key="{$ck}" value="{$cv['id']}">{$cv['title']}</option>
  42. {else}
  43. <option data-cl_key="{$ck}" value="{$cv['id']}">{$cv['title']}</option>
  44. {/if}
  45. {/foreach}
  46. {/if}
  47. </select>
  48. </div>
  49. <div class="layui-input-inline">
  50. <select name="second_classify" lay-filter ="second_classify">
  51. <option value="0">请选择</option>
  52. {if !empty($goods_cate)}
  53. {foreach $goods_cate as $ck=>$cv}
  54. {if $vo.first_classify == $cv['id'] }
  55. {foreach $cv['children'] as $cln}
  56. {if $vo.second_classify == $cln['id'] }
  57. <option selected value="{$cln['id']}">{$cln['title']}</option>
  58. {else}
  59. <option value="{$cln['id']}">{$cln['title']}</option>
  60. {/if}
  61. {/foreach}
  62. {/if}
  63. {/foreach}
  64. {/if}
  65. </select>
  66. </div>
  67. </div>
  68. <div class="layui-form-item">
  69. <label class="layui-form-label label-required">商品封面</label>
  70. <div class="layui-input-block">
  71. <input name="cover" type="hidden" value="{$vo.cover|default=''}">
  72. </div>
  73. </div>
  74. <div class="layui-form-item">
  75. <label class="layui-form-label">是否秒杀</label>
  76. <div class="layui-input-block">
  77. <input type="hidden" name="is_seckill" value="{$vo.is_seckill|default='0'}" />
  78. {if $vo.is_seckill == 1}
  79. <input type="checkbox" lay-filter="is_seckill" checked="checked" lay-skin="switch" lay-text="ON|OFF">
  80. {else}
  81. <input type="checkbox" lay-filter="is_seckill" lay-skin="switch" lay-text="ON|OFF">
  82. {/if}
  83. </div>
  84. </div>
  85. <div class="seckill_box" {if !$vo.is_seckill}style="display: none"{/if}>
  86. <div class="layui-form-item " >
  87. <label class="layui-form-label">开始时间</label>
  88. <div class="layui-input-inline">
  89. <input type="text" class="layui-input" style="width: 300px" name="seckill_start" id="seckill_start" value='{$vo.seckill_start|default=""}' placeholder="请输选择秒杀开始时间">
  90. </div>
  91. </div>
  92. <div class="layui-form-item" >
  93. <label class="layui-form-label">结束时间</label>
  94. <div class="layui-input-inline">
  95. <input type="text" class="layui-input" style="width: 300px" name="seckill_end" id="seckill_end" value='{$vo.seckill_end|default=""}' placeholder="请输选择秒杀结束时间">
  96. </div>
  97. </div>
  98. </div>
  99. <!--规格-->
  100. <div class="layui-form-item">
  101. <label class="layui-form-label label-required">选择规格</label>
  102. <div class="layui-input-block">
  103. <input name="spec_id" type="hidden" value="{$vo.spec_id|default=''}">
  104. <input class="layui-input" readonly style="background-color:#e6e6e6 " name="" id="spec_id" value="{$goods_spec[$vo.spec_id]['title']|default=''}" />
  105. </div>
  106. </div>
  107. <div class="layui-form-item">
  108. <label class="layui-form-label"></label>
  109. <div class="layui-input-block">
  110. <table class="layui-table margin-top-10" lay-skin="line">
  111. <thead>
  112. <tr>
  113. <th class='text-left nowrap' style="width: 20%">货号</th>
  114. <th class='text-left nowrap'>图片</th>
  115. <th class='text-left nowrap'>库存</th>
  116. <th class='text-left nowrap'>原价</th>
  117. <th class='text-left nowrap'>售价</th>
  118. <th class='text-left nowrap seckill_price' style="display: none">秒杀价</th>
  119. <th class='text-left nowrap'>规格</th>
  120. <th class='text-left nowrap'>操作</th>
  121. </tr>
  122. </thead>
  123. <tbody class="no_html">
  124. {foreach $vo.spec as $sk=>$sv}
  125. <tr class="no_detail">
  126. <td class='text-left nowrap'>
  127. <input class='layui-input' name='goods_no[]' value="{$sv['goods_no']}"/>
  128. </td>
  129. <td class='text-left nowrap'>
  130. <input class="spec_img" name="spec_img[]" type="hidden" value="{$sv.spec_img|default=''}">
  131. </td>
  132. <td class='text-left nowrap'>
  133. <input class='layui-input' name='store_num[]' value="{$sv['store_num']}"/>
  134. </td>
  135. <td class='text-left nowrap'>
  136. <input class='layui-input' name='price[]' value="{$sv['price']}"/>
  137. </td>
  138. <td class='text-left nowrap'>
  139. <input class='layui-input' name='sell_money[]' value="{$sv['sell_money']}"/>
  140. </td>
  141. <td class='text-left nowrap seckill_price' style="display: none">
  142. <input class='layui-input' name='seckill_money[]' value="{$sv['seckill_money']|default=''}"/>
  143. </td>
  144. <td class='text-left nowrap'>
  145. <input readonly style="background-color: #e6e6e6" class='layui-input' name='spec_exp[]' value="{$sv['spec_exp']}"/>
  146. </td>
  147. <td class='text-left nowrap'>
  148. <a class="layui-btn layui-btn-sm layui-btn-danger del_no">删 除</a>
  149. </td>
  150. </tr>
  151. {/foreach}
  152. </tbody>
  153. </table>
  154. </div>
  155. </div>
  156. </div>
  157. <!--其他设置-->
  158. <div class="layui-tab-item">
  159. <!-- 运费设置-->
  160. <div class="freight_box">
  161. <div class="layui-form-item">
  162. <label class="layui-form-label">模板开关</label>
  163. <div class="layui-input-inline">
  164. {if $vo.freight_type == 1}
  165. <input type="checkbox" lay-filter="freight_type" checked="checked" lay-skin="switch" lay-text="ON|OFF">
  166. {else}
  167. <input type="checkbox" lay-filter="freight_type" lay-skin="switch" lay-text="ON|OFF">
  168. {/if}
  169. <input type="hidden" name="freight_type" value="{$vo.freight_type|default='0'}" />
  170. </div>
  171. </div>
  172. <div class="layui-form-item freight_mud" {if !$vo.freight_type}style="display:none"{/if}>
  173. <label class="layui-form-label">运费模板</label>
  174. <div class="layui-input-inline">
  175. <select name="freight_id" lay-filter ="freight_id">
  176. <option value="0">请选择</option>
  177. {if !empty($all_temp)}
  178. {foreach $all_temp as $tk=>$tv}
  179. {if $vo.freight_id ==$tv['id'] }
  180. <option selected value="{$tv['id']}">{$tv['name']}</option>
  181. {else}
  182. <option value="{$tv['id']}">{$tv['name']}</option>
  183. {/if}
  184. {/foreach}
  185. {/if}
  186. </select>
  187. </div>
  188. </div>
  189. <div class="layui-form-item postage" {if $vo.freight_type}style="display:none"{/if}>
  190. <label class="layui-form-label">运费金额</label>
  191. <div class="layui-input-inline">
  192. <input type="number" step="1" min="0" name="postage" value="{$vo.postage|default=''}" class="layui-input">
  193. </div>
  194. <div class="layui-form-mid layui-word-aux">不填(或0)表示包邮</div>
  195. </div>
  196. </div>
  197. <div class="layui-form-item" >
  198. <label class="layui-form-label">详情</label>
  199. <div class="layui-input-block">
  200. <textarea name="detail">{$vo.detail|default=""}</textarea>
  201. </div>
  202. </div>
  203. {notempty name='vo.id'}<input type='hidden' value='{$vo.id}' name='id'>{/notempty}
  204. <div class="layui-form-item text-center">
  205. <span class="layui-btn" type='submit' id ="submit">保 存</span>
  206. <button class="layui-btn layui-btn-danger" type='button' data-confirm="确定取消编辑吗?" data-close>取消编辑</button>
  207. </div>
  208. </div>
  209. </form>
  210. </div>
  211. <script src="/static/plugs/layui/layui.all.js" charset="utf-8"></script>
  212. <script>
  213. window.form.render();
  214. if($("input[name='is_seckill']").val() == 1){
  215. $(".seckill_price").show();
  216. }else{
  217. $(".seckill_price").hide();
  218. }
  219. require(['ckeditor', 'angular'], function () {
  220. window.createEditor('[name="detail"]', {height: 500,width:1000});
  221. })
  222. $.each($('.spec_img'),function (ik,iv) {
  223. $('.spec_img').eq(ik).uploadOneImage();
  224. })
  225. $('[name="cover"]').uploadOneImage();
  226. layui.use('laydate', function(){
  227. var laydate = layui.laydate;
  228. laydate.render({
  229. elem: '#seckill_start'
  230. ,type: 'datetime'
  231. });
  232. laydate.render({
  233. elem: '#seckill_end'
  234. ,type: 'datetime'
  235. });
  236. })
  237. layui.use('element', function(){
  238. var $ = layui.jquery
  239. ,element = layui.element;
  240. var active = {
  241. tabAdd: function(){
  242. element.tabAdd('demo', {
  243. title: '新选项'+ (Math.random()*1000|0)
  244. ,content: '内容'+ (Math.random()*1000|0)
  245. ,id: new Date().getTime()
  246. })
  247. }
  248. ,tabDelete: function(othis){
  249. element.tabDelete('demo', '44');
  250. othis.addClass('layui-btn-disabled');
  251. }
  252. ,tabChange: function(){
  253. element.tabChange('demo', '22');
  254. }
  255. };
  256. $('.site-demo-active').on('click', function(){
  257. var othis = $(this), type = othis.data('type');
  258. active[type] ? active[type].call(this, othis) : '';
  259. });
  260. //Hash地址的定位
  261. var layid = location.hash.replace(/^#test=/, '');
  262. element.tabChange('test', layid);
  263. element.on('tab(test)', function(elem){
  264. location.hash = 'test='+ $(this).attr('lay-id');
  265. });
  266. });
  267. $(document).on('click',".add_goods_no",function () {
  268. var no_html = '';
  269. no_html += ' <tr class="no_detail">';
  270. no_html += "<td class='text-left nowrap'> " +
  271. "<input class='layui-input' name='goods_no[]' value='1'/>" +
  272. "</td>";
  273. no_html += "<td class='text-left nowrap'>" +
  274. "<input class='layui-input' name='store_num[]' value='10'/>" +
  275. "</td>";
  276. no_html += "<td class='text-left nowrap'> " +
  277. "<input class='layui-input' name='price[]' value='100'/>" +
  278. "</td>";
  279. no_html += "<td class='text-left nowrap'> " +
  280. "<input class='layui-input' name='sell_money[]' value='100'/>" +
  281. "</td>";
  282. no_html += "<td class='text-left nowrap'> " +
  283. "<select name='spec_exp[]'>" +
  284. "<option value='1'>66</option>"+
  285. "<option value='2'>66</option>"+
  286. "</select>"+
  287. "</td>";
  288. no_html += "<td class='text-left nowrap'>" +
  289. "<a class=\"layui-btn layui-btn-sm layui-btn-danger del_no\">删 除</a>" +
  290. /* "<a class=\"layui-btn layui-btn-sm layui-btn-sm add_goods_no\">添 加</a>"+*/
  291. "</td>"
  292. no_html += "</tr>";
  293. $(".no_html").append(no_html);
  294. window.form.render();
  295. })
  296. $(document).on('click',".del_no",function (){
  297. var index= $(".del_no").index(this);
  298. console.log(index);
  299. $(".no_detail").eq(index).remove();
  300. })
  301. /**
  302. * 规格监听
  303. */
  304. form.on('select(spec_id)', function(data){
  305. if(data.value == 0) {
  306. $(".no_html").html(get_ht(0,'','未选择'));
  307. }else{
  308. $(".no_html").html('')
  309. var js_spec = $(data.elem).find("option:selected").attr("data-spec");
  310. var spec_arr = $.parseJSON(js_spec);
  311. $.each(spec_arr,function (sk,sv) {
  312. $(".no_html").append(get_ht(sk,sv,''));
  313. })
  314. }
  315. })
  316. // 分类选择监听
  317. form.on('select(first_classify)', function(data){
  318. var cl_html = '<option value="0">请选择</option>';
  319. if(data.value == 0) {
  320. $("select[name='second_classify']").html(cl_html);
  321. }else{
  322. var cl_key = data.elem[data.elem.selectedIndex].dataset.cl_key;
  323. var goods_spec = {:json_encode($goods_cate)};
  324. $.each(goods_spec[cl_key]['children'],function (ck,cv) {
  325. cl_html +='<option value="'+cv.id+'">'+cv.title+'</option>';
  326. })
  327. $("select[name='second_classify']").html(cl_html);
  328. }
  329. window.form.render();
  330. })
  331. //$(".no_html").html(get_ht(0,'','未选择'));
  332. function get_ht(k,v,ms) {
  333. var no = getCode();
  334. var no_html = '';
  335. no_html += ' <tr class="no_detail change_del" data-dh ="'+k+'">';
  336. no_html += "<td class='text-left nowrap'> " +
  337. "<input class='layui-input' name='goods_no[]' value='"+no+"'/>" +
  338. "</td>";
  339. no_html += "<td class='text-left nowrap'>" +
  340. "<input type='number' step='1' min='1' class='layui-input' name='store_num[]' value=''/>" +
  341. "</td>";
  342. no_html += "<td class='text-left nowrap'> " +
  343. "<input type='number' step='0.01' min='0' class='layui-input' name='price[]' value=''/>" +
  344. "</td>";
  345. no_html += "<td class='text-left nowrap'> " +
  346. "<input type='number' step='0.01' min='0' class='layui-input' name='sell_money[]' value=''/>" +
  347. "</td>";
  348. no_html += "<td class='text-left nowrap'> " +
  349. "<input readonly style='background-color: #e6e6e6' class='layui-input' name='spec_exp[]' placeholder='"+ms+"' value='"+v+"'/>" +
  350. "</td>";
  351. no_html += "<td class='text-left nowrap'>" +
  352. "<a class=\"layui-btn layui-btn-sm layui-btn-danger del_no\">删 除</a>" +
  353. /* "<a class=\"layui-btn layui-btn-sm layui-btn-sm add_goods_no\">添 加</a>"+*/
  354. "</td>"
  355. no_html += "</tr>";
  356. return no_html;
  357. }
  358. function getCode() {
  359. var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",
  360. n = "";
  361. for (i = 0; i < 5; i++) n += t.charAt(Math.floor(Math.random() * t.length));
  362. return "SY_" + n + Math.floor(Math.random() * 1000000000);
  363. };
  364. layui.use('form', function(){
  365. var form = layui.form,layer = layui.layer;
  366. //监听指定开关
  367. form.on('switch(is_seckill)', function(data){
  368. console.log(this.checked);
  369. if(this.checked){
  370. $("input[name='is_seckill']").val(1);
  371. $(".seckill_price").show();
  372. $(".seckill_box").show();
  373. }else{
  374. $("input[name='is_seckill']").val(0);
  375. $(".seckill_box").hide();
  376. $(".seckill_price").hide();
  377. }
  378. });
  379. //监听指定开关
  380. form.on('switch(freight_type)', function(data) {
  381. console.log(this.checked);
  382. if (this.checked) {
  383. $("input[name='freight_type']").val(1);
  384. $(".freight_mud").show();
  385. $(".postage").hide();
  386. $(".seckill_price").show();
  387. } else {
  388. $("input[name='freight_type']").val(0);
  389. $(".freight_mud").hide();
  390. $(".postage").show();
  391. $(".seckill_price").hide();
  392. }
  393. })
  394. })
  395. /**
  396. * 表单验证
  397. */
  398. var is_click = 0;
  399. $(document).on('click','#submit',function () {
  400. if(is_click == 1) return;
  401. is_click = 1;
  402. var name = $("input[name='name']").val();
  403. var desc = $("input[name='desc']").val();
  404. var cover = $("input[name='cover']").val();
  405. var poster = $("input[name='poster']").val();
  406. var video = $("input[name='video']").val();
  407. var first_classify = $("select[name='first_classify']").val();
  408. var spec_id = $("select[name='spec_id']").val();
  409. var error_detail = 0;
  410. $.each($(".no_detail"),function (k,v) {
  411. if( !$(".no_detail").eq(k).find("input[name='goods_no[]']").val() ){
  412. error_detail = 1;
  413. return false;
  414. }
  415. if( !$(".no_detail").eq(k).find("input[name='store_num[]']").val() ){
  416. error_detail = 2;
  417. return false;
  418. }
  419. if( !$(".no_detail").eq(k).find("input[name='price[]']").val() ){
  420. error_detail = 3;
  421. return false;
  422. }
  423. if( !$(".no_detail").eq(k).find("input[name='sell_money[]']").val() ){
  424. error_detail = 4;
  425. return false;
  426. }
  427. })
  428. if(error_detail !==0 ){
  429. layer.msg('请完善规格信息');
  430. is_click = 0;
  431. return false;
  432. }
  433. if($("input[name='freight_type']").val() == 1 && $("select[name='freight_id']").val() == 0)
  434. {
  435. layer.msg('请选择运费模板');
  436. is_click = 0;
  437. return false;
  438. }
  439. is_click = 0;
  440. $("#subForm").submit();
  441. })
  442. </script>