product.html 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. <style type="text/css">
  2. .xm-label-block {
  3. background-color: #287bd2
  4. }
  5. body .tox-tinymce-aux {
  6. z-index: 19892000 !important;
  7. }
  8. .sku-box {
  9. border: 1px solid #e4e4e4;
  10. border-radius: 8px;
  11. padding: 13px;
  12. }
  13. </style>
  14. <!-- 正文开始 -->
  15. <div class="layui-fluid">
  16. <div class="layui-card">
  17. <div class="layui-card-body">
  18. <div class="layui-form toolbar" id="tbToolBar">
  19. <div class="layui-form-item">
  20. <div class="layui-inline">
  21. <label class="layui-form-label w-auto">商品名称:</label>
  22. <div class="layui-input-inline mr0">
  23. <input name="name" class="layui-input" type="text" placeholder="商品名称"/>
  24. </div>
  25. </div>
  26. <div class="layui-inline">
  27. <label class="layui-form-label w-auto">商 家:</label>
  28. <div class="layui-input-inline mr0">
  29. <select id="sellerSearch" name="seller_id" lay-filter="xmFilter">
  30. <option value=""></option>
  31. </select>
  32. </div>
  33. </div>
  34. <div class="layui-inline">
  35. <label class="layui-form-label w-auto">分 类:</label>
  36. <div class="layui-input-inline mr0">
  37. <select id="categorySearch" name="category_id" lay-filter="xmFilter">
  38. <option value=""></option>
  39. </select>
  40. </div>
  41. </div>
  42. <div class="layui-inline" style="padding-right: 110px;">
  43. <button class="layui-btn icon-btn" lay-filter="formSubSearchUser" lay-submit>
  44. <i class="layui-icon">&#xe615;</i>查询
  45. </button>
  46. <button class="layui-btn icon-btn goods-category">
  47. <i class="layui-icon">&#xe66b;</i>商品分类
  48. </button>
  49. </div>
  50. </div>
  51. </div>
  52. <div class="layui-tab layui-tab-brief">
  53. <table id="dataTable" lay-filter="dataTable"></table>
  54. </div>
  55. </div>
  56. </div>
  57. </div>
  58. <script type="text/html" id="toolBarTpl">
  59. <div class="layui-btn-group fl">
  60. <a class="layui-btn layui-btn-sm layui-icon layui-icon-add-circle-fine product-add-btn">&nbsp;添加</a>
  61. <a table-data="{'url':'store/product/plectron','action':'put',param:{'status': 1}}"
  62. class="layui-btn layui-btn-sm layui-icon layui-icon-play table-toolbar-btn">&nbsp;启用</a>
  63. <a table-data="{'url':'store/product/plectron','action':'put',param:{'status': 0}}" confirm
  64. class="layui-btn layui-btn-sm layui-icon layui-icon-pause table-toolbar-btn">&nbsp;禁用</a>
  65. <a table-data="{'url':'store/product/plectron','action':'delete'}" confirm
  66. class="layui-btn layui-btn-sm layui-icon layui-icon-close table-toolbar-btn">&nbsp;删除</a>
  67. </div>
  68. </script>
  69. <!-- 表格操作列 -->
  70. <script type="text/html" id="tableBarUser">
  71. <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
  72. <a class="layui-btn layui-btn-danger layui-btn-xs" perm-show="delete:/store/product/<id>" lay-event="del">删除</a>
  73. </script>
  74. <!-- 表格状态列 -->
  75. <script type="text/html" id="tableStateUser">
  76. <input type="checkbox" value="{{ d.status }}" switch-data="{'url':'store/product/{{ d.id }}','action':'put'}"
  77. lay-skin="switch" lay-filter="ckDataTableState"
  78. lay-text="正常|锁定" {{d.status==1?'checked':''}}/>
  79. </script>
  80. <!-- 表单弹窗 -->
  81. <script type="text/html" id="modelGoods">
  82. <form id="modelGoodsForm" lay-filter="modelGoodsForm" class="layui-form model-form">
  83. <input name="id" type="hidden"/>
  84. <div class="model-form-body" style="max-height: 600px;padding:0;">
  85. <div class="layui-card">
  86. <div class="layui-tab layui-tab-brief">
  87. <ul class="layui-tab-title">
  88. <li class="layui-this">基本信息</li>
  89. <li>产品详情</li>
  90. <li>商品规格</li>
  91. </ul>
  92. <div class="layui-tab-content">
  93. <div class="layui-tab-item layui-show">
  94. <div class="layui-form-item">
  95. <label class="layui-form-label layui-form-required">所属商家</label>
  96. <div class="layui-input-block">
  97. <select name="seller_id" id="sellerSel" lay-verType="tips" lay-verify="required"
  98. lay-filter="xmFilter">
  99. <option value=""></option>
  100. </select>
  101. </div>
  102. </div>
  103. <div class="layui-form-item">
  104. <label class="layui-form-label layui-form-required">商品主图</label>
  105. <div class="layui-input-block">
  106. <input type="text" name="cover_img" value=""
  107. class="layui-input layui-disabled upload-input-cover_img" lay-verType="tips" lay-verify="required"
  108. required style="padding-right: 80px;" disabled="">
  109. <button data-field="cover_img" data-count="9" type="button" style="position: absolute;top: 0;right: 0px;cursor: pointer;"
  110. class="layui-btn icon-btn uploader">
  111. <i class="layui-icon">&#xe61d;</i>上传图片
  112. </button>
  113. <div class="cl imglist" id="cover_img"></div>
  114. </div>
  115. </div>
  116. <div class="layui-form-item">
  117. <label class="layui-form-label layui-form-required">商品名称</label>
  118. <div class="layui-input-block">
  119. <input name="name" placeholder="请输入商品名称" type="text" class="layui-input"
  120. maxlength="80"
  121. lay-verType="tips" lay-verify="required" required/>
  122. </div>
  123. </div>
  124. <div class="layui-form-item">
  125. <label class="layui-form-label layui-form-required">商品分类</label>
  126. <div class="layui-input-block">
  127. <div id="categorySel" class="ew-xmselect-tree"></div>
  128. </div>
  129. </div>
  130. <div class="layui-form-item">
  131. <label class="layui-form-label">是否拼团</label>
  132. <div class="layui-input-block">
  133. <select id="isPin" name="is_pin" lay-filter="xmFilter">
  134. <option value="0">否</option>
  135. <option value="1">是</option>
  136. </select>
  137. </div>
  138. </div>
  139. <div class="pin-box">
  140. <div class="layui-form-item">
  141. <label class="layui-form-label layui-form-required">拼团人数</label>
  142. <div class="layui-input-block">
  143. <input name="pin_sum" placeholder="请输入拼团人数" type="text" class="layui-input"
  144. maxlength="80"/>
  145. </div>
  146. </div>
  147. <div class="layui-form-item">
  148. <label class="layui-form-label layui-form-required">成团人数</label>
  149. <div class="layui-input-block">
  150. <input name="pin_number" placeholder="请输入拼团人数" type="number" class="layui-input"
  151. maxlength="80"/>
  152. </div>
  153. </div>
  154. </div>
  155. <div class="layui-form-item">
  156. <label class="layui-form-label">商品限购</label>
  157. <div class="layui-input-block">
  158. <input name="limit_buy" placeholder="请输入商品限购,默认0不限购" type="text" class="layui-input"
  159. maxlength="80"/>
  160. </div>
  161. </div>
  162. <div class="layui-form-item">
  163. <label class="layui-form-label">商品销量</label>
  164. <div class="layui-input-block">
  165. <input name="sell_count" placeholder="请输入商品销量" type="text" class="layui-input"
  166. maxlength="80"/>
  167. </div>
  168. </div>
  169. </div>
  170. <div class="layui-tab-item">
  171. <div class="layui-form-item">
  172. <textarea id="contentCkEditor" name="content"></textarea>
  173. </div>
  174. </div>
  175. <div class="layui-tab-item">
  176. <!-- 规格-->
  177. <div id="sku" class="sku-box"></div>
  178. </div>
  179. </div>
  180. </div>
  181. </div>
  182. </div>
  183. <div class="layui-form-item text-right">
  184. <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
  185. <button class="layui-btn" perm-show="put:/store/product/<id>" lay-filter="modelSubmitGoods" lay-submit>保存
  186. </button>
  187. </div>
  188. </form>
  189. </script>
  190. <!--// 商品分类-->
  191. <script type="text/html" id="modelGoodsCate">
  192. <table class="layui-table" id="GoodsCateTb" lay-filter="GoodsCateTb"></table>
  193. </script>
  194. <!--商品分类操作-->
  195. <script type="text/html" id="GoodsCateToolbar">
  196. <div class="layui-btn-group fl">
  197. <a class="layui-btn layui-btn-sm layui-icon layui-icon-add-circle-fine goods-cate-add-btn">&nbsp;添加</a>
  198. <a class="layui-btn layui-btn-sm layui-icon layui-icon-refresh goods-cate-refresh-btn">&nbsp;刷新</a>
  199. </div>
  200. </script>
  201. <!-- 表格操作列 -->
  202. <script type="text/html" id="GoodsCateTabbar">
  203. <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
  204. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
  205. </script>
  206. <script type="text/html" id="modelGoodsCateEdit">
  207. <form id="modelGoodsCateEditForm" lay-filter="modelGoodsCateEditForm" class="layui-form model-form">
  208. <input name="id" type="hidden"/>
  209. <div class="layui-form-item">
  210. <label class="layui-form-label layui-form-required">上级分类</label>
  211. <div class="layui-input-block">
  212. <div id="parentSel" class="ew-xmselect-tree"></div>
  213. </div>
  214. </div>
  215. <div class="layui-form-item">
  216. <label class="layui-form-label">分类名称</label>
  217. <div class="layui-input-block">
  218. <input name="name" placeholder="请输入分类名称" type="text" class="layui-input" maxlength="20"
  219. lay-verType="tips" lay-verify="required" required/>
  220. </div>
  221. </div>
  222. <div class="layui-form-item text-right">
  223. <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
  224. <button class="layui-btn" perm-show="put:/store/product/category/<id>" lay-filter="modelSubmitGoodsCateEdit"
  225. lay-submit>保存
  226. </button>
  227. </div>
  228. </form>
  229. </script>
  230. <!-- js部分 -->
  231. <script>
  232. layui.use(['layer', 'jquery', 'form', 'upload', 'table', 'tableX', 'util', 'notice', 'admin', 'setter', 'sku', 'xmSelect', 'CKEDITOR', 'Equencing','fileChoose'], function () {
  233. var $ = layui.jquery;
  234. var layer = layui.layer;
  235. var form = layui.form;
  236. var table = layui.table;
  237. var tableX = layui.tableX;
  238. var util = layui.util;
  239. var sku = layui.sku;
  240. var admin = layui.admin;
  241. var notice = layui.notice;
  242. var setter = layui.setter;
  243. var xmSelect = layui.xmSelect;
  244. var CKEDITOR = layui.CKEDITOR;
  245. var Equencing = layui.Equencing;
  246. var fileChoose = layui.fileChoose;
  247. // 获取所有商家
  248. var seller = [], skuitem = [];
  249. admin.req('store/seller', {}, function (res) {
  250. if (10000 == res.code) {
  251. seller = res.data.list;
  252. $.each(seller, function (index, item) {
  253. $('#sellerSearch').append('<option value="' + item.id + '">' + item.seller_name + '</option>');// 下拉菜单里添加元素
  254. });
  255. form.render('select');
  256. } else {
  257. layer.msg('获取商家列表失败', {icon: 2});
  258. }
  259. }, 'GET');
  260. // 获取所有分类
  261. var category = [];
  262. admin.req('store/product/category', {}, function (res) {
  263. if (10000 == res.code) {
  264. category = res.data.list;
  265. $.each(category, function (index, item) {
  266. $('#categorySearch').append('<option value="' + item.id + '">' + item.name + '</option>');// 下拉菜单里添加元素
  267. });
  268. form.render('select');
  269. } else {
  270. layer.msg('获取分类列表失败', {icon: 2});
  271. }
  272. }, 'GET');
  273. form.render('select');
  274. // 渲染表格
  275. var insTb = table.render({
  276. elem: '#dataTable',
  277. url: setter.baseServer + 'store/product',
  278. page: true,
  279. title: "商品表",
  280. // toolbar: true,
  281. toolbar: '#toolBarTpl',
  282. cellMinWidth: 100,
  283. cols: [[
  284. {type: 'checkbox'},
  285. {field: 'id', title: '产品ID', width: 100},
  286. {
  287. field: 'cover_img', title: '商品主图', templet: function (d) {
  288. var cover = JSON.parse(d.cover_img),
  289. html = "";
  290. $.each(cover, (i, item) => {
  291. html += '<img src="' + (item || '../../assets/images/placeholder-refund.png') + '" style="height: 100%;margin-right:2px" class="input-img-preview"/>'
  292. })
  293. return html;
  294. }, width: 150
  295. },
  296. {field: 'name', title: '商品名称', width: 200},
  297. {
  298. field: 'category', title: '分类', templet: function (d) {
  299. return '<span class="layui-badge layui-badge-gray">' + (d.category ? d.category.name : '未分类') + '</span>';
  300. }
  301. },
  302. {
  303. field: 'price', title: '售卖价格', templet: function (d) {
  304. return "<p style='color:red'>&yen;" + d.price + "</p>";
  305. }
  306. },
  307. {
  308. field: 'instock_price', title: '进货价格', templet: function (d) {
  309. return "<p style='color:red'>&yen;" + d.instock_price + "</p>";
  310. }
  311. },
  312. {
  313. field: 'dis_price', title: '优惠价格', templet: function (d) {
  314. return "<p style='color:red'>&yen;" + d.dis_price + "</p>";
  315. }
  316. },
  317. {field: 'stock', title: '商品库存'},
  318. {field: 'sell_count', title: '商品销量'},
  319. {field: 'limit_buy', title: '商品限购'},
  320. {
  321. field: 'in_selling', title: '售卖中', templet: function (d) {
  322. return '<span class="layui-badge ' + (d.in_selling ? "layui-badge-blue" : "layui-badge-red") + '">' + (d.in_selling ? "是" : "否") + '</span>';
  323. }
  324. },
  325. {
  326. field: 'is_pin', title: '是否拼团', templet: function (d) {
  327. return '<span class="layui-badge ' + (d.is_pin ? "layui-badge-blue" : "layui-badge-red") + '">' + (d.is_pin ? "是" : "否") + '</span>';
  328. }
  329. },
  330. {
  331. field: 'pin_price', title: '拼团价格', templet: function (d) {
  332. return "<p style='color:red'>&yen;" + d.pin_price + "</p>";
  333. }
  334. },
  335. {field: 'pin_sum', title: '开团人数'},
  336. {field: 'pin_number', title: '中团人数'},
  337. {
  338. field: 'created_at', sort: true, templet: function (d) {
  339. return util.toDateString(d.created_at * 1e3);
  340. }, title: '创建时间', width: 180
  341. },
  342. {field: 'status', templet: '#tableStateUser', title: '状态', width: 120},
  343. {fixed: 'right', align: 'center', toolbar: '#tableBarUser', title: '操作', minWidth: 200}
  344. ]],
  345. done: function () {
  346. admin.renderPerm()
  347. }
  348. });
  349. // 商品分类
  350. $(document).on('click', '.goods-category', function () {
  351. showGoodsCateTbModel();
  352. });
  353. // 添加
  354. $(document).on('click', '.product-add-btn', function () {
  355. showEditModel();
  356. });
  357. // 搜索
  358. form.on('submit(formSubSearchUser)', function (data) {
  359. insTb.reload({where: data.field}, 'data');
  360. });
  361. // 工具条点击事件
  362. table.on('tool(dataTable)', function (obj) {
  363. var data = obj.data;
  364. var layEvent = obj.event;
  365. if (layEvent === 'edit') { // 修改
  366. showEditModel(data);
  367. } else if (layEvent === 'del') { // 删除
  368. layer.confirm('确定要删除“' + data.name + '”吗?', {
  369. skin: 'layui-layer-admin',
  370. shade: .1
  371. }, function (i) {
  372. layer.close(i);
  373. layer.load(2);
  374. admin.req('store/product/' + data.id, function (r) {
  375. layer.closeAll('loading');
  376. if (r.code === 10000) {
  377. notice.msg(r.message, {icon: 1});
  378. insTb.reload({}, 'data');
  379. } else {
  380. notice.msg(r.message, {icon: 2});
  381. }
  382. }, 'DELETE');
  383. });
  384. }
  385. });
  386. // uploader
  387. var uploader = null;
  388. // 显示表单弹窗
  389. function showEditModel(data) {
  390. admin.open({
  391. id: 'LAY_GoodsModel',
  392. type: 1,
  393. area: '900px', //宽高
  394. title: (data ? '修改' : '添加') + '商品',
  395. content: $('#modelGoods').html(),
  396. success: function (layero, dIndex) {
  397. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  398. // 是否显示拼团价格
  399. (data && data.is_pin > 0) ? $(".pin-box").show() : $(".pin-box").hide();
  400. // 选择拼团类型
  401. $(document).on('change', '#isPin', function () {
  402. ($(this).val() == 1) ? $(".pin-box").show() : $(".pin-box").hide();
  403. });
  404. var imgs = [];
  405. if (data && data.cover_img.length > 0) {
  406. $(".img-preview-box.cover_img").empty();
  407. $.each(JSON.parse(data.cover_img), (i, t) => {
  408. imgs.push(t)
  409. //$(".img-preview-box.cover_img").append('<img class="input-img-preview" src="' + t + '" style="height: 100px;margin: 8px;"/>')
  410. })
  411. }
  412. // 图片展示
  413. // if(data) {
  414. // var imgulp = Equencing.render({listid: 'cover_img', jsondata: false, imgsrcarr: imgs});
  415. uploader = Equencing.render({
  416. elem: "cover_img",
  417. data: imgs,
  418. count: 9,
  419. });
  420. // 删除图片数据
  421. $(document).on('click', '.eq-item-del', function () {
  422. var elem = $(this).parents('.__item__').eq(0),
  423. index = elem.attr('item'),
  424. el = elem.attr('el'),
  425. ip = $('.upload-input-' + el )[0];
  426. // 删除对应数据
  427. uploader.delItem(index),ip.value = uploader.getData();
  428. });
  429. // }
  430. // 商家
  431. $.each(seller, function (index, item) {
  432. let ichecked = "";
  433. if (data) ichecked = data.seller_id === item.id ? "selected" : "";
  434. $('#sellerSel').append('<option value="' + item.id + '" ' + ichecked + '>' + item.seller_name + '</option>');// 下拉菜单里添加元素
  435. });
  436. // 分类处理
  437. let selCategoryIds = xmSelect.render({
  438. el: '#categorySel',
  439. data: setter.lists2tree(category),
  440. model: {label: {type: 'text'}},
  441. radio: true,
  442. clickClose: true,
  443. name: 'category_id', // 提交的字段名称
  444. prop: {
  445. name: 'name',
  446. value: 'id'
  447. },
  448. tree: {
  449. show: true,
  450. indent: 15,
  451. strict: false,
  452. expandedKeys: true
  453. },
  454. height: '250px'
  455. });
  456. //设置默认值
  457. selCategoryIds.setValue([(data ? data.category : {
  458. name: (data && data.name || '选择上一级菜单'),
  459. value: 0
  460. })], null, true);
  461. // 渲染富文本编辑器
  462. var contentEdt = CKEDITOR.replace('contentCkEditor', {
  463. height: 300,
  464. language: 'zh-cn', //简体中文
  465. toolbar: [
  466. //加粗 斜体, 下划线 穿过线 下标字 上标字
  467. ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript'],
  468. // 数字列表 实体列表 减小缩进 增大缩进
  469. ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent'],
  470. //左对 齐 居中对齐 右对齐 两端对齐
  471. ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
  472. //超链接 取消超链接 锚点
  473. ['Link', 'Unlink', 'Anchor'],
  474. //图片 flash 表格 水平线 表情 特殊字符 分页符
  475. ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak'],
  476. '/',
  477. // 样式 格式 字体 字体大小
  478. ['Styles', 'Format', 'Font', 'FontSize'],
  479. //文本颜色 背景颜色
  480. ['TextColor', 'BGColor'],
  481. //全屏 显示区块
  482. ['Maximize', 'ShowBlocks', '-']
  483. ]
  484. });
  485. contentEdt.on('fileUploadRequest', function (evt) {
  486. let xhr = evt.data.fileLoader.xhr;
  487. xhr.setRequestHeader('Authorization', setter.getToken());
  488. });
  489. CKEDITOR.instances.pageCkEditor;
  490. var skuDat = [];
  491. if (data) {
  492. admin.req('store/product/sku/' + data.id, (res) => {
  493. if (10000 == res.code) {
  494. skuDat = res.data;
  495. }
  496. }, 'GET', {async: false});
  497. }
  498. // 颜色 1 白色 1 {"1":"1"}
  499. // 版本 2 V2 4 {"2":"4"}
  500. // 组合成 颜色为百色版本为V2的产品
  501. var SKU = sku.init({id: 'sku', item: skuDat.spec, data: skuDat.sku});
  502. form.render('radio');
  503. form.render('select');
  504. // 回显数据
  505. form.val('modelGoodsForm', data);
  506. // 表单提交事件
  507. form.on('submit(modelSubmitGoods)', function (form) {
  508. // 主图排序新数据
  509. if(uploader){
  510. form.field.cover_img = uploader.getData();
  511. }
  512. // 分类
  513. if (form.field.category_id === '') {
  514. layer.tips('请选择商品分类', $('#categorySel'), {tips: [3, '#ff4c4c']});
  515. return false;
  516. }
  517. // 判断下拼团价格
  518. if (form.field.is_pin > 0) {
  519. if (form.field.pin_price == "" || form.field.pin_price == 0) {
  520. layer.tips('拼团价格不能为空', $('input[name="pin_price"]'), {tips: [3, '#ff4c4c']});
  521. return false;
  522. }
  523. if (form.field.pin_number == "" || form.field.pin_number == 0) {
  524. layer.tips('拼团人数不能为空', $('input[name="pin_number"]'), {tips: [3, '#ff4c4c']});
  525. return false;
  526. }
  527. }
  528. // 追加数据
  529. var content = contentEdt.getData();
  530. if (content === '') {
  531. layer.tips('产品详情内容不能为空', $('#contentCkEditor'), {tips: [3, '#ff4c4c']});
  532. return false;
  533. }
  534. form.field.content = contentEdt.getData();
  535. var sku = SKU.getData();
  536. if (sku.length == 0) {
  537. layer.tips('产品SKU不能为空', $('#sku'), {tips: [3, '#ff4c4c']});
  538. return false;
  539. }
  540. form.field.sku = JSON.stringify(sku);
  541. layer.load(2);
  542. admin.req('store/product' + (data ? '/' + form.field.id : ''), form.field, function (res) {
  543. layer.closeAll('loading');
  544. if (res.code === 10000) {
  545. layer.close(dIndex);
  546. notice.msg(res.message, {icon: 1});
  547. insTb.reload({}, 'data');
  548. } else {
  549. notice.msg(res.message, {icon: 2});
  550. }
  551. }, data ? 'PUT' : 'POST');
  552. return false;
  553. });
  554. }
  555. });
  556. }
  557. // 规格
  558. function showSpecViewModel() {
  559. admin.open({
  560. id: 'LAY_SpecView',
  561. type: 1,
  562. area: '720px', //宽高
  563. title: '商品分类',
  564. content: $('#modelSpecView').html(),
  565. success: function (layero, dIndex) {
  566. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  567. }
  568. })
  569. }
  570. var goodsCateTb;
  571. // 展示商品分类
  572. function showGoodsCateTbModel() {
  573. admin.open({
  574. id: 'LAY_GoodsCate',
  575. type: 1,
  576. area: '720px', //宽高
  577. title: '商品分类',
  578. content: $('#modelGoodsCate').html(),
  579. success: function (layero, dIndex) {
  580. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  581. // 渲染表格
  582. goodsCateTb = table.render({
  583. elem: '#GoodsCateTb',
  584. url: setter.baseServer + 'store/product/category',
  585. page: true,
  586. height: 500,
  587. defaultToolbar: false,
  588. toolbar: "#GoodsCateToolbar",
  589. cols: [[
  590. {type: 'numbers'},
  591. {
  592. field: 'parent', title: '上级分类', width: 150, templet: function (d) {
  593. var parent = "顶级分类";
  594. $.each(category, (i, c) => {
  595. if (c.id == d.parent_id) {
  596. parent = c.name;
  597. }
  598. })
  599. return parent;
  600. }
  601. },
  602. {field: 'name', title: '分类名称', width: 150},
  603. {
  604. field: 'created_at', sort: true, templet: function (d) {
  605. return util.toDateString(d.created_at * 1e3);
  606. }, title: '创建时间', width: 180
  607. },
  608. {fixed: "right", align: 'center', toolbar: '#GoodsCateTabbar', title: '操作', minWidth: 200}
  609. ]],
  610. done: function () {
  611. tableX.merges('GoodsCateTb', [1], false)
  612. }
  613. });
  614. // 工具条点击事件
  615. table.on('tool(GoodsCateTb)', function (obj) {
  616. var data = obj.data;
  617. var layEvent = obj.event;
  618. if (layEvent === 'edit') { // 修改
  619. showGoodsCateEditModel(data);
  620. } else if (layEvent === 'del') { // 删除
  621. layer.confirm('确定要删除“' + data.name + '”吗?', {
  622. skin: 'layui-layer-admin',
  623. shade: .1
  624. }, function (i) {
  625. layer.close(i);
  626. layer.load(2);
  627. admin.req('store/product/category/delete/' + data.id, function (r) {
  628. layer.closeAll('loading');
  629. if (r.code === 10000) {
  630. notice.msg(r.message, {icon: 1});
  631. goodsCateTb.reload({}, 'data');
  632. } else {
  633. notice.msg(r.message, {icon: 2});
  634. }
  635. }, 'DELETE');
  636. });
  637. }
  638. });
  639. }
  640. })
  641. }
  642. // 添加
  643. $(document).on('click', '.goods-cate-refresh-btn', function () {
  644. goodsCateTb.reload({}, 'data');
  645. });
  646. // 添加
  647. $(document).on('click', '.goods-cate-add-btn', function () {
  648. showGoodsCateEditModel();
  649. });
  650. // 显示表单弹窗
  651. function showGoodsCateEditModel(data) {
  652. admin.open({
  653. id: 'LAY_GoodsCateEdit',
  654. type: 1,
  655. area: ['420px'], //宽高
  656. title: (data ? '修改' : '添加') + '商品分类',
  657. content: $('#modelGoodsCateEdit').html(),
  658. success: function (layero, dIndex) {
  659. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  660. // 分类处理
  661. let selParentIds = xmSelect.render({
  662. el: '#parentSel',
  663. data: setter.lists2tree(category),
  664. model: {label: {type: 'text'}},
  665. radio: true,
  666. clickClose: true,
  667. name: 'parent_id', // 提交的字段名称
  668. prop: {
  669. name: 'name',
  670. value: 'id'
  671. },
  672. tree: {
  673. show: true,
  674. indent: 15,
  675. strict: false,
  676. expandedKeys: true
  677. },
  678. height: '250px'
  679. });
  680. //设置默认值
  681. //selParentIds.setValue([ (data ? data.category :{ name: (data && data.name || '选择上一级菜单'), value: 0})], null, true);
  682. // 回显数据
  683. form.val('modelGoodsCateEditForm', data);
  684. form.render('radio');
  685. form.render('select');
  686. // 表单提交事件
  687. form.on('submit(modelSubmitGoodsCateEdit)', function (form) {
  688. layer.load(2);
  689. admin.req('store/product/category' + (data ? '/update/' + form.field.id : '/create'), form.field, function (res) {
  690. layer.closeAll('loading');
  691. if (res.code === 10000) {
  692. layer.close(dIndex);
  693. notice.msg(res.message, {icon: 1});
  694. goodsCateTb.reload({}, 'data');
  695. } else {
  696. notice.msg(res.message, {icon: 2});
  697. }
  698. }, data ? 'PUT' : 'POST');
  699. return false;
  700. });
  701. }
  702. });
  703. }
  704. // 2020 09 19
  705. // 整合图片排序上传方法
  706. $(document).on('click', '.uploader', function () {
  707. var t = $(this),
  708. s =t.attr('data-field'),
  709. c =t.attr('data-count') || 0,
  710. n = $('.upload-input-' + s ),
  711. j = $('.'+ s);
  712. fileChoose.open({
  713. headers: {
  714. 'Authorization': setter.getToken()
  715. },
  716. listUrl: setter.baseServer + 'system/annex',
  717. uploadUrl: setter.baseServer + 'system/annex/upload',
  718. num: (c > 1) ? c : 1,
  719. dialog: {
  720. offset: '60px'
  721. },
  722. response: {
  723. code: 10000,
  724. smUrl: 'thumbs'
  725. },
  726. onChoose: function (choose) {
  727. var urls = [];
  728. // 元数据
  729. if(n[0].value !== ""){
  730. urls = JSON.parse(n[0].value);
  731. }
  732. // 追加数据
  733. $.each(choose,(i,t) => {
  734. urls.push(t.url);
  735. uploader.addItem(t.url)
  736. });
  737. n[0].value = JSON.stringify(urls);
  738. }
  739. });
  740. });
  741. });
  742. </script>