add.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. {extend name="app/shop/view/base.html"/}
  2. {block name="resources"}
  3. <style>
  4. .goods_num {padding-left: 20px;}
  5. </style>
  6. {/block}
  7. {block name="main"}
  8. <div class="layui-form">
  9. <div class="layui-card card-common">
  10. <div class="layui-card-body">
  11. <div class="layui-form-item">
  12. <label class="layui-form-label"><span class="required">*</span>盲盒名称:</label>
  13. <div class="layui-input-block">
  14. <input type="text" name="blindbox_name" lay-verify="required" autocomplete="off" class="layui-input len-long" maxlength="40">
  15. </div>
  16. </div>
  17. <div class="layui-form-item">
  18. <label class="layui-form-label"><span class="required">*</span>活动开始时间:</label>
  19. <div class="layui-input-block len-mid">
  20. <input type="text" class="layui-input" name="start_time" lay-verify="required" id="start_time" autocomplete="off" readonly>
  21. <i class="iconrili iconfont calendar"></i>
  22. </div>
  23. </div>
  24. <div class="layui-form-item">
  25. <label class="layui-form-label"><span class="required">*</span>活动结束时间:</label>
  26. <div class="layui-input-block len-mid end_time">
  27. <input type="text" class="layui-input" name="end_time" lay-verify="required|time" id="end_time" autocomplete="off" readonly>
  28. <i class="iconrili iconfont calendar"></i>
  29. </div>
  30. <div class="word-aux">
  31. <p>结束时间不能小于开始时间,也不能小于当前时间</p>
  32. </div>
  33. </div>
  34. <div class="layui-form-item">
  35. <label class="layui-form-label"><span class="required">*</span>盲盒分类:</label>
  36. <div class="layui-input-inline len-mid">
  37. <select class="category_id" name="category_id" lay-verify="required">
  38. <option value="">请选择</option>
  39. {foreach $category_data as $k=>$v}
  40. <option value="{$k}">{$v}</option>
  41. {/foreach}
  42. </select>
  43. </div>
  44. </div>
  45. <div class="layui-form-item">
  46. <label class="layui-form-label">排序:</label>
  47. <div class="layui-input-block">
  48. <input type="number" min="0" name="sort" value="0" lay-verify='sort' onchange="detectionNumType(this,'integral')" autocomplete="off" class="layui-input len-short">
  49. </div>
  50. </div>
  51. <div class="layui-form-item">
  52. <label class="layui-form-label">预警库存:</label>
  53. <div class="layui-input-block">
  54. <input type="number" min="0" name="early_inventory" value="0" lay-verify='sort' onchange="detectionNumType(this,'integral')" autocomplete="off" class="layui-input len-short">
  55. </div>
  56. <div class="word-aux">
  57. <p>商品少于预警库存数量,商品列表库存数量标红显示,0为不预警</p>
  58. </div>
  59. </div>
  60. <label class="layui-form-label">盲盒封面:</label>
  61. <div class="layui-input-block">
  62. <div class="upload-img-block square">
  63. <div class="upload-img-box">
  64. <div class="upload-default" id="blindbox_images">
  65. <div class="upload">
  66. <i class="iconfont iconshangchuan"></i>
  67. <p>点击上传</p>
  68. </div>
  69. </div>
  70. <div class="operation">
  71. <div>
  72. <i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
  73. <i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
  74. </div>
  75. <div class="replace_img js-replace">点击替换</div>
  76. </div>
  77. <input type="hidden" name="blindbox_images" />
  78. </div>
  79. </div>
  80. </div>
  81. <div class="word-aux">建议图片尺寸:690*330px</div>
  82. <div class="layui-form-item">
  83. <label class="layui-form-label"><span class="required">*</span>拆盒价格:</label>
  84. <div class="layui-input-block">
  85. <input type="text" min="0" name="price" onchange="detectionNumType(this,'positiveNumber')" lay-verify="required|price" class="layui-input len-short" autocomplete="off" placeholder="0.00">
  86. </div>
  87. <div class="word-aux">
  88. <p>拆盒价格指第一次参与该盲盒外的正常支付价格,如果未设置新人价那么拆盒价格等于新人价</p>
  89. </div>
  90. </div>
  91. <div class="layui-form-item">
  92. <label class="layui-form-label">新人拆盒价:</label>
  93. <div class="layui-input-block">
  94. <input type="text" min="0" name="new_price" onchange="detectionNumType(this,'positiveNumber')" class="layui-input len-short" autocomplete="off" placeholder="0.00">
  95. </div>
  96. <div class="word-aux">
  97. <p>没有参与该盲盒的首次价格</p>
  98. </div>
  99. </div>
  100. <div class="layui-form-item">
  101. <label class="layui-form-label"><span class="required">*</span>是否允许余额支付:</label>
  102. <div class="layui-input-block">
  103. <input type="radio" name="is_balance" value="1" title="是" checked>
  104. <input type="radio" name="is_balance" value="0" title="否">
  105. </div>
  106. </div>
  107. <div class="layui-form-item">
  108. <label class="layui-form-label"><span class="required">*</span>空盒是否显示:</label>
  109. <div class="layui-input-block">
  110. <input type="radio" name="is_emptybox" value="1" title="是" checked>
  111. <input type="radio" name="is_emptybox" value="2" title="否">
  112. </div>
  113. </div>
  114. <div class="layui-form-item">
  115. <label class="layui-form-label"><span class="required">*</span>商品:</label>
  116. <div class="layui-input-block">
  117. <table class="layui-table" id="goods" lay-skin="line" lay-size="lg">
  118. <colgroup>
  119. <col width="45%">
  120. <col width="15%">
  121. <col width="15%">
  122. <col width="10%">
  123. <col width="15%">
  124. </colgroup>
  125. <thead>
  126. <tr>
  127. <th>商品名称</th>
  128. <th>价格</th>
  129. <th>库存</th>
  130. <th>数量</th>
  131. <th class="operation">操作</th>
  132. </tr>
  133. </thead>
  134. <tbody>
  135. <tr>
  136. <td colspan="5">
  137. <div class="goods-empty">未添加商品</div>
  138. </td>
  139. </tr>
  140. </tbody>
  141. </table>
  142. <button class="layui-btn" onclick="addGoods()">添加商品</button> <span class="goods_num">已选商品(<span id="goods_num" class="text-color">0</span>)</span>
  143. </div>
  144. </div>
  145. <div class="layui-form-item layui-form-text">
  146. <label class="layui-form-label">活动规则说明:</label>
  147. <div class="layui-input-inline">
  148. <textarea name="remark" class="layui-textarea len-long" maxlength="150"></textarea>
  149. </div>
  150. </div>
  151. <div class="word-aux">
  152. <p>说明:盲盒不和其他优惠活动一起参与,比如:满减、积分抵扣、会员价、优惠券</p>
  153. </div>
  154. <div class="form-row">
  155. <button class="layui-btn" lay-submit lay-filter="save">保存</button>
  156. <button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
  157. <a id="blindboxImagesId"></a>
  158. </div>
  159. </div>
  160. </div>
  161. </div>
  162. {/block}
  163. {block name="script"}
  164. <script>
  165. var form, laytpl, tableData = [],
  166. repeat_flag = false,
  167. awardId = 0,
  168. selectGoodsSkuId = [],
  169. num_list = [],
  170. goods = [],
  171. currentDate = new Date(),
  172. minDate = "",
  173. upload;
  174. var saveData = null;
  175. var totalUploadNum = 0;
  176. var completeUploadNum = 0;
  177. layui.use(['form', 'laytpl','laydate'], function () {
  178. var laydate = layui.laydate;
  179. form = layui.form;
  180. laytpl = layui.laytpl;
  181. currentDate.setDate(currentDate.getDate() + 30);
  182. form.render();
  183. laydate.render({
  184. elem: '#start_time'
  185. , type: 'datetime'
  186. , change: function (value, date, endDate) {
  187. $(".date-picker-btn").removeClass("selected");
  188. }
  189. });
  190. // 开始时间
  191. laydate.render({
  192. elem: '#start_time',//指定元素
  193. type: 'datetime',
  194. value: new Date(),
  195. done: function (value) {
  196. minDate = value;
  197. reRender();
  198. }
  199. });
  200. //结束时间
  201. laydate.render({
  202. elem: '#end_time',//指定元素
  203. type: 'datetime',
  204. value: new Date(currentDate)
  205. });
  206. /**
  207. * 重新渲染结束时间
  208. * */
  209. function reRender() {
  210. $("#end_time").remove();
  211. $(".end_time").html('<input type="text" id="end_time" name="end_time" placeholder="请输入结束时间" lay-verify="required|time" class="layui-input len-mid" autocomplete="off">');
  212. laydate.render({
  213. elem: '#end_time',
  214. type: 'datetime',
  215. min: minDate
  216. });
  217. }
  218. //表单验证
  219. form.verify({
  220. number: function (value) {
  221. if (value <= 0) {
  222. return "数量不能小于或等于0"
  223. }
  224. },
  225. sort: function (value) {
  226. if (value < 0) {
  227. return "排序不能小于0"
  228. }
  229. },
  230. price: function (value) {
  231. if (value == 0) {
  232. return "价格不能为0"
  233. }
  234. },
  235. time: function (value) {
  236. var now_time = (new Date()).getTime();
  237. var start_time = (new Date($("#start_time").val())).getTime();
  238. var end_time = (new Date(value)).getTime();
  239. if (now_time > end_time) {
  240. return '结束时间不能小于当前时间!'
  241. }
  242. if (start_time > end_time) {
  243. return '结束时间不能小于开始时间!';
  244. }
  245. },
  246. time_day: function (value) {
  247. var time_type = $('[name="time_type"]:checked').val();
  248. if (time_type == 3) {
  249. if (value <= 0) {
  250. return '有效期天数至少为一天!'
  251. }
  252. }
  253. }
  254. });
  255. upload = new Upload({
  256. elem: '#blindbox_images',
  257. auto: false,
  258. bindAction: '#blindboxImagesId',
  259. callback: function (res) {
  260. uploadComplete('blindbox_images', res.data.pic_path);
  261. }
  262. });
  263. function uploadComplete(field, pic_path) {
  264. saveData.field[field] = pic_path;
  265. completeUploadNum += 1;
  266. if (completeUploadNum == totalUploadNum) {
  267. saveFunc();
  268. }
  269. }
  270. function saveFunc() {
  271. var data = saveData;
  272. $.ajax({
  273. type: 'POST',
  274. dataType: 'JSON',
  275. url: ns.url("blindbox://shop/blindbox/add"),
  276. data: data.field,
  277. async: false,
  278. success: function (res) {
  279. repeat_flag = false;
  280. if (res.code >= 0) {
  281. layer.confirm('添加成功', {
  282. title: '操作提示',
  283. btn: ['返回列表', '继续添加'],
  284. closeBtn: 0,
  285. yes: function () {
  286. location.href = ns.url("blindbox://shop/blindbox/lists");
  287. },
  288. btn2: function () {
  289. location.href = ns.url("blindbox://shop/blindbox/add");
  290. }
  291. });
  292. } else {
  293. layer.msg(res.message);
  294. }
  295. }
  296. })
  297. }
  298. /**
  299. * 表单提交
  300. */
  301. form.on('submit(save)', function (data) {
  302. // 删除图片
  303. if (!data.field.blindbox_images) upload.delete();
  304. if (repeat_flag) return;
  305. repeat_flag = true;
  306. $("input[name='goods_num']").each(function () {
  307. num_list.push($(this).val());
  308. });
  309. for (var i = 0; i < selectGoodsSkuId.length; i++) {
  310. var obj = {};
  311. obj.sku_id = selectGoodsSkuId[i];
  312. obj.num = num_list[i];
  313. goods.push(obj)
  314. }
  315. if (goods.length <= 0) {
  316. layer.msg('请选择盲盒内商品');
  317. repeat_flag = false;
  318. return false;
  319. }
  320. data.field.goods = goods;
  321. saveData = data;
  322. var obj = $("img.img_prev[data-prev='1']");
  323. totalUploadNum = obj.length;
  324. if (totalUploadNum > 0) {
  325. obj.each(function () {
  326. var actionId = $(this).attr('data-action-id');
  327. $(actionId).click();
  328. })
  329. } else {
  330. saveFunc();
  331. }
  332. });
  333. });
  334. //删除奖品
  335. function delAward(data) {
  336. for (var i = 0; i < tableData.length; i++) {
  337. if (tableData[i].ident == data) {
  338. tableData.splice(i, 1);
  339. renderTable(tableData);
  340. }
  341. }
  342. }
  343. function back() {
  344. location.href = ns.url("blindbox://shop/blindbox/lists");
  345. }
  346. //检测数据类型
  347. function detectionNumType(el, type) {
  348. var value = $(el).val();
  349. //大于零 且 不是小数
  350. if (value < 0 && type == 'integral')
  351. $(el).val(0);
  352. else if (type == 'integral')
  353. $(el).val(Math.round(value));
  354. //大于1 且 不是小数
  355. if (value < 1 && type == 'positiveInteger')
  356. $(el).val(1);
  357. else if (type == 'positiveInteger')
  358. $(el).val(Math.round(value));
  359. //大于零可以是小数
  360. if (type == 'positiveNumber') {
  361. value = parseFloat(value).toFixed(2);
  362. if (value < 0) $(el).val(0);
  363. else $(el).val(value);
  364. }
  365. }
  366. /**
  367. * 添加商品
  368. */
  369. function addGoods() {
  370. goodsSelect(function (res) {
  371. if (!res.length) return false;
  372. var price = 0.00;
  373. selectGoodsSkuId = [];
  374. $("#goods tbody").html("");
  375. var html = $("#goods tbody .goods-empty").length ? '' : $("#goods tbody").html();
  376. for (var i = 0; i < res.length; i++) {
  377. for (var k = 0; k < res[i].selected_sku_list.length; k++) {
  378. var item = res[i].selected_sku_list[k];
  379. html += `<tr data-sku_id="${item.sku_id}">`;
  380. html += `
  381. <td>
  382. <div class="goods-title">
  383. <div class="goods-img">
  384. <img layer-src src="${item.sku_image ? ns.img(item.sku_image) : ''}" alt="">
  385. </div>
  386. <p class="multi-line-hiding goods-name">${item.sku_name}</p>
  387. </div>
  388. </td>
  389. `;
  390. html += `<td class='price-one'>${item.price }</td>`;
  391. html += `<td>${item.stock}</td>`;
  392. html += `<td><input type="number" name="goods_num" min="1" onchange="detectionNumType(this,'integral')" lay-verify="required|number" class="layui-input" value='1'></td>`;
  393. html += `<td class='operation'> <div class='table-btn'><a href='javascript:;' class='layui-btn' onclick='deleteGoods(this)'>删除商品</a></div></td>`;
  394. html += `</tr>`;
  395. price += Number(item.price);
  396. selectGoodsSkuId.push(item.sku_id);
  397. }
  398. }
  399. $("#goods_num").html(selectGoodsSkuId.length);
  400. $("#goods tbody").html(html);
  401. }, selectGoodsSkuId, {mode: "sku"});
  402. }
  403. /**
  404. * 删除商品
  405. */
  406. function deleteGoods(data) {
  407. var obj = $(data).parent().parent().parent();
  408. $(obj).remove();
  409. for (var i in selectGoodsSkuId) {
  410. if (selectGoodsSkuId[i] == Number($(obj).attr("data-sku_id"))) {
  411. selectGoodsSkuId.splice(i, 1);
  412. num_list.splice(i, 1);
  413. }
  414. }
  415. $("#goods_num").html(selectGoodsSkuId.length);
  416. }
  417. </script>
  418. {/block}