form.html 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. {extend name='admin@main'}
  2. {block name="content"}
  3. {include file='mall@store_goods/form_style'}
  4. <style>
  5. .layui-form-radio{
  6. margin: 0 !important;
  7. padding-right:0 !important;
  8. }
  9. .layui-form-select{
  10. margin-right: 10px !important;
  11. }
  12. .spec_over_td img{
  13. width: 50px;
  14. height: 50px;
  15. }
  16. </style>
  17. <form onsubmit="return false;" id="GoodsForm" data-auto="true" method="post" class='layui-form layui-card' autocomplete="off">
  18. <div class="layui-card-body think-box-shadow padding-left-40">
  19. <div class="layui-tab">
  20. <ul class="layui-tab-title">
  21. <li class="layui-this">基础设置</li>
  22. <li>规格设置</li>
  23. </ul>
  24. <div class="layui-tab-content">
  25. <!--基础设置-->
  26. <div class="layui-tab-item layui-show">
  27. <!--基础设置start-->
  28. <div class="layui-form-item layui-row layui-col-space15">
  29. <label class="layui-col-xs9 relative">
  30. <span class="color-green">商品名称</span>
  31. <input name="name" required class="layui-input" placeholder="请输入商品名称" value="{$vo.name|default=''}">
  32. </label>
  33. </div>
  34. <div class="layui-form-item layui-row layui-col-space15">
  35. <label class="layui-col-xs9 relative">
  36. <span class="color-green">副标题</span>
  37. <input name="desc" required class="layui-input" placeholder="请输入商品副标题" value="{$vo.desc|default=''}">
  38. </label>
  39. </div>
  40. <div class="layui-form-item layui-row layui-col-space15">
  41. <label class="layui-col-xs3 relative">
  42. <span class="color-green">会员账号</span>
  43. <input name="phone" class="layui-input" placeholder="请输入会员账号" value="{$vo.phone|default=''}">
  44. </label>
  45. <label class="layui-col-xs3 relative">
  46. <span class="color-green">热搜阅读量</span>
  47. <input name="hot_num" class="layui-input" placeholder="请输入热搜阅读量" value="{$vo.hot_num|default=''}">
  48. <input name="hot_num_old" type="hidden" value='{$vo.hot_num|default=""}' class="layui-input">
  49. </label>
  50. <label class="layui-col-xs3 relative">
  51. <span class="color-green">上架时间</span>
  52. <input name="release_time" id="release_time" class="layui-input" placeholder="" value="{$vo.release_time|default=''}">
  53. </label>
  54. </div>
  55. <div class="layui-form-item layui-row layui-col-space15">
  56. <label class="layui-col-xs9 relative">
  57. <span class="color-green">标签</span>
  58. <textarea placeholder="请输入标签" maxlength="100" class="layui-textarea" name="label">{$vo.label|default=''}</textarea>
  59. <span >多个用逗号隔开(半角)</span>
  60. </label>
  61. </div>
  62. <!-- 商品分类-->
  63. <div class="layui-form-item layui-row layui-col-space15">
  64. <label class="layui-col-xs9 relative" style="width: 100%;">
  65. <span class="color-green">商品分类</span>
  66. </label>
  67. <div style="width: 100%">
  68. <div style="width: 15%;float: left;">
  69. <select class="layui-select" id="first_classify" name="first_classify" lay-filter="first_classify" lay-search>
  70. <option selected data-first_key="-1" selected value="0">请选择</option>
  71. {if !empty($goods_cate)}
  72. {foreach $goods_cate as $ck=>$cv}
  73. {if isset_full_check($vo,'first_classify',$cv['id'])}
  74. <option selected data-first_key="{$ck}" value="{$cv['id']}">{$cv['title']}</option>
  75. {else}
  76. <option data-first_key="{$ck}" value="{$cv['id']}">{$cv['title']}</option>
  77. {/if}
  78. {/foreach}
  79. {/if}
  80. </select>
  81. </div>
  82. <div style="width: 15%;float: left">
  83. <select class="layui-select" id="second_classify" name="second_classify" lay-filter="second_classify" lay-search>
  84. </select>
  85. </div>
  86. <div style="width: 15%;float: left">
  87. <select class="layui-select" id="third_classify" name="third_classify" lay-filter="third_classify" lay-search>
  88. </select>
  89. </div>
  90. <input type="hidden" id="first" value="{$vo.first_classify|default='-1'}"/>
  91. <input type="hidden" id="second" value="{$vo.second_classify|default='-1'}"/>
  92. <input type="hidden" id="third" value="{$vo.third_classify|default='-1'}"/>
  93. </div>
  94. </div>
  95. <div class="layui-form-item">
  96. <span class="color-green label-required-prev">商品LOGO及轮播展示图片</span>
  97. <table class="layui-table">
  98. <thead>
  99. <tr>
  100. <th class="text-center">LOGO</th>
  101. <th class="text-left">轮播图</th>
  102. </tr>
  103. <tr>
  104. <td width="90px" class="text-center"><input name="cover" type="hidden" value="{$vo.cover|default=''}"></td>
  105. <td width="auto" class="text-left"><input name="image" type="hidden" value="{$vo.image|default=''}"></td>
  106. </tr>
  107. </thead>
  108. </table>
  109. <script>$('[name="cover"]').uploadOneImage(), $('[name="image"]').uploadMultipleImage()</script>
  110. </div>
  111. <div class="layui-form-item">
  112. <span class="color-green label-required-prev">商品详情图</span>
  113. <textarea name="content">{$vo.content|default=""}</textarea>
  114. <!-- <table class="layui-table">-->
  115. <!-- <thead>-->
  116. <!-- <tr>-->
  117. <!-- <td width="auto" class="text-left"><input name="content" type="hidden" value="{$vo.content|default=''}"></td>-->
  118. <!-- </tr>-->
  119. <!-- </thead>-->
  120. <!-- </table>-->
  121. <!-- <script>$('[name="content"]').uploadMultipleImage()</script>-->
  122. </div>
  123. <!-- 运费设置-->
  124. <div class="freight_box">
  125. <div class="layui-form-item layui-row layui-col-space15">
  126. <label class="layui-col-xs9 relative" style="width: 100%;">
  127. <span class="color-green">模板开关</span>
  128. <div class="layui-input-block margin-left-0 margin-top-15">
  129. <label >
  130. <input type="radio" class="layui-input" value="0" name="freight_type" lay-filter="freight_type" {if !isset($vo.freight_type) || !$vo.freight_type}checked{/if} >
  131. </label>
  132. <span class="margin-right-10">固定运费</span>
  133. <label>
  134. <input type="radio" class="layui-input" value="1" name="freight_type" lay-filter="freight_type" {if isset($vo.freight_type) && $vo.freight_type}checked{/if} >
  135. </label>
  136. <span class="margin-right-10">运费模板</span>
  137. </div>
  138. </label>
  139. </div>
  140. <div class="layui-form-item layui-row layui-col-space15 freight_mud" {if !isset($vo.freight_type) || !$vo.freight_type}style="display:none"{/if}>
  141. <label class="layui-col-xs9 relative" style="width: 100%;">
  142. <span class="color-green">运费模板</span>
  143. <select name="freight_id" class="layui-select" lay-filter ="freight_id">
  144. <option value="0" >请选择</option>
  145. {if !empty($express)}
  146. {foreach $express as $tk=>$tv}
  147. {if isset($vo.freight_id) && $vo.freight_id ==$tv['id'] }
  148. <option selected value="{$tv['id']}">{$tv['name']}</option>
  149. {else}
  150. <option value="{$tv['id']}">{$tv['name']}</option>
  151. {/if}
  152. {/foreach}
  153. {/if}
  154. </select>
  155. </label>
  156. </div>
  157. <div class="layui-form-item layui-row layui-col-space15 postage" {if isset($vo.freight_type) && $vo.freight_type}style="display:none"{/if}>
  158. <label class="layui-col-xs9 relative" style="width: 100%;">
  159. <span class="color-green">虚拟销量</span>
  160. <input type="number" step="1" min="0" name="sale_num" value="{$vo.sale_num|default=''}" class="layui-input">
  161. </label>
  162. <label class="layui-col-xs9 relative" style="width: 100%;">
  163. <span class="color-green">运费金额</span>
  164. <input type="number" step="1" min="0" name="postage" value="{$vo.postage|default=''}" class="layui-input">
  165. </label>
  166. <div class="layui-form-mid layui-word-aux" style="margin-left: 10px">不填(或0)表示包邮</div>
  167. </div>
  168. </div>
  169. <!-- 运费设置 end-->
  170. </div>
  171. <!--规格设置start-->
  172. <div class="layui-tab-item">
  173. <div class="layui-form-item">
  174. <span class="color-green label-required-prev">商品规格及商品SKU绑定<span class="color-red font-s12">(规格填写后不允许再次修改)</span></span>
  175. <div ng-repeat="x in specs track by $index" style="display:none" class="margin-bottom-10" ng-class="{true:'layui-show'}[isAddMode&&specs.length>0]">
  176. <div class="goods-spec-box padding-10 margin-0 relative" style="background:#ddd">
  177. <span class="text-center goods-spec-title">分组</span>
  178. <label class="label-required-null inline-block"><input ng-blur="x.name=trimSpace(x.name)" ng-model="x.name" required placeholder="请输入分组名称"></label>
  179. <div class="pull-right">
  180. <a class="layui-btn layui-btn-sm layui-btn-primary goods-spec-btn" ng-click="addSpecVal(x.list)">增加</a>
  181. <a class="layui-btn layui-btn-sm layui-btn-primary goods-spec-btn" ng-class="{false:'layui-bg-gray'}[$index>0]" ng-click="upSpecRow(specs,$index)">上移</a>
  182. <a class="layui-btn layui-btn-sm layui-btn-primary goods-spec-btn" ng-class="{false:'layui-bg-gray'}[$index<specs.length-1]" ng-click="dnSpecRow(specs,$index)">下移</a>
  183. <a class="layui-btn layui-btn-sm layui-btn-primary goods-spec-btn" ng-click="delSpecRow(specs,$index)" ng-if="specs.length>1">删除</a>
  184. </div>
  185. </div>
  186. <div class="goods-spec-box padding-10 margin-0 layui-bg-gray block relative" ng-if="x.list && x.list.length > 0">
  187. <label class="label-required-null inline-block margin-right-10 margin-bottom-5 relative nowrap" ng-repeat="xx in x.list">
  188. <input type="checkbox" lay-ignore ng-model="xx.check" ng-click="xx.check=checkListChecked(x.list,$event.target.checked)">
  189. <input type="text" ng-blur="xx.name=trimSpace(xx.name)" ng-model="xx.name" ng-keyup="xx.name=$event.target.value" required placeholder="请输入规格">
  190. <a ng-if="x.list.length>1" ng-click="x.list=delSpecVal(x.list,$index)" class="layui-icon layui-icon-close font-s12 goods-spec-close"></a>
  191. </label>
  192. </div>
  193. </div>
  194. <a ng-if="isAddMode&&specs.length<5" class="layui-btn layui-btn-sm layui-btn-primary" ng-click="addSpecRow(specs)">增加分组</a>
  195. <table class="layui-table margin-top-10">
  196. <thead>
  197. <tr>
  198. <th ng-repeat="x in specsTreeNava track by $index" class="nowrap" ng-bind="x"></th>
  199. <th class="text-center nowrap">规格图片</th>
  200. <th width="10%" class="text-center nowrap">商品SKU <a ng-click="batchSet('sku',null)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
  201. <th width="10%" class="text-center nowrap">市场价格 <a ng-click="batchSet('original_price',2)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
  202. <th width="10%" class="text-center nowrap">销售价格 <a ng-click="batchSet('sell_price',2)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
  203. <th width="10%" class="text-center nowrap" style="display: none">虚拟销量 <a ng-click="batchSet('virtual',0)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
  204. <th width="10%" class="text-center nowrap">重量(KG)<a ng-click="batchSet('weight',2)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
  205. <th width="10%" class="text-center nowrap">销售状态</th>
  206. </tr>
  207. </thead>
  208. <tbody>
  209. <input type="hidden" id="up_img" value="-1" />
  210. <tr ng-repeat="rows in specsTreeData track by $index">
  211. <td class="layui-bg-gray" ng-if="td.show" rowspan="{{td.span}}" ng-repeat="td in rows" ng-bind="td.name"></td>
  212. <td style="width: 60px;height: 60px" class="padding-10 spec_over_td">
  213. <img class="up_img" src="{{rows[0].spec_cover}}" alt="sku图片">
  214. <input style="display: none" type="file" accept="image/png,image/jpeg,image/gif" name="file" onchange="upload_img(this)">
  215. <input type="hidden" name="spec_cover[]" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].spec_cover">
  216. </td>
  217. <td class="padding-0">
  218. <label class="padding-0 margin-0">
  219. <input ng-blur="rows[0].sku=setValue(rows[0].key,'sku',$event.target.value)" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].sku">
  220. </label>
  221. </td>
  222. <td class="padding-0">
  223. <label class="padding-0 margin-0">
  224. <input ng-blur="rows[0].original_price=setValue(rows[0].key,'original_price',$event.target.value,'(parseFloat(_)||0).toFixed(2)')" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].original_price">
  225. </label>
  226. </td>
  227. <td class="padding-0">
  228. <label class="padding-0 margin-0">
  229. <input ng-blur="rows[0].sell_price=setValue(rows[0].key,'sell_price',$event.target.value,'(parseFloat(_)||0).toFixed(2)')" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].sell_price">
  230. </label>
  231. </td>
  232. <td class="padding-0" style="display: none">
  233. <label class="padding-0 margin-0">
  234. <input ng-blur="rows[0].virtual=setValue(rows[0].key,'virtual',$event.target.value,'(parseInt(_)||0)')" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].virtual">
  235. </label>
  236. </td>
  237. <td class="padding-0">
  238. <label class="padding-0 margin-0">
  239. <input ng-blur="rows[0].weight=setValue(rows[0].key,'weight',$event.target.value,'(parseInt(_)||0).toFixed(2)')" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].weight">
  240. </label>
  241. </td>
  242. <td class="text-center layui-bg-gray">
  243. <label class="think-checkbox margin-0 full-width full-height block"><input lay-ignore type="checkbox" ng-model="rows[0].status"></label>
  244. </td>
  245. </tr>
  246. </tbody>
  247. </table>
  248. <p class="color-desc">请从仓储平台获取商品SKU与商品条码,请注意尽量不要重复,也不能产生订单后再修改!</p>
  249. <textarea class="layui-textarea layui-hide" name="specs">{{specs}}</textarea>
  250. <textarea class="layui-textarea layui-hide" name="lists">{{specsTreeData}}</textarea>
  251. </div>
  252. <div class="layui-form-item layui-row layui-col-space15">
  253. <label class="layui-col-xs15 relative">
  254. <span class="color-green">详情</span>
  255. <textarea name="detail">{$vo.detail|default=""}</textarea>
  256. </label>
  257. </div>
  258. <div class="layui-form-item text-center">
  259. {notempty name='vo.id'}<input type="hidden" name="id" value="{$vo.id}">{/notempty}
  260. <button class="layui-btn" type="submit">保存商品</button>
  261. <button class="layui-btn layui-btn-danger" type='button' onclick="history.go(-1)" data-close>返回</button>
  262. </div>
  263. </div>
  264. </div>
  265. </div>
  266. </div>
  267. </form>
  268. {/block}
  269. {block name='script'}
  270. <textarea class="layui-hide" id="goods-specs">{$vo.specs|raw|default=''}</textarea>
  271. <textarea class="layui-hide" id="goods-value">{$defaultValues|raw|default=''}</textarea>
  272. <script>
  273. window.form.render();
  274. // $('[name="logo"]').uploadOneImage();
  275. require(['ckeditor', 'angular'], function () {
  276. window.createEditor('[name="content"]', {
  277. });
  278. })
  279. </script>
  280. <script>
  281. window.form.render();
  282. layui.use('form', function () {
  283. var form = layui.form;
  284. //日期时间范围
  285. laydate.render({
  286. elem: '#sell_time'
  287. ,type: 'datetime'
  288. });
  289. laydate.render({
  290. elem: '#release_time'
  291. ,type: 'datetime'
  292. });
  293. //监听指定开关
  294. form.on('radio(freight_type)', function(data) {
  295. if (data.value == 1) {
  296. $(".freight_mud").show();
  297. $(".postage").hide();
  298. } else {
  299. $(".freight_mud").hide();
  300. $(".postage").show();
  301. }
  302. })
  303. //监听指定开关
  304. })
  305. $(document).on("click",'.up_img',function () {
  306. console.log( $(".up_img").index(this))
  307. $("#up_img").val( $(".up_img").index(this));
  308. $(this).siblings('[name="file"]').click();
  309. })
  310. function upload_img(e) {
  311. var file = e.files[0]; //获取图片资源
  312. var index_n = $("#up_img").val();
  313. var fileTypes = ["bmp", "jpg", "png", "jpeg"];
  314. var bTypeMatch = false
  315. for (var i = 0; i < fileTypes.length; i++) {
  316. var start = file.name.lastIndexOf(".");
  317. var fileType = file.name.substring(start + 1);
  318. if (fileType.toLowerCase() == fileTypes[i]) {
  319. bTypeMatch = true;
  320. break;
  321. }
  322. }
  323. if (bTypeMatch) {
  324. if (file.size <= 1024 * 1024 * 50) {
  325. var farmData = new FormData();
  326. farmData.append("file", file)
  327. $.ajax("/api/Upload/upload", {
  328. data: farmData,
  329. processData: false,
  330. contentType: false,
  331. dataType: 'json',
  332. type: 'post', //HTTP请求类型
  333. headers: {
  334. 'zbtoken': localStorage.getItem("token"),
  335. 'enctype': 'multipart/form-data',
  336. },
  337. success: function (data) {
  338. if(data.code == 1) {
  339. $('.up_img').eq(index_n).attr('src',data.data)
  340. $("input[name='spec_cover[]']").eq(index_n).val(data.data)
  341. window.form.render();
  342. }else{
  343. layer.msg(data.msg);
  344. }
  345. console.log(data)
  346. },
  347. error: function (xhr, type, errorThrown) {
  348. console.log(type);
  349. }
  350. });
  351. } else {
  352. alert('仅支持不超过50M的图片');
  353. return false;
  354. }
  355. } else {
  356. alert('仅限bmp,jpg,png,jpeg图片格式');
  357. return false;
  358. }
  359. }
  360. require(['ckeditor', 'angular'], function () {
  361. //window.createEditor('[name="content"]', {height: 500});
  362. var app = angular.module("GoodsForm", []).run(callback);
  363. angular.bootstrap(document.getElementById(app.name), [app.name]);
  364. function getRand(length, prefix) {
  365. return (function (time, code) {
  366. code += parseInt(time.substr(0, 1)) + parseInt(time.substr(1, 1)) + time.substr(2, 8);
  367. while (code.length < length) code += Math.round(Math.random() * 10);
  368. return code;
  369. })(Date.now().toString(), prefix || '' + '')
  370. }
  371. function callback($rootScope) {
  372. $rootScope.isAddMode = parseInt('{$isAddMode|default=0}');
  373. $rootScope.maps = JSON.parse(angular.element('#goods-value').val() || '[]') || {};
  374. $rootScope.specs = JSON.parse(angular.element('#goods-specs').val() || '[{"name":"默认分组","list":[{"name":"默认规格","check":true}]}]');
  375. // 批量设置数值
  376. $rootScope.batchSet = function (type, fixed) {
  377. layer.prompt({title: '请输入数值', formType: 0}, function (value, index) {
  378. $rootScope.$apply(function () {
  379. var val = (parseFloat(value) || 0).toFixed(fixed);
  380. for (var i in $rootScope.specsTreeData) for (var j in $rootScope.specsTreeData[i]) {
  381. $rootScope.specsTreeData[i][j][type] = val;
  382. }
  383. });
  384. layer.close(index);
  385. });
  386. };
  387. // 返回商品列表
  388. $rootScope.hsitoryBack = function () {
  389. $.msg.confirm('确定要取消编辑吗?', function (index) {
  390. history.back(), $.msg.close(index);
  391. });
  392. };
  393. // 设置默认值
  394. $rootScope.setValue = function (key, type, value, call) {
  395. $rootScope.maps[key] || ($rootScope.maps[key] = {});
  396. return $rootScope.maps[key][type] = eval(call.replace('_', "'" + value + "'"));
  397. };
  398. // 读取默认值
  399. $rootScope.getValue = function (key, callback) {
  400. if (typeof callback === 'function') {
  401. return callback($rootScope.maps[key] || {});
  402. }
  403. return {};
  404. };
  405. // 去除空白字符
  406. $rootScope.trimSpace = function (value) {
  407. return (value + '').replace(/\s*/ig, '');
  408. };
  409. // 生成交叉表格数据
  410. $rootScope.specsTreeData = [];
  411. $rootScope.specsTreeNava = [];
  412. // 当前商品规格发生变化时重新计算规格列表
  413. $rootScope.$watch('specs', function () {
  414. var data = $rootScope.specs, list = [], navs = [], table = [[]];
  415. // 过滤无效记录
  416. for (var i in data) {
  417. var tmp = [];
  418. for (var j in data[i].list) if (data[i].list[j].check && data[i].list[j].name.length > 0) {
  419. data[i].list[j].span = 1, data[i].list[j].show = true, data[i].list[j].group = data[i].name;
  420. tmp.push(data[i].list[j]);
  421. }
  422. list.push(tmp), navs.push(data[i].name);
  423. }
  424. $rootScope.specsTreeNava = navs;
  425. // 表格交叉
  426. for (var i in list) {
  427. var tmp = [];
  428. for (var j in table) for (var k in list[i]) tmp.push(table[j].concat(list[i][k]));
  429. table = tmp;
  430. }
  431. // 表格合并
  432. list = angular.fromJson(angular.toJson(table));
  433. for (var i in list) {
  434. var key = [], _key = '';
  435. for (var td in list[i]) key.push(list[i][td].group + '::' + list[i][td].name);
  436. for (var td in list[i]) if (_key.length === 0) {
  437. list[i][0].key = _key = key.join(';;');
  438. list[i][0].spec_cover = $rootScope.getValue(_key, function (data) {
  439. return data.spec_cover || ''
  440. });
  441. list[i][0].sku = $rootScope.getValue(_key, function (data) {
  442. return data.sku || getRand(14, 'D')
  443. });
  444. list[i][0].virtual = $rootScope.getValue(_key, function (data) {
  445. return data.virtual || '0';
  446. });
  447. list[i][0].express = $rootScope.getValue(_key, function (data) {
  448. return data.express || '1';
  449. });
  450. list[i][0].original_price = $rootScope.getValue(_key, function (data) {
  451. return data.original_price || '0.00';
  452. });
  453. list[i][0].sell_price = $rootScope.getValue(_key, function (data) {
  454. return data.sell_price || '0.00';
  455. });
  456. list[i][0].status = $rootScope.getValue(_key, function (data) {
  457. return !!(typeof data.status !== 'undefined' ? data.status : true);
  458. });
  459. list[i][0].weight = $rootScope.getValue(_key, function (data) {
  460. return data.weight || '0.00';
  461. });
  462. list[i][0].goods_no = $rootScope.getValue(_key, function (data) {
  463. return data.goods_no || '';
  464. });
  465. }
  466. }
  467. $rootScope.specsTreeData = list;
  468. }, true);
  469. // 判断规则是否能取消选择
  470. $rootScope.checkListChecked = function (list, check) {
  471. for (var i in list) if (list[i].check) return check;
  472. return true;
  473. };
  474. // 增加整行规格分组
  475. $rootScope.addSpecRow = function (data) {
  476. data.push({name: '规格分组', list: [{name: '规格属性', check: true}]})
  477. };
  478. // 下移整行规格分组
  479. $rootScope.dnSpecRow = function (data, $index) {
  480. var tmp = [], cur = data[$index];
  481. if ($index > data.length - 2) return false;
  482. for (var i in data) {
  483. (parseInt(i) !== parseInt($index)) && tmp.push(data[i]);
  484. (parseInt(i) === parseInt($index) + 1) && tmp.push(cur);
  485. }
  486. return $rootScope.specs = tmp;
  487. };
  488. // 上移整行规格分组
  489. $rootScope.upSpecRow = function (data, $index) {
  490. var tmp = [], cur = data[$index];
  491. if ($index < 1) return false;
  492. for (var i in data) {
  493. (parseInt(i) === parseInt($index) - 1) && tmp.push(cur);
  494. (parseInt(i) !== parseInt($index)) && tmp.push(data[i]);
  495. }
  496. return $rootScope.specs = tmp;
  497. };
  498. // 移除整行规格分组
  499. $rootScope.delSpecRow = function (data, $index) {
  500. var tmp = [];
  501. for (var i in data) if (parseInt(i) !== parseInt($index)) tmp.push(data[i]);
  502. return $rootScope.specs = tmp;
  503. };
  504. // 增加分组的属性
  505. $rootScope.addSpecVal = function (list) {
  506. list.push({name: '规格属性', check: true});
  507. };
  508. // 移除分组的属性
  509. $rootScope.delSpecVal = function (data, $index) {
  510. var temp = [];
  511. for (var i in data) if (parseInt(i) !== parseInt($index)) temp.push(data[i]);
  512. return temp;
  513. };
  514. }
  515. })
  516. layui.use('element', function(){
  517. var $ = layui.jquery
  518. ,element = layui.element;
  519. var active = {
  520. tabAdd: function(){
  521. element.tabAdd('demo', {
  522. title: '新选项'+ (Math.random()*1000|0)
  523. ,content: '内容'+ (Math.random()*1000|0)
  524. ,id: new Date().getTime()
  525. })
  526. }
  527. ,tabDelete: function(othis){
  528. element.tabDelete('demo', '44');
  529. othis.addClass('layui-btn-disabled');
  530. }
  531. ,tabChange: function(){
  532. element.tabChange('demo', '22');
  533. }
  534. };
  535. $('.site-demo-active').on('click', function(){
  536. var othis = $(this), type = othis.data('type');
  537. active[type] ? active[type].call(this, othis) : '';
  538. });
  539. //Hash地址的定位
  540. var layid = location.hash.replace(/^#test=/, '');
  541. element.tabChange('test', layid);
  542. element.on('tab(test)', function(elem){
  543. location.hash = 'test='+ $(this).attr('lay-id');
  544. });
  545. });
  546. // 分类联动 start
  547. var sel_second = {:isset($vo['second_classify']) ? $vo['second_classify']:0};
  548. var sel_third = {:isset($vo['third_classify']) ? $vo['third_classify']:0};
  549. var goods_spec = {:json_encode($goods_cate)};
  550. first(1);
  551. function first(source){
  552. // 将其他选择框置空
  553. var first_key = $("select[name='first_classify']").find("option:selected").data("first_key")
  554. $("#first").val(first_key);
  555. $("select[name='second_classify']").html('');
  556. $("select[name='third_classify']").html('');
  557. // 没有下级不继续
  558. if(first_key == -1 || !("children" in goods_spec[first_key])){
  559. $("#second").val(-1);
  560. $("#third").val(-1);
  561. window.form.render();
  562. return true;
  563. }else{
  564. var second_html = '<option data-second_key="-1" selected value="0">请选择分类</option>';
  565. var to_each = goods_spec[first_key]['children'];
  566. $.each(to_each,function (ck,cv) {
  567. if(source == 1 && sel_second == cv.id){
  568. second_html +='<option selected data-second_key="'+ck+'" value="'+cv.id+'">'+cv.title+'</option>';
  569. $("#second").val(ck);
  570. }else{
  571. second_html +='<option data-second_key="'+ck+'" value="'+cv.id+'">'+cv.title+'</option>';
  572. }
  573. })
  574. $("select[name='second_classify']").html(second_html);
  575. second(source)
  576. window.form.render();
  577. }
  578. }
  579. function second(source){
  580. var first_key = $("select[name='first_classify']").find("option:selected").data("first_key");
  581. var second_key = $("select[name='second_classify']").find("option:selected").data("second_key");
  582. // 将其他选择框置空
  583. $("#second").val(second_key);
  584. $("select[name='third_classify']").html('');
  585. // 没有下级不继续
  586. if(second_key == -1 || !("children" in goods_spec[first_key]['children'][second_key])){
  587. $("#third").val(-1);
  588. window.form.render();
  589. return true;
  590. }
  591. var to_each = goods_spec[first_key]['children'][second_key]['children'];
  592. var third_html = '<option data-third_key="-1" selected value="0">请选择分类</option>';
  593. $.each(to_each,function (ck,cv) {
  594. if(source == 1 && sel_third == cv.id){
  595. third_html +='<option selected data-third_key="'+ck+'" value="'+cv.id+'">'+cv.title+'</option>';
  596. $("#third").val(ck);
  597. }else{
  598. third_html +='<option data-third_key="'+ck+'" value="'+cv.id+'">'+cv.title+'</option>';
  599. }
  600. })
  601. $("select[name='third_classify']").html(third_html);
  602. window.form.render();
  603. }
  604. // 一级分类监听
  605. form.on('select(first_classify)', function(data){
  606. var first_key = data.elem[data.elem.selectedIndex].dataset.first_key;
  607. //与之前选择的一样不处理
  608. if($("#first").val() == first_key){
  609. return true;
  610. }
  611. first(2);
  612. })
  613. // 二级分类监听
  614. form.on('select(second_classify)', function(data){
  615. var second_key = data.elem[data.elem.selectedIndex].dataset.second_key;
  616. //与之前选择的一样不处理
  617. if($("#second").val() == second_key){
  618. return true;
  619. }
  620. second(2)
  621. })
  622. // 分类end
  623. require(['ckeditor', 'angular'], function () {
  624. window.createEditor('[name="detail"]', {
  625. height: 500,
  626. });
  627. })
  628. </script>
  629. {/block}