recycle.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. {extend name="base"/}
  2. {block name="resources"}
  3. <link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
  4. <style>
  5. .contraction{display: inline-block;margin-right: 5px;}
  6. .contraction span{cursor: pointer;display: inline-block;width: 17px;height: 17px;text-align: center;line-height: 14px;/* border: 1px solid #e9e9e9; */user-select: none;/* background: #fff; */}
  7. .sku-list{overflow: hidden;padding: 0 45px;}
  8. .sku-list li{float: left;display: flex;padding: 10px;margin-right: 10px;margin-bottom: 10px;border: 1px solid #EFEFEF;width: 294px;height: 140px;align-items: center;}
  9. .sku-list li .img-wrap{vertical-align: middle;margin-right: 8px;width: 120px;height: 120px;text-align: center;line-height: 120px;}
  10. .sku-list li .img-wrap img{max-width: 100%;max-height: 100%;}
  11. /* .sku-list li .info-wrap span:first-of-type{font-weight: bold;} */
  12. .sku-list li .info-wrap span{display: -webkit-box;margin-bottom: 5px;overflow: hidden;text-overflow: ellipsis;white-space: normal;word-break: break-all;-webkit-box-orient: vertical;-webkit-line-clamp: 1;}
  13. .sku-list li .info-wrap span.sku-name{-webkit-line-clamp: 2;margin-bottom: 5px;}
  14. .sku-list li .info-wrap span:last-child{margin-bottom: 0;}
  15. .screen{margin-top: 15px;}
  16. .category-wrap {width:185px!important;display: inline-block}
  17. .el-input__inner {height:34px;line-height:34px;border-radius:2px;}
  18. </style>
  19. {/block}
  20. {block name="main"}
  21. <!-- 筛选面板 -->
  22. <div class="screen layui-collapse" lay-filter="selection_panel">
  23. <div class="layui-colla-item">
  24. <form class="layui-colla-content layui-form layui-show">
  25. <div class="layui-form-item">
  26. <div class="layui-inline">
  27. <label class="layui-form-label">商品名称</label>
  28. <div class="layui-input-inline">
  29. <input type="text" name="search_text" placeholder="请输入商品名称" autocomplete="off" class="layui-input">
  30. </div>
  31. </div>
  32. <div class="layui-inline">
  33. <label class="layui-form-label">商品分类</label>
  34. <div class="layui-input-inline category-wrap">
  35. <input type="text" autocomplete="off" show="false" class="layui-input select-category" placeholder="请选择" readonly="">
  36. <input type="hidden" name="category_id">
  37. </div>
  38. </div>
  39. <div class="layui-inline">
  40. <label class="layui-form-label">商品类型</label>
  41. <div class="layui-input-inline">
  42. <select name="goods_class" lay-filter="goods_class">
  43. <option value="">全部</option>
  44. <option value="1">实物商品</option>
  45. <option value="2">虚拟商品</option>
  46. {if $virtualcard_exit}<option value="3">电子卡密</option>{/if}
  47. </select>
  48. </div>
  49. </div>
  50. </div>
  51. <div class="form-row">
  52. <button class="layui-btn" lay-submit lay-filter="search">筛选</button>
  53. <button type="reset" class="layui-btn layui-btn-primary">重置</button>
  54. </div>
  55. </form>
  56. </div>
  57. </div>
  58. <!-- 列表 -->
  59. <table id="goods_list" lay-filter="goods_list"></table>
  60. <!-- 商品信息 -->
  61. <script type="text/html" id="goods_info">
  62. <div class="table-title">
  63. <div class="contraction" data-goods-id="{{d.goods_id}}" data-open="0">
  64. <span>+</span>
  65. </div>
  66. <div class="title-pic">
  67. <img layer-src="{{ns.img(d.goods_image.split(',')[0], 'big')}}" src="{{ns.img(d.goods_image.split(',')[0], 'small')}}"/>
  68. </div>
  69. <div class="title-content">
  70. <a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{d.goods_name}}">{{d.goods_name}}</a>
  71. </div>
  72. </div>
  73. </script>
  74. <!-- 操作 -->
  75. <script type="text/html" id="operation">
  76. <div class="table-btn">
  77. <a class="layui-btn" lay-event="delete">删除</a>
  78. <a class="layui-btn" lay-event="recovery">恢复</a>
  79. </div>
  80. </script>
  81. <!-- 批量操作 -->
  82. <script type="text/html" id="toolbarOperation">
  83. <button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
  84. <button class="layui-btn layui-btn-primary" lay-event="recovery">恢复</button>
  85. </script>
  86. <!-- 批量操作 -->
  87. <script type="text/html" id="batchOperation">
  88. <button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
  89. <button class="layui-btn layui-btn-primary" lay-event="recovery">恢复</button>
  90. </script>
  91. <!-- SKU商品列表 -->
  92. <script type="text/html" id="skuList">
  93. <tr class="js-sku-list-{{d.index}}">
  94. <td></td>
  95. <td colspan="8">
  96. <ul class="sku-list">
  97. {{# for(var i=0;i<d.list.length;i++){ }}
  98. <li>
  99. <div class="img-wrap">
  100. <img src="{{ns.img(d.list[i].sku_image, 'small')}}">
  101. </div>
  102. <div class="info-wrap">
  103. <span class="sku-name">{{d.list[i].sku_name}}</span>
  104. <span class="price">价格:¥{{d.list[i].price}}</span>
  105. <span class="stock">库存:{{d.list[i].stock}}</span>
  106. <span class="sale_num">销量:{{d.list[i].sale_num}}</span>
  107. </div>
  108. </li>
  109. {{# } }}
  110. </ul>
  111. </td>
  112. </tr>
  113. </script>
  114. {/block}
  115. {block name="script"}
  116. <script>
  117. layui.extend({
  118. layCascader: '__STATIC__/ext/layui/extend/cascader/cascader'
  119. })
  120. var laytpl, layCascader;
  121. $(function () {
  122. $("body").on("click", ".contraction",function () {
  123. var goods_id = $(this).attr("data-goods-id");
  124. var open = $(this).attr("data-open");
  125. var tr = $(this).parent().parent().parent().parent();
  126. var index = tr.attr("data-index");
  127. if(open == 1){
  128. $(this).children("span").text("+");
  129. $(".js-sku-list-"+index).remove();
  130. }else{
  131. $(this).children("span").text("-");
  132. $.ajax({
  133. url: ns.url("shop/goods/getGoodsSkuList"),
  134. data: {goods_id:goods_id},
  135. dataType: 'JSON',
  136. type: 'POST',
  137. async: false,
  138. success: function (res) {
  139. var list = res.data;
  140. var sku_list = $("#skuList").html();
  141. var data ={
  142. list : list,
  143. index : index
  144. };
  145. laytpl(sku_list).render(data, function(html) {
  146. tr.after(html);
  147. });
  148. }
  149. });
  150. }
  151. $(this).attr("data-open",(open == 0 ? 1 : 0));
  152. })
  153. });
  154. layui.use(['form','laytpl', 'layCascader'], function () {
  155. var form = layui.form,
  156. repeat_flag = false; //防重复标识
  157. laytpl = layui.laytpl;
  158. layCascader = layui.layCascader;
  159. form.render();
  160. var table = new Table({
  161. elem: '#goods_list',
  162. url: ns.url("shop/goods/recycle"),
  163. cols: [
  164. [
  165. {
  166. type: 'checkbox',
  167. unresize: 'false',
  168. width: '3%'
  169. },
  170. {
  171. title: '商品信息',
  172. unresize: 'false',
  173. width: '39%',
  174. templet: '#goods_info'
  175. },
  176. {
  177. field: 'price',
  178. title: '价格',
  179. unresize: 'false',
  180. width: '6%',
  181. align: 'right',
  182. templet: function(data) {
  183. return '¥'+ data.price;
  184. }
  185. },
  186. {
  187. unresize: 'false',
  188. width: '2%'
  189. },
  190. {
  191. field: 'goods_stock',
  192. title: '库存',
  193. unresize: 'false',
  194. width: '8%'
  195. },
  196. {
  197. field: 'sale_num',
  198. title: '销量',
  199. unresize: 'false',
  200. width: '7%'
  201. },
  202. {
  203. title: '商品状态',
  204. unresize: 'false',
  205. width: '8%',
  206. templet: function (data) {
  207. var str = '';
  208. if (data.goods_state == 1) {
  209. str = '正常';
  210. } else if (data.goods_state == 0) {
  211. str = '下架';
  212. }
  213. return str;
  214. }
  215. },
  216. {
  217. title: '创建时间',
  218. unresize: 'false',
  219. width: '15%',
  220. templet: function (data) {
  221. return ns.time_to_date(data.create_time);
  222. }
  223. },
  224. {
  225. title: '操作',
  226. toolbar: '#operation',
  227. unresize: 'false',
  228. align : 'right'
  229. }
  230. ]
  231. ],
  232. toolbar: '#toolbarOperation',
  233. bottomToolbar: "#batchOperation"
  234. });
  235. /**
  236. * 监听工具栏操作
  237. */
  238. table.tool(function (obj) {
  239. var data = obj.data;
  240. switch (obj.event) {
  241. case 'delete':
  242. //删除
  243. deleteRecycleGoods(data.goods_id);
  244. break;
  245. case 'recovery':
  246. //恢复
  247. recoveryRecycle(data.goods_id);
  248. break;
  249. }
  250. });
  251. /**
  252. * 删除
  253. */
  254. function deleteRecycleGoods(goods_ids) {
  255. layer.confirm('确定要删除该商品吗?', function () {
  256. if (repeat_flag) return;
  257. repeat_flag = true;
  258. $.ajax({
  259. url: ns.url("shop/goods/deleteRecycleGoods"),
  260. data: {goods_ids : goods_ids.toString()},
  261. dataType: 'JSON',
  262. type: 'POST',
  263. success: function (res) {
  264. layer.msg(res.message);
  265. repeat_flag = false;
  266. if (res.code == 0) {
  267. table.reload();
  268. }
  269. }
  270. });
  271. });
  272. }
  273. //商品恢复
  274. function recoveryRecycle(goods_ids) {
  275. if (repeat_flag) return;
  276. repeat_flag = true;
  277. $.ajax({
  278. url: ns.url("shop/goods/recoveryRecycle"),
  279. data: {goods_ids: goods_ids.toString()},
  280. dataType: 'JSON',
  281. type: 'POST',
  282. success: function (res) {
  283. layer.msg(res.message);
  284. repeat_flag = false;
  285. if (res.code == 0) {
  286. table.reload();
  287. }
  288. }
  289. });
  290. }
  291. /**
  292. * 批量操作
  293. */
  294. table.bottomToolbar(function (obj) {
  295. if (obj.data.length < 1) {
  296. layer.msg('请选择要操作的数据');
  297. return;
  298. }
  299. var id_array = new Array();
  300. for (i in obj.data) id_array.push(obj.data[i].goods_id);
  301. switch (obj.event) {
  302. case "delete":
  303. deleteRecycleGoods(id_array.toString());
  304. break;
  305. case 'recovery':
  306. //恢复
  307. recoveryRecycle(id_array.toString());
  308. break;
  309. }
  310. });
  311. /**
  312. * 批量操作
  313. */
  314. table.toolbar(function (obj) {
  315. if (obj.data.length < 1) {
  316. layer.msg('请选择要操作的数据');
  317. return;
  318. }
  319. var id_array = new Array();
  320. for (i in obj.data) id_array.push(obj.data[i].goods_id);
  321. switch (obj.event) {
  322. case "delete":
  323. deleteRecycleGoods(id_array.toString());
  324. break;
  325. case 'recovery':
  326. //恢复
  327. recoveryRecycle(id_array.toString());
  328. break;
  329. }
  330. });
  331. // 搜索功能
  332. form.on('submit(search)', function (data) {
  333. table.reload({
  334. page: {
  335. curr: 1
  336. },
  337. where: data.field
  338. });
  339. return false;
  340. });
  341. $.ajax({
  342. url : ns.url("shop/goodscategory/lists"),
  343. dataType: 'JSON',
  344. type: 'POST',
  345. success: function(res) {
  346. var _cascader = layCascader({
  347. elem: '.select-category',
  348. options: res.data,
  349. props: {
  350. value: 'category_id',
  351. label: 'category_name',
  352. children: 'child_list'
  353. }
  354. });
  355. _cascader.changeEvent(function (value, node) {
  356. $('[name="category_id"]').val(value)
  357. });
  358. }
  359. })
  360. });
  361. </script>
  362. {/block}