verify_list.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. {extend name="base"/}
  2. {block name="resources"}
  3. <style>
  4. .contraction{display: inline-block;margin-right: 5px;}
  5. .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;}
  6. .sku-list{overflow: hidden;padding: 0 45px;}
  7. .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;}
  8. .sku-list li .img-wrap{vertical-align: middle;margin-right: 8px;width: 120px;height: 120px;text-align: center;line-height: 120px;}
  9. .sku-list li .img-wrap img{max-width: 100%;max-height: 100%;}
  10. .sku-list li .info-wrap span{margin-bottom: 5px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;white-space: normal;word-break: break-all;-webkit-box-orient: vertical;-webkit-line-clamp: 1;}
  11. .sku-list li .info-wrap span.sku-name{-webkit-line-clamp: 2;margin-bottom: 5px;font-weight: bold;}
  12. .sku-list li .info-wrap span:last-child{margin-bottom: 0;}
  13. </style>
  14. {/block}
  15. {block name="main"}
  16. <div class="layui-collapse ns-tips">
  17. <div class="layui-colla-item">
  18. <h2 class="layui-colla-title">操作提示</h2>
  19. <ul class="layui-colla-content layui-show">
  20. <li>当前显示的是待审核的商品,当商品处于上架状态时前台显示。</li>
  21. <li>当前商品待审核,说明系统开启了商品审核,只有审核通过的商品才能操作上下架进行销售。</li>
  22. </ul>
  23. </div>
  24. </div>
  25. <div class="ns-screen layui-collapse">
  26. <div class="layui-colla-item">
  27. <h2 class="layui-colla-title">筛选</h2>
  28. <form class="layui-colla-content layui-form layui-show">
  29. <div class="layui-form-item">
  30. <div class="layui-inline">
  31. <label class="layui-form-label">搜索方式:</label>
  32. <div class="layui-input-inline">
  33. <select name="search_text_type">
  34. <option value="goods_name">商品名称</option>
  35. <option value="site_name">店铺名称</option>
  36. <!--<option value="brand_name">品牌名称</option>-->
  37. </select>
  38. </div>
  39. <div class="layui-input-inline">
  40. <input type="text" name="search_text" autocomplete="off" class="layui-input" placeholder="输入商品名称/店铺名称" />
  41. </div>
  42. </div>
  43. </div>
  44. <div class="layui-form-item">
  45. <div class="layui-inline">
  46. <label class="layui-form-label">商品分类:</label>
  47. <div class="layui-input-inline">
  48. {include file="goods/category_select" /}
  49. </div>
  50. </div>
  51. <div class="layui-inline">
  52. <label class="layui-form-label">商品品牌:</label>
  53. <div class="layui-input-inline">
  54. <select name="goods_brand" lay-search="">
  55. </select>
  56. </div>
  57. </div>
  58. <div class="layui-inline">
  59. <label class="layui-form-label">商品类型:</label>
  60. <div class="layui-input-inline">
  61. <select name="goods_attr_class" lay-search="">
  62. </select>
  63. </div>
  64. </div>
  65. </div>
  66. <div class="ns-form-row">
  67. <button class="layui-btn ns-bg-color" lay-submit lay-filter="btn_search">筛选</button>
  68. <button type="reset" class="layui-btn layui-btn-primary">重置</button>
  69. </div>
  70. </form>
  71. </div>
  72. </div>
  73. <!-- 列表 -->
  74. <table id="goods_list" lay-filter="goods_list"></table>
  75. <!-- 商品信息 -->
  76. <script type="text/html" id="goods_info">
  77. <div class="ns-table-tuwen-box">
  78. <div class="contraction" data-goods-id="{{d.goods_id}}" data-open="0">
  79. <span>+</span>
  80. </div>
  81. <div class="ns-img-box">
  82. <img layer-src src="{{ns.img(d.goods_image.split(',')[0])}}"/>
  83. </div>
  84. <div class="ns-font-box">
  85. <a href="javascript:;" class="ns-multi-line-hiding ns-text-color">{{d.goods_name}}</a>
  86. </div>
  87. </div>
  88. </script>
  89. <!-- 操作 -->
  90. <script type="text/html" id="operation">
  91. <div class="ns-table-btn">
  92. <a class="layui-btn" lay-event="verify_on">通过</a>
  93. <a class="layui-btn" lay-event="verify_off">拒绝</a>
  94. </div>
  95. </script>
  96. <!-- 批量操作 -->
  97. <script type="text/html" id="batchOperation">
  98. <button class="layui-btn layui-btn-primary" lay-event="verify_on">通过</button>
  99. <button class="layui-btn layui-btn-primary" lay-event="verify_off">拒绝</button>
  100. </script>
  101. <!-- SKU商品列表 -->
  102. <script type="text/html" id="skuList">
  103. <tr class="js-sku-list-{{d.index}}">
  104. <td></td>
  105. <td colspan="9">
  106. <ul class="sku-list">
  107. {{# for(var i=0;i<d.list.length;i++){ }}
  108. <li>
  109. <div class="img-wrap">
  110. <img src="{{ns.img(d.list[i].sku_image)}}">
  111. </div>
  112. <div class="info-wrap">
  113. <span class="sku-name">{{d.list[i].sku_name}}</span>
  114. <span class="price">价格:¥{{d.list[i].price}}</span>
  115. <span class="stock">库存:{{d.list[i].stock}}</span>
  116. <span class="sale_num">销量:{{d.list[i].sale_num}}</span>
  117. </div>
  118. </li>
  119. {{# } }}
  120. </ul>
  121. </td>
  122. </tr>
  123. </script>
  124. {/block}
  125. {block name="script"}
  126. <script>
  127. var laytpl, form;
  128. $(function() {
  129. $("body").on("click", ".contraction", function() {
  130. var goods_id = $(this).attr("data-goods-id");
  131. var open = $(this).attr("data-open");
  132. var tr = $(this).parent().parent().parent().parent();
  133. var index = tr.attr("data-index");
  134. if (open == 1) {
  135. $(this).children("span").text("+");
  136. $(".js-sku-list-" + index).remove();
  137. } else {
  138. $(this).children("span").text("-");
  139. $.ajax({
  140. url: ns.url("admin/goods/getGoodsSkuList"),
  141. data: {
  142. goods_id: goods_id
  143. },
  144. dataType: 'JSON',
  145. type: 'POST',
  146. async: false,
  147. success: function(res) {
  148. var list = res.data;
  149. var sku_list = $("#skuList").html();
  150. var data = {
  151. list: list,
  152. index: index
  153. };
  154. laytpl(sku_list).render(data, function(html) {
  155. tr.after(html);
  156. });
  157. }
  158. });
  159. }
  160. $(this).attr("data-open", (open == 0 ? 1 : 0));
  161. });
  162. //商品品牌
  163. goodsBrand();
  164. //商品类型
  165. goodsSattr();
  166. });
  167. layui.use(['form', 'laytpl'], function() {
  168. form = layui.form;
  169. repeat_flag = false; //防重复标识
  170. laytpl = layui.laytpl;
  171. form.render();
  172. var table = new Table({
  173. elem: '#goods_list',
  174. url: ns.url("admin/goods/verifyList"),
  175. cols: [
  176. [{
  177. type: 'checkbox',
  178. unresize: 'false',
  179. width: '3%'
  180. },
  181. {
  182. title: '商品信息',
  183. unresize: 'false',
  184. width: '20%',
  185. templet: '#goods_info'
  186. },
  187. {
  188. field: 'site_name',
  189. title: '店铺名称',
  190. unresize: 'false',
  191. width: '10%',
  192. },
  193. {
  194. field: 'price',
  195. title: '价格(元)',
  196. unresize: 'false',
  197. width: '10%'
  198. },
  199. {
  200. field: 'goods_stock',
  201. title: '库存',
  202. unresize: 'false',
  203. width: '9%'
  204. },
  205. {
  206. field: 'sale_num',
  207. title: '销量',
  208. unresize: 'false',
  209. width: '6%'
  210. },
  211. {
  212. title: '商品状态',
  213. unresize: 'false',
  214. width: '8%',
  215. templet: function(data) {
  216. var str = '';
  217. if (data.goods_state == 1) {
  218. str = '上架';
  219. } else if (data.goods_state == 0) {
  220. str = '下架';
  221. }
  222. return str;
  223. }
  224. },
  225. {
  226. title: '审核状态',
  227. unresize: 'false',
  228. width: '8%',
  229. templet: function(data) {
  230. var str = '';
  231. if (data.verify_state == 1) {
  232. str = '已审核';
  233. } else if (data.verify_state == 0) {
  234. str = '待审核';
  235. } else if (data.verify_state == 10) {
  236. str = '<a href="javascript:getVerifyStateRemark(' + data.goods_id + ');" class="ns-text-color">违规下架</a>';
  237. } else if (data.verify_state == -1) {
  238. str = '审核中';
  239. } else if (data.verify_state == -2) {
  240. str = '审核失败';
  241. }
  242. return str;
  243. }
  244. },
  245. {
  246. title: '创建时间',
  247. unresize: 'false',
  248. width: '14%',
  249. templet: function(data) {
  250. return ns.time_to_date(data.create_time);
  251. }
  252. },
  253. {
  254. title: '操作',
  255. toolbar: '#operation',
  256. unresize: 'false',
  257. width: '12%'
  258. }
  259. ]
  260. ],
  261. bottomToolbar: "#batchOperation"
  262. });
  263. /**
  264. * 监听工具栏操作
  265. */
  266. table.tool(function(obj) {
  267. var data = obj.data;
  268. switch (obj.event) {
  269. case 'verify_on':
  270. //审核通过
  271. verifyOn(data.goods_id, 1);
  272. break;
  273. case 'verify_off':
  274. //审核失败
  275. verifyOn(data.goods_id, -2);
  276. break;
  277. }
  278. });
  279. //审核通过商品
  280. function verifyOn(goods_ids, verify_state) {
  281. if (repeat_flag) return;
  282. repeat_flag = true;
  283. $.ajax({
  284. url: ns.url("admin/goods/verifyOn"),
  285. data: {
  286. goods_ids: goods_ids.toString(),
  287. verify_state: verify_state
  288. },
  289. dataType: 'JSON',
  290. type: 'POST',
  291. success: function(res) {
  292. layer.msg(res.message);
  293. repeat_flag = false;
  294. if (res.code == 0) {
  295. table.reload();
  296. }
  297. }
  298. });
  299. }
  300. /**
  301. * 批量操作
  302. */
  303. table.bottomToolbar(function(obj) {
  304. if (obj.data.length < 1) {
  305. layer.msg('请选择要操作的数据');
  306. return;
  307. }
  308. var id_array = new Array();
  309. for (i in obj.data) id_array.push(obj.data[i].goods_id);
  310. switch (obj.event) {
  311. case 'verify_on':
  312. //审核通过
  313. verifyOn(id_array.toString(), 1);
  314. break;
  315. case 'verify_off':
  316. //审核失败
  317. verifyOn(id_array.toString(), -2);
  318. break;
  319. }
  320. });
  321. /**
  322. * 搜索功能
  323. */
  324. form.on('submit(btn_search)', function(data) {
  325. table.reload({
  326. page: {
  327. curr: 1
  328. },
  329. where: data.field
  330. });
  331. return false;
  332. });
  333. });
  334. /**
  335. * 获取违规下架原因
  336. * @param goods_id
  337. */
  338. function getVerifyStateRemark(goods_id) {
  339. $.ajax({
  340. url: ns.url("admin/goods/getVerifyStateRemark"),
  341. data: {
  342. goods_id: goods_id
  343. },
  344. dataType: 'JSON',
  345. type: 'POST',
  346. success: function(res) {
  347. var data = res.data;
  348. if (data) {
  349. layer.open({
  350. title: '违规下架原因',
  351. content: data.verify_state_remark
  352. });
  353. }
  354. }
  355. });
  356. }
  357. //商品品牌
  358. function goodsBrand() {
  359. var brandHtml = "";
  360. $.ajax({
  361. url: ns.url("admin/goodsbrand/lists"),
  362. type: 'POST',
  363. dataType: 'JSON',
  364. success: function (res) {
  365. brandHtml += '<option value="">直接选择或搜索选择</option>';
  366. $.each(res.data.list, function (key, val) {
  367. brandHtml += `<option value="${val.brand_id}">${val.brand_name}</option>`;
  368. });
  369. $("select[name='goods_brand']").html(brandHtml);
  370. form.render('select');
  371. }
  372. });
  373. }
  374. //商品类型
  375. function goodsSattr() {
  376. var sattrHtml = "";
  377. $.ajax({
  378. url: ns.url("admin/goodsattr/lists"),
  379. type: 'POST',
  380. dataType: 'JSON',
  381. success: function (res) {
  382. sattrHtml += '<option value="">直接选择或搜索选择</option>';
  383. $.each(res.data.list, function (key, val) {
  384. sattrHtml += `<option value="${val.class_id}">${val.class_name}</option>`;
  385. });
  386. $("select[name='goods_attr_class']").html(sattrHtml);
  387. form.render('select');
  388. }
  389. });
  390. }
  391. </script>
  392. {/block}