2021-03-11 16:28:45 +08:00

481 lines
28 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{extend name="../../admin/view/main"}
{block name="content"}
{include file='shop_goods/formstyle'}
<form onsubmit="return false;" id="GoodsForm" data-auto="true" method="post" class='layui-form layui-card' autocomplete="off">
<div class="layui-card-body padding-40 padding-bottom-20">
<!--{notempty name='cates'}-->
<label class="layui-form-item block relative">
<span class="color-green font-w7 label-required-prev">所属分类</span>
<span class="color-desc margin-left-5">Category Name</span>
<select class="layui-select" name="cateids" lay-search>
{foreach $cates as $cate}{if in_array($cate.id, $cate.ids)}
<option selected value="{:arr2str($cate.ids)}">{:join(' ', $cate.names)}</option>
{else}
<option value="{:arr2str($cate.ids)}">{:join(' ', $cate.names)}</option>
{/if}{/foreach}
</select>
</label>
<!--{/notempty}-->
<!--{notempty name='marks'}-->
<div class="layui-form-item relative block">
<span class="color-green font-w7 label-required-prev">商品标签</span>
<span class="color-desc margin-left-5">Goods Mark Name</span>
<div class="layui-textarea">
{foreach $marks as $mark}{if isset($vo.marks) && is_array($vo.marks) && in_array($mark, $vo.marks)}
<input checked type="checkbox" name="marks[]" value="{$mark}" title="{$mark}">
{else}
<input type="checkbox" name="marks[]" value="{$mark}" title="{$mark}">
{/if}{/foreach}
</div>
</div>
<!--{/notempty}-->
<!--{notempty name='payments'}-->
<div class="layui-form-item relative block">
<span class="color-green font-w7 label-required-prev">支付方式</span>
<span class="color-desc margin-left-5">Goods Pyament Name</span>
<div class="layui-textarea">
{foreach $payments as $payment}{if isset($vo.payment) && is_array($vo.payment) && in_array($payment.code, $vo.payment)}
<input checked type="checkbox" name="payment[]" value="{$payment.code}" title="{$payment.name}">
{else}
<input type="checkbox" name="payment[]" value="{$payment.code}" title="{$payment.name}">
{/if}{/foreach}
</div>
</div>
<!--{/notempty}-->
<label class="layui-form-item block relative">
<span class="color-green font-w7">商品名称</span>
<span class="color-desc margin-left-5">Goods Name</span>
<input name="name" required class="layui-input" placeholder="请输入商品名称" value="{$vo.name|default=''}">
</label>
{notempty name='trucks'}
<label class="layui-form-item block relative">
<span class="color-green font-w7 label-required-prev">邮费模板</span>
<span class="color-desc margin-left-5">Truck Template</span>
<select class="layui-select" name="truck_code" lay-search>
<option value="">--- ---</option>
{foreach $trucks as $truck}{if isset($vo.truck_code) and $vo.truck_code eq $truck.code}
<option selected value="{$truck.code}">{$truck.code} - {$truck.name|default=''}</option>
{else}
<option value="{$truck.code}">{$truck.code} - {$truck.name|default=''}</option>
{/if}{/foreach}
</select>
</label>
{/notempty}
<div class="layui-form-item">
<span class="color-green font-w7 label-required-prev">商品封面及轮播图片</span>
<span class="color-desc margin-left-5">Cover and Carousel Pictures</span>
<table class="layui-table">
<thead>
<tr>
<th style="width:90px" class="text-center">商品封面</th>
<th style="width:auto" class="text-left">轮播图片</th>
</tr>
<tr>
<td class="text-center">
<input name="cover" type="hidden" value="{$vo.cover|default=''}">
<script>$('[name="cover"]').uploadOneImage();</script>
</td>
<td class="text-left">
<input name="slider" type="hidden" value="{$vo.slider|default=''}">
<script>$('[name="slider"]').uploadMultipleImage();</script>
</td>
</tr>
</thead>
</table>
</div>
<div class="goods-item-box">
<div class="layui-clear">
<fieldset>
<legend><span class="layui-badge think-bg-violet">商品返利配置</span></legend>
<div class="layui-form-item">
{foreach ['非返利商品,其代理不会获得奖励','是返利商品,其代理将会获得奖励'] as $k => $v}
{if (isset($vo.rebate_type) and $vo.rebate_type eq $k) or (empty($vo.rebate_type) and $k eq 0)}
<input type="radio" name="rebate_type" value="{$k}" title="{$v}" checked>
{else}
<input type="radio" name="rebate_type" value="{$k}" title="{$v}">
{/if}{/foreach}
</div>
</fieldset>
<fieldset>
<legend><span class="layui-badge think-bg-violet">入会礼包配置</span></legend>
<div class="layui-form-item">
{foreach ['非入会礼包,购买后不会升级等级','是入会礼包,购买后升级会员级别'] as $k=>$v}
{if (isset($vo.vip_entry) and $vo.vip_entry eq $k) or (empty($vo.vip_entry) and $k eq 0)}
<input type="radio" name="vip_entry" value="{$k}" title="{$v}" checked lay-filter="vip_entry">
{else}
<input type="radio" name="vip_entry" value="{$k}" title="{$v}" lay-filter="vip_entry">
{/if}{/foreach}
</div>
</fieldset>
<!--{notempty name='upgrades'}-->
<fieldset>
<legend><span class="layui-badge think-bg-violet">升级用户级别</span></legend>
<label class="layui-form-item">
<select name="vip_upgrade" class="layui-select" lay-filter="vip_upgrade">
{foreach $upgrades as $upgrade}{if isset($vo.vip_upgrade) and $vo.vip_upgrade eq $upgrade.number}
<option selected value="{$upgrade.number|default=0}">[ {$upgrade.number|default='0'} ] {$upgrade.name|default=''}</option>
{else}
<option value="{$upgrade.number|default=0}">[ {$upgrade.number|default='0'} ] {$upgrade.name|default=''}</option>
{/if}{/foreach}
</select>
<span class="help-block">购买此商品用户可直接升级至此等级!</span>
</label>
</fieldset>
<!--{/notempty}-->
</div>
<div class="layui-clear">
<fieldset>
<legend><span class="layui-badge think-bg-violet">物流配送发货类型</span></legend>
<div class="layui-form-item">
{foreach ['虚拟商品,无需物流配送','实物商品,需要物流配送'] as $k=>$v}
{if (isset($vo.truck_type) and $vo.truck_type eq $k) or (empty($vo.truck_type) and $k eq 0)}
<input type="radio" name="truck_type" value="{$k}" title="{$v}" checked>
{else}
<input type="radio" name="truck_type" value="{$k}" title="{$v}">
{/if}{/foreach}
</div>
</fieldset>
<!--{notempty name='discounts'}-->
<fieldset>
<legend><span class="layui-badge think-bg-violet">用户购买折扣方案</span></legend>
<label class="layui-form-item">
<select name="discount_id" class="layui-select" lay-search>
<option value="0"> -- 不设置 --</option>
{foreach $discounts as $discount}{if isset($vo.discount_id) and $vo.discount_id eq $discount.id}
<option selected value="{$discount.id|default=0}">{$discount.name|default='0'}</option>
{else}
<option value="{$discount.id|default=0}">{$discount.name|default='0'}</option>
{/if}{/foreach}
</select>
<span class="help-block">当用户等级达到指定等级后可享有折扣!</span>
</label>
</fieldset>
<!--{/notempty}-->
<!--{notempty name='upgrades'}-->
<fieldset>
<legend><span class="layui-badge think-bg-violet">限制最低购买等级</span></legend>
<label class="layui-form-item">
<select name="limit_low_vip" class="layui-select">
<option value="0"> -- 不设置 --</option>
{foreach $upgrades as $upgrade}{if isset($vo.limit_low_vip) and $vo.limit_low_vip eq $upgrade.number}
<option selected value="{$upgrade.number|default=0}">[ {$upgrade.number|default='0'} ] {$upgrade.name|default=''}</option>
{else}
<option value="{$upgrade.number|default=0}">[ {$upgrade.number|default='0'} ] {$upgrade.name|default=''}</option>
{/if}{/foreach}
</select>
<span class="help-block">限制此等级及低于此等级的用户不能购买!</span>
</label>
</fieldset>
<!--{/notempty}-->
<fieldset>
<legend><span class="layui-badge think-bg-violet">商品限购数量</span></legend>
<label class="layui-form-item">
<input class="layui-input" data-blur-number="0" name="limit_max_num" value="{$vo.limit_max_num|default=0}" placeholder="请输入商品限购数量">
<span class="help-block">限制每人可购买数量(为 0 时不限制)!</span>
</label>
</fieldset>
</div>
</div>
<div class="layui-form-item">
<span class="color-green font-w7 label-required-prev">商品规格及商品SKU绑定<span class="color-red font-s12">(规格填写后不允许再次修改)</span></span>
<div ng-repeat="x in specs track by $index" style="display:none" class="margin-bottom-10" ng-class="{true:'layui-show'}[mode==='add'&&specs.length>0]">
<div class="goods-spec-box padding-10 margin-0 relative" style="background:#ddd">
<span class="text-center goods-spec-name">分组</span>
<label class="label-required-null inline-block">
<input ng-blur="x.name=trimSpace(x.name)" ng-model="x.name" required placeholder="请输入分组名称">
</label>
<div class="pull-right">
<a class="layui-btn layui-btn-sm layui-btn-primary goods-spec-btn" ng-click="addSpecVal(x.list)">增加</a>
<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>
<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>
<a class="layui-btn layui-btn-sm layui-btn-primary goods-spec-btn" ng-click="delSpecRow(specs,$index)" ng-if="specs.length>1">删除</a>
</div>
</div>
<div class="goods-spec-box padding-10 margin-0 layui-bg-gray block relative" ng-if="x.list && x.list.length > 0">
<label class="label-required-null inline-block margin-right-10 margin-bottom-5 relative nowrap" ng-repeat="xx in x.list">
<input type="checkbox" lay-ignore ng-model="xx.check" ng-click="xx.check=checkListChecked(x.list,$event.target.checked)">
<input type="text" ng-blur="xx.name=trimSpace(xx.name)" ng-model="xx.name" ng-keyup="xx.name=$event.target.value" required placeholder="请输入规格">
<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>
</label>
</div>
</div>
<div ng-if="mode==='add'">
<a ng-if="specs.length<3" class="layui-btn layui-btn-sm layui-btn-primary" ng-click="addSpecRow(specs)">增加规则分组</a>
<p class="margin-top-10"><span class="color-red">请完成属性修改后再编辑下面的规格信息,否则规格数据会丢失!</span></p>
</div>
<table class="layui-table margin-top-10">
<thead>
<tr>
<th ng-repeat="x in navas track by $index" class="nowrap" ng-bind="x"></th>
<th width="12%" class="text-center nowrap">商品SKU <a ng-click="batchSet('sku',null)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="10%" class="text-center nowrap">市场价格 <a ng-click="batchSet('market',2)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="10%" class="text-center nowrap">销售价格 <a ng-click="batchSet('selling',2)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="10%" class="text-center nowrap">奖励余额 <a ng-click="batchSet('balance',2)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="10%" class="text-center nowrap layui-hide">奖励积分 <a ng-click="batchSet('integral',0)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="10%" class="text-center nowrap">虚拟销量 <a ng-click="batchSet('virtual',0)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="10%" class="text-center nowrap">快递计件 <a ng-click="batchSet('express',0)" data-tips-text="批量设置" class="layui-icon">&#xe63c;</a></th>
<th width="08%" class="text-center nowrap">销售状态</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="rows in items track by $index">
<td class="layui-bg-gray nowrap" ng-if="td.show" ng-repeat="td in rows" ng-bind="td.name"></td>
<td class="padding-0">
<label class="padding-0 margin-0">
<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">
</label>
</td>
<td class="padding-0">
<label class="padding-0 margin-0">
<input ng-blur="rows[0].market=setValue(rows[0].key,'market',$event.target.value,'(parseFloat(_)||0).toFixed(2)')" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].market">
</label>
</td>
<td class="padding-0">
<label class="padding-0 margin-0">
<input ng-blur="rows[0].selling=setValue(rows[0].key,'selling',$event.target.value,'(parseFloat(_)||0).toFixed(2)')" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].selling">
</label>
</td>
<td class="padding-0">
<label class="padding-0 margin-0">
<input ng-blur="rows[0].balance=setValue(rows[0].key,'balance',$event.target.value,'(parseFloat(_)||0).toFixed(2)')" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].balance">
</label>
</td>
<td class="padding-0 layui-hide">
<label class="padding-0 margin-0">
<input ng-blur="rows[0].integral=setValue(rows[0].key,'integral',$event.target.value,'(parseInt(_)||0)')" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].integral">
</label>
</td>
<td class="padding-0">
<label class="padding-0 margin-0">
<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">
</label>
</td>
<td class="padding-0">
<label class="padding-0 margin-0">
<input ng-blur="rows[0].express=setValue(rows[0].key,'express',$event.target.value,'(parseInt(_)||0)')" class="layui-input border-0 padding-left-0 text-center" ng-model="rows[0].express">
</label>
</td>
<td class="text-center layui-bg-gray">
<label class="think-checkbox margin-0 full-width full-height block">
<input lay-ignore type="checkbox" ng-model="rows[0].status">
</label>
</td>
</tr>
</tbody>
</table>
<p class="color-desc">请注意商品的SKU尽量不要重复也不能产生订单后再修改否则会造成订单数据无法关联</p>
<label class="layui-hide">
<textarea class="layui-textarea" name="data_specs">{{specs}}</textarea>
<textarea class="layui-textarea" name="data_items">{{items}}</textarea>
</label>
</div>
<label class="layui-form-item block">
<span class="font-w7 color-green">商品简介描述</span>
<textarea class="layui-textarea" placeholder="请输入商品简介描述" name="remarks">{$vo.remarks|default=''|raw}</textarea>
</label>
<div class="layui-form-item block">
<span class="label-required-prev font-w7 color-green">商品富文本详情</span>
<textarea name="content" class="layui-hide">{$vo.content|default=''|raw}</textarea>
</div>
<div class="hr-line-dashed margin-top-40"></div>
{notempty name='vo.code'}<input type="hidden" name="code" value="{$vo.code}">{/notempty}
<div class="layui-form-item text-center">
<button class="layui-btn layui-btn-danger" ng-click="pageBack()" type="button">取消编辑</button>
<button class="layui-btn" type="submit">保存商品</button>
</div>
</div>
</form>
{/block}
{block name='script'}
<label class="layui-hide">
<textarea id="GoodsSpecs">{$vo.data_specs|raw|default=''}</textarea>
<textarea id="GoodsItems">{$vo.data_items|raw|default=''}</textarea>
</label>
<script>
/*! 表单初始化 */
window.form.render();
/*! 入会礼包切换 */
window.form.on('radio(vip_entry)', setVipEntry);
setVipEntry({value: ('{$vo.vip_entry|default="0"}')});
function setVipEntry(data, $input) {
$input = $('select[name="vip_upgrade"]');
if (parseInt(data.value)) {
$input.removeClass('layui-disabled').removeAttr('disabled');
} else {
$input.addClass('layui-disabled').attr('disabled', 'disabled');
}
layui.form.render();
}
/*! 加载扩展插件 */
require(['ckeditor', 'angular'], function () {
window.createEditor('[name="content"]', {height: 500});
var app = angular.module("GoodsForm", []).run(callback);
angular.bootstrap(document.getElementById(app.name), [app.name]);
function getRand(length, prefix) {
return (function (time, code) {
code += parseInt(time.substr(0, 1)) + parseInt(time.substr(1, 1)) + time.substr(2, 8);
while (code.length < length) code += Math.round(Math.random() * 10);
return code;
})(Date.now().toString(), prefix || '' + '')
}
function callback($rootScope) {
$rootScope.mode = '{$mode|default="add"}', $rootScope.navas = [];
$rootScope.items = angular.fromJson(angular.element('#GoodsItems').val() || '[]') || {};
$rootScope.cache = angular.fromJson(angular.element('#GoodsItems').val() || '[]') || {};
$rootScope.specs = angular.fromJson(angular.element('#GoodsSpecs').val() || '[{"name":"默认分组","list":[{"name":"默认规格","check":true}]}]');
/*! 批量设置数值 */
$rootScope.batchSet = function (name, fixed) {
layer.prompt({title: '请输入数值', formType: 0}, function (value, index) {
layer.close(index), $rootScope.$apply(function () {
if (fixed !== null) value = (parseFloat(value) || 0).toFixed(fixed);
$rootScope.items.forEach(function (rows) {
rows.forEach(function (item) {
item[name] = value;
});
});
});
});
};
$rootScope.pageBack = function () {
$.msg.confirm('确定要取消编辑吗?', function (index) {
history.back(), $.msg.close(index);
});
};
$rootScope.setValue = function (key, name, value, callback) {
$rootScope.items[key] = $rootScope.items[key] || {};
$rootScope.cache[key] = $rootScope.cache[key] || {};
if (typeof callback === 'string' && callback.indexOf('_') > -1) {
value = eval(callback.replace('_', "'" + value + "'"));
}
return $rootScope.cache[key][name] = $rootScope.items[key][name] = value;
};
$rootScope.getValue = function (key, name, value) {
var cache = $rootScope.cache[key] || {};
if (typeof cache[name] === 'undefined') {
$rootScope.setValue(key, name, value, '_')
cache = $rootScope.cache[key] || {};
}
return cache[name];
};
/*! 去除空白字符 */
$rootScope.trimSpace = function (value) {
return (value + '').replace(/\s*/ig, '');
};
/*! 当前商品规格发生变化时重新计算规格列表 */
$rootScope.$watch('specs', function () {
var data = [], navs = [], table = [[]];
$rootScope.specs.forEach(function (spec) {
var temp = [];
spec.list.forEach(function (item) {
if (item.check && item.name.length > 0) {
item.show = true, item.group = spec.name;
temp.push(item);
}
});
data.push(temp), navs.push(spec.name);
});
$rootScope.navas = navs;
/*! 表格交叉 */
data.forEach(function (rows) {
var temp = [];
table.forEach(function (line) {
rows.forEach(function (item) {
temp.push(line.concat(item));
});
});
table = temp;
});
/*! 表格数据 */
data = angular.fromJson(angular.toJson(table));
data.forEach(function (rows) {
var keys = [];
rows.forEach(function (item) {
keys.push(item.group + '::' + item.name);
}), rows.every(function (item) {
item.key = keys.join(';;');
item.sku = $rootScope.getValue(item.key, 'sku', getRand(14, 'S'));
item.status = !!$rootScope.getValue(item.key, 'status', 1);
item.market = $rootScope.getValue(item.key, 'market', '0.00');
item.balance = $rootScope.getValue(item.key, 'balance', '0.00');
item.selling = $rootScope.getValue(item.key, 'selling', '0.00');
item.integral = $rootScope.getValue(item.key, 'integral', '0');
item.express = $rootScope.getValue(item.key, 'express', '1');
item.virtual = $rootScope.getValue(item.key, 'virtual', '0');
return false;
});
});
$rootScope.items = data;
}, true);
/*! 判断规则是否能取消选择 */
$rootScope.checkListChecked = function (data, check) {
for (var i in data) if (data[i].check) return check;
return true;
};
/*! 增加整行规格分组 */
$rootScope.addSpecRow = function (data) {
data.push({name: '规格分组' + data.length, list: [{name: '规格属性', check: true}]})
};
/*! 下移整行规格分组 */
$rootScope.dnSpecRow = function (data, $index) {
var temp = [], self = data[$index];
if ($index > data.length - 2) return false;
data.forEach(function (item, index) {
if (parseInt(index) !== parseInt($index)) temp.push(item);
if (parseInt(index) === parseInt($index) + 1) temp.push(self);
});
return $rootScope.specs = temp;
};
/*! 上移整行规格分组 */
$rootScope.upSpecRow = function (data, $index) {
var temp = [], self = data[$index];
if ($index < 1) return false;
data.forEach(function (item, index) {
if (parseInt(index) === parseInt($index) - 1) temp.push(self);
if (parseInt(index) !== parseInt($index)) temp.push(item);
});
return $rootScope.specs = temp;
};
/*! 移除整行规格分组 */
$rootScope.delSpecRow = function (data, $index) {
var temp = [];
data.forEach(function (item, index) {
if (parseInt(index) !== parseInt($index)) temp.push(item);
});
return $rootScope.specs = temp;
};
/*! 增加分组的属性 */
$rootScope.addSpecVal = function (data) {
data.push({name: '规格属性' + data.length, check: true});
};
/*! 移除分组的属性 */
$rootScope.delSpecVal = function (data, $index) {
var temp = [];
data.forEach(function (item, index) {
if (parseInt(index) !== parseInt($index)) temp.push(item);
});
return temp;
};
}
});
</script>
{/block}