goods_no.html 21 KB

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