初始上传

This commit is contained in:
2026-04-04 17:27:12 +08:00
parent 4d80d28eb4
commit b7e11774ee
11191 changed files with 1588469 additions and 0 deletions

View File

@@ -0,0 +1,914 @@
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css?time=20250527" />
<div class="layui-form">
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
<ul class="layui-tab-title">
<li class="layu1i-this" lay-id="basic">基础设置</li>
<li lay-id="price-stock">价格库存</li>
<li lay-id="detail">商品详情</li>
<li lay-id="attr">商品参数</li>
<li lay-id="senior">高级设置</li>
</ul>
<div class="layui-tab-content">
<!-- 基础设置 -->
<div class="layui-tab-item layui-show">
<!-- 商品类型 -->
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">商品类型</span>
</div>
<div class="layui-card-body commodity-type-box" >
{foreach name="all_goodsclass" item="vo"}
<div class="commodity-type-item {if $vo.goods_class eq $goods_class.id}border-color{/if}" onclick="location.hash = ns.hash('{$vo.add_url}')">
<span>{$vo.goods_class_name}</span>
<span>{$vo.is_virtual ? '(无需物流)' : '(需要物流)'}</span>
</div>
{/foreach}
</div>
</div>
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">基础信息</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item" id="add_goods_name">
<label class="layui-form-label"><span class="required">*</span>商品名称:</label>
<div class="layui-input-inline">
<input name="goods_name" type="text" id="goods_name" placeholder="请输入商品名称不能超过60个字符" maxlength="60" autocomplete="off" lay-verify="goods_name" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">促销语:</label>
<div class="layui-input-inline">
<textarea class="layui-textarea len-long" name="introduction" maxlength="100" lay-verify="introduction" placeholder="请输入促销语不能超过100个字符"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">关键词:</label>
<div class="layui-input-block">
<input type="text" name="keywords" id="keywords" placeholder="商品关键词用于SEO搜索不能超过100个字符" maxlength="100" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item goods-image-wrap">
<label class="layui-form-label"><span class="required">*</span>商品主图:</label>
<div class="layui-input-block">
<!--商品主图项-->
<div class="js-goods-image"></div>
</div>
<div class="word-aux">第一张图片将作为商品主图,支持同时上传多张图片,多张图片之间可随意调整位置;</div>
<div class="word-aux">支持jpg、gif、png格式上传或从图片空间中选择建议使用尺寸800x800像素以上、大小不超过1M的正方形图片</div>
<div class="word-aux">上传后的图片将会自动保存在图片空间的默认分类中最多上传10张至少1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品视频:</label>
<div class="layui-input-block">
<div class="video-thumb">
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
</div>
<div id="videoUpload2" class="up-video " title="商品视频" >
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
<span class=" replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="video_url" placeholder="在此输入外链视频地址" autocomplete="off" class="layui-input len-long">
</div>
<div class="file-title word-aux">
<div>注意事项:</div>
<ul>
<li>1、检查upload文件夹是否有读写权限。</li>
<li>2、PHP默认上传限制为2MB需要在php.ini配置文件中修改“post_max_size”和“upload_max_filesize”的大小。</li>
<li>3、视频支持手动输入外链视频地址或者上传本地视频文件</li>
<li>4、必须上传.mp4视频格式</li>
<li>5、视频文件大小不能超过500MB</li>
</ul>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品品牌:</label>
<div class="layui-input-inline">
<select name="brand_id" lay-search="" lay-filter="brand_id">
<option value=""></option>
{foreach name="$brand_list" item="vo"}
<option value="{$vo['brand_id']}">{$vo['brand_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品标签:</label>
<div class="layui-input-inline">
<select name="label_id" lay-search="" lay-verify="label_id">
<option value="">请选择商品标签</option>
{foreach name="$label_list" item="vo"}
<option value="{$vo['id']}">{$vo['label_name']}</option>
{/foreach}
</select>
</div>
</div>
{notempty name="$service_list"}
<div class="layui-form-item">
<label class="layui-form-label">商品服务:</label>
<div class="layui-input-block">
{foreach name="$service_list" item="vo"}
<input type="checkbox" name="goods_service_ids" value="{$vo.id}" title="{$vo.service_name}" lay-skin="primary">
{/foreach}
</div>
</div>
{/notempty}
<div class="layui-form-item goods-category-wrap">
<label class="layui-form-label"><span class="required">*</span>商品分类:</label>
<div class="layui-input-block" id="category_select_box">
</div>
<input type="hidden" lay-verify="category_id"/>
<div class="word-aux">商品可以属于多个分类最多10个</div>
</div>
{if $is_install_supply}
<div class="layui-form-item">
<label class="layui-form-label">供应商:</label>
<div class="layui-input-inline">
<select name="supplier_id" lay-search="" lay-verify="supplier_id">
<option value="">请选择供应商</option>
{foreach name="$supplier_list" item="vo"}
<option value="{$vo['supplier_id']}">{$vo['title']}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="layui-form-item goods_state">
<label class="layui-form-label"><span class="required">*</span>是否上架:</label>
<div class="layui-input-block">
<input type="radio" name="goods_state" value="1" title="立刻上架" checked lay-filter="goods_state">
<input type="radio" name="goods_state" value="0" title="放入仓库" lay-filter="goods_state">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">定时下架:</label>
<div class="layui-input-block">
<input type="radio" name="timer_off_status" value="1" title="启用" lay-filter="timer_off">
<input type="radio" name="timer_off_status" value="2" title="不启用" lay-filter="timer_off" checked>
</div>
<div class="word-aux">启用定时下架后,到达设定时间,此商品将自动下架。</div>
</div>
<div class="layui-form-item timer_off" style="display: none;">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_off" name="timer_off" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{if addon_is_exit('cashier') == 1}
<div class="layui-form-item">
<label class="layui-form-label">销售渠道:</label>
<div class="layui-input-block">
<input type="radio" name="sale_channel" value="all" title="线上线下销售" checked>
<input type="radio" name="sale_channel" value="online" title="线上销售">
<input type="radio" name="sale_channel" value="offline" title="线下销售">
</div>
</div>
{/if}
{if $store_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">适用门店:</label>
<div class="layui-input-block">
<input type="radio" name="sale_store" value="all" title="全部门店" checked lay-filter="sale_store">
<input type="radio" name="sale_store" value="" title="部分门店" lay-filter="sale_store">
</div>
</div>
<div class="layui-form-item sale-store-select" style="display: none" lay-verify="sale_store">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn select-store">选择门店</button>
<div style="width: 700px">
<table class="layui-table" lay-skin="nob">
<colgroup>
<col width="30%">
<col width="60%">
<col width="10%">
</colgroup>
<tr>
<th>门店名称</th>
<th>门店地址</th>
<th>操作</th>
</tr>
<tbody class="sale-store"></tbody>
</table>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否统一售价:</label>
<div class="layui-input-block">
<input type="radio" name="is_unify_price" value="1" title="是" checked >
<input type="radio" name="is_unify_price" value="0" title="否" >
</div>
<div class="word-aux">价格设置之后门店不能修改价格,门店按照平台设置的价格售卖</div>
</div>
{/if}
</div>
</div>
<!-- 配送信息 -->
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">配送信息</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item" lay-verify="express_type">
<label class="layui-form-label">配送方式:</label>
<div class="layui-input-block">
{notempty name="$express_type"}
{foreach name="$express_type" item="vo" key="key"}
<input type="checkbox" name="support_trade_type" value="{$key}" title="{$vo.name}" lay-skin="primary" checked lay-filter="support_trade_type">
{/foreach}
{else/}
<a href="{:href_url('shop/delivery/express')}" class="text-color">未配置配送方式,请先配置配送方式</a>
{/notempty}
</div>
{notempty name="$express_type"}<div class="word-aux"><a href="{:href_url('shop/delivery/express')}" target="_blank" class="text-color">配送方式管理</a></div>{/notempty}
</div>
<div class="trade-type express" {if empty($express_type)}style="display:none;"{/if}>
<div class="layui-form-item">
<label class="layui-form-label">是否免邮:</label>
<div class="layui-input-block">
<input type="radio" name="is_free_shipping" value="1" title="是" lay-filter="is_free_shipping" checked>
<input type="radio" name="is_free_shipping" value="0" title="否" lay-filter="is_free_shipping">
</div>
</div>
<div class="layui-form-item js-shipping-template">
<label class="layui-form-label">运费模板:</label>
<div class="layui-input-inline">
<select name="shipping_template" lay-search="" lay-verify="shipping_template">
<option value="">请选择运费模板</option>
{foreach name="$express_template_list" item="vo"}
<option value="{$vo['template_id']}">{$vo['template_name']}</option>
{/foreach}
</select>
</div>
<div class="layui-input-inline">
<a class="text-color delivery-caozuo delivery-refresh">刷新</a>
<a class="default text-color" href="{:href_url('shop/express/addtemplate')}" target="_blank">新建</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 价格库存 -->
<div class="layui-tab-item">
<div class="layui-form-item">
<label class="layui-form-label">启用多规格:</label>
<div class="layui-input-inline">
<input type="checkbox" value="1" lay-skin="switch" name="spec_type" lay-filter="spec_type" lay-verify="spec_type">
<input type="hidden" id="spec_type_status" value="0">
</div>
</div>
<!-- 单规格 -->
<div class="js-single-spec">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>销售价:</label>
<div class="layui-input-block">
<input type="text" name="price" placeholder="0.00" lay-verify="price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">商品没有相关优惠活动的实际卖价</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">划线价:</label>
<div class="layui-input-block">
<input type="text" name="market_price" placeholder="0.00" lay-verify="market_price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">商品没有优惠活动显示的划线价格,如果商品有折扣等优惠活动划线价显示销售价</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">成本价:</label>
<div class="layui-input-block">
<input type="text" name="cost_price" placeholder="0.00" class="layui-input len-short" lay-verify="cost_price" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">成本价将不会对前台会员展示,用于商家统计使用</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">重量:</label>
<div class="layui-input-block">
<input type="text" name="weight" placeholder="0.00" class="layui-input len-short" lay-verify="weight" autocomplete="off">
<div class="layui-form-mid">kg</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">体积:</label>
<div class="layui-input-block">
<input type="text" name="volume" placeholder="0.00" class="layui-input len-short" lay-verify="volume" autocomplete="off">
<div class="layui-form-mid">m3</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品编码:</label>
<div class="layui-input-block">
<input type="text" name="sku_no" placeholder="请输入商品编码" maxlength="50" class="layui-input len-long" autocomplete="off">
</div>
<div class="word-aux">多个编码以英文逗号分割</div>
</div>
</div>
<!-- 多规格 -->
<div class="js-more-spec">
<!--规格项/规格值-->
<div class="spec-edit-list"></div>
<div class="layui-form-item js-add-spec">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<button class="layui-btn" type="button">添加规格</button>
</div>
</div>
<div class="layui-form-item batch-operation-sku">
<label class="layui-form-label">批量操作:</label>
<div class="layui-input-inline">
<span class="text-color sku_image" data-field="sku_images">SKU图片</span>
<span class="text-color" data-field="spec_name">副标题</span>
<span class="text-color" data-field="price" data-verify="price">销售价</span>
<span class="text-color" data-field="market_price" data-verify="market_price">划线价</span>
<span class="text-color" data-field="cost_price" data-verify="cost_price">成本价</span>
<span class="text-color" data-field="stock" data-verify="stock">库存</span>
<span class="text-color" data-field="stock_alarm" data-verify="stock_alarm">库存预警</span>
<span class="text-color" data-field="weight" data-verify="weight">重量(kg)</span>
<span class="text-color" data-field="volume" data-verify="volume">体积(m³)</span>
<span class="text-color" data-field="sku_no" data-verify="">商品编码</span>
<div class="layui-inline select_spec_value" style="float:left;display: none"></div>
<input type="text" class="layui-input len-short" name="batch_operation_sku" autocomplete="off" />
<button class="layui-btn confirm" type="button">确定</button>
<button class="layui-btn layui-btn-primary cancel" type="button">取消</button>
<div id="batch_set_sku_image" class="batch-set-sku-image" style="clear: both;display: none;"></div>
</div>
</div>
<!--sku列表-->
<div class="layui-form-item sku-table">
<label class="layui-form-label"></label>
<div class="layui-input-block"></div>
</div>
</div>
<div class="layui-form-item js-goods-stock-wrap">
<label class="layui-form-label"><span class="required">*</span>库存:</label>
<div class="layui-input-block">
<input type="number" name="goods_stock" placeholder="0" lay-verify="goods_stock" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
</div>
<div class="layui-form-item js-goods-stock-wrap">
<label class="layui-form-label">库存预警:</label>
<div class="layui-input-block">
<input type="number" name="goods_stock_alarm" placeholder="0" lay-verify="goods_stock_alarm" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">商品库存少于等于预警数量商品列表库存数量标红显示0为不预警。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品单位:</label>
<div class="layui-input-block">
<input type="text" name="unit" placeholder="请输入商品单位" autocomplete="off" class="layui-input len-short">
</div>
</div>
<div class="layui-form-item ">
<label class="layui-form-label">虚拟销量:</label>
<div class="layui-input-block">
<input type="number" name="virtual_sale" placeholder="0" lay-verify="virtual_sale" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">该设置不计入商品统计数据</div>
</div>
<div class="layui-form-item is_limit">
<label class="layui-form-label">是否限购:</label>
<div class="layui-input-block">
<input type="radio" name="is_limit" value="0" title="否" lay-filter="is_limit" checked>
<input type="radio" name="is_limit" value="1" title="是" lay-filter="is_limit">
</div>
<div class="word-aux">启用限购后,购买商品时,会对该商品购买量做限制判断。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">起售:</label>
<div class="layui-input-block">
<input type="number" name="min_buy" placeholder="" lay-verify="min_buy" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">起售数量超出商品库存时,买家无法购买该商品</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">会员等级折扣:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="is_consume_discount" value="1" title="参与" checked>
<input type="radio" name="is_consume_discount" value="0" title="不参与">
</div>
</div>
<div class="word-aux">按照默认会员等级折扣优惠</div>
</div>
</div>
<!-- 商品详情 -->
<div class="layui-tab-item">
<div class="layui-form-item">
<label class="layui-form-label sm"></label>
<div class="layui-input-inline special-length">
<script id="editor" type="text/plain" style="width:100%;height:500px;"></script>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
</div>
<!-- 商品参数 -->
<div class="layui-tab-item">
<div class="layui-form-item">
<label class="layui-form-label">商品参数模板:</label>
<div class="layui-input-block len-mid">
<select name="goods_attr_class" lay-search="" lay-filter="goods_attr_class">
<option value="">请选择商品参数模板</option>
{foreach name="$attr_class_list" item="vo"}
<option value="{$vo['class_id']}">{$vo['class_name']}</option>
{/foreach}
</select>
<input type="hidden" name="goods_attr_name" />
</div>
<div class="word-aux">商品可以添加自定义商品参数,也可以通过参数模板批量设置商品参数</div>
</div>
<div class="layui-form-item js-new-attr-list">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<div class="layui-form">
<table class="layui-table">
<colgroup>
<col width="30%" />
<col width="40%" />
<col width="20%" />
<col width="10%" />
</colgroup>
<thead>
<tr>
<th>参数名</th>
<th>参数</th>
<th class="prompt-block">
排序
<div class="prompt">
<i class="iconfont iconwenhao1 required growth"></i>
<div class="growth-box reason-box reason-growth prompt-box">
<div class="prompt-con">设置排序,改变商品规格展示顺序</div>
</div>
</div>
</th>
<th>操作</th>
</tr>
</thead>
<tbody class="attr-new">
<tr class="null-data">
<td colspan="4" align="center">无数据</td>
</tr>
</tbody>
</table>
</div>
<button class="layui-btn layui-btn-primary" onclick="addNewAttr()">添加商品参数</button>
</div>
</div>
</div>
<!-- 高级设置 -->
<div class="layui-tab-item card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">高级设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="number" name="sort" class="layui-input len-short" value="{$sort_config['default_value']}" placeholder="0" autocomplete="off">
</div>
<div class="word-aux">商品默认排序号为0数字越大排序越靠前数字重复则最新添加的靠前。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品详情显示库存:</label>
<div class="layui-input-block">
<input type="radio" name="stock_show" value="1" title="显示" checked >
<input type="radio" name="stock_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品详情显示销量:</label>
<div class="layui-input-block">
<input type="radio" name="sale_show" value="1" title="显示" checked>
<input type="radio" name="sale_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">划线价显示:</label>
<div class="layui-input-block">
<input type="radio" name="market_price_show" value="1" title="显示" checked>
<input type="radio" name="market_price_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品详情显示弹幕:</label>
<div class="layui-input-block">
<input type="radio" name="barrage_show" value="1" title="显示" checked>
<input type="radio" name="barrage_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品海报:</label>
<div class="layui-input-block len-mid">
<select name="template_id" lay-search lay-verify="">
<option value="">请选择商品海报</option>
{foreach name="$poster_list" item="vo"}
<option value="{$vo['template_id']}">{$vo['poster_name']}</option>
{/foreach}
</select>
</div>
</div>
{if $form_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">商品表单:</label>
<div class="layui-input-block len-mid">
<select name="form_id">
<option value="0">请选择商品表单</option>
{foreach name="$form_list" item="vo"}
<option value="{$vo.id}">{$vo.form_name}</option>
{/foreach}
</select>
</div>
<div class="word-aux">
<a href="{:href_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建商品表单</a>
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
</div>
</div>
{/if}
</div>
</div>
</div>
</div>
<div class="fixed-btn">
<button class="layui-btn layui-btn-primary border-color text-color js-prev" lay-filter="prev">上一步</button>
<button class="layui-btn js-save" lay-submit="" lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary border-color text-color js-next" lay-submit="" lay-filter="next">下一步</button>
</div>
</div>
<!--选择商品分类-->
<script type="text/html" id="selectedCategory">
<div class="category-list">
<div class="item">
<!--后续做搜索-->
<ul>
{foreach name="$goods_category_list" item="vo"}
{{# if(d.category_id_1 == '{$vo['category_id']}' ){ }}
<li data-category-id="{$vo['category_id']}" data-commission-rate="{$vo['commission_rate']}" data-level="{$vo['level']}" class="selected">
{{# }else{ }}
<li data-category-id="{$vo['category_id']}" data-commission-rate="{$vo['commission_rate']}" data-level="{$vo['level']}">
{{# } }}
<span class="category-name">{$vo['category_name']}</span>
<span class="right-arrow"></span>
</li>
{/foreach}
</ul>
</div>
<div class="item" data-level="2">
<!--后续做搜索-->
<ul></ul>
</div>
<div class="item" data-level="3">
<!--后续做搜索-->
<ul></ul>
</div>
</div>
<div class="selected-category-wrap">
<label>您当前选择的是</label>
<span class="js-selected-category"></span>
</div>
</script>
<!-- 运费模板 -->
<script type="text/html" id="deliveryHtml">
<option value="">请选择运费模板</option>
{{# for(var i=0;i<d.list.length;i++){ }}
<option value="{{d.list[i].template_id}}" {{# if(d.shipping_template == d.list[i].template_id){ }}selected{{# } }}>{{d.list[i].template_name}}</option>
{{# } }}
</script>
<!--规格项模板-->
<script type="text/html" id="specTemplate">
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="spec-item" data-index="{{i}}">
<div class="layui-form-item spec">
<label class="layui-form-label">规格项{{i+1}}</label>
<div class="layui-input-inline">
<select name="spec_item">
<option value="0"></option>
{{# if(d.list[i].spec_name != ''){ }}
<option value="{{d.list[i].spec_id}}" data-attr-name="{{d.list[i].spec_name}}" selected>{{d.list[i].spec_name}}</option>
{{# }else{ }}
{{# } }}
</select>
<i class="layui-icon layui-icon-close" data-index="{{i}}"></i>
</div>
{{# if(i==0){ }}
<div class="layui-input-inline">
{{# if(d.add_spec_img){ }}
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img" checked>
{{# }else{ }}
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img">
{{# } }}
</div>
{{# } }}
</div>
{{# if(d.list[i].spec_name != ''){ }}
<div class="layui-form-item spec-value">
{{# }else{ }}
<div class="layui-form-item spec-value" style="display:none;">
{{# } }}
<label class="layui-form-label"></label>
<div class="layui-input-block spec-value">
{{# if(d.list[i].value.length){ }}
<ul>
{{# for(var j=0;j<d.list[i].value.length;j++){ }}
<li data-index="{{j}}" data-parent-index="{{i}}" >
{{# if(i==0 && d.add_spec_img){ }}
<div class="img-wrap">
{{# if(d.list[i].value[j].image){ }}
<img src="{{ns.img(d.list[i].value[j].image)}}" alt="">
{{# }else{ }}
<img src="SHOP_IMG/goods_spec_value_empty.png" alt="">
{{# } }}
</div>
{{# } }}
<span title="双击可编辑规格值" ondblclick="$(this).attr('contenteditable',true);$(this).focus()" class="spec-txt" data-spec_value_name="{{d.list[i].value[j].spec_value_name}}" data-parent-index="{{i}}" data-index="{{j}}">{{d.list[i].value[j].spec_value_name}}</span>
<i class="layui-icon layui-icon-close" data-parent-index="{{i}}" data-index="{{j}}"></i>
</li>
{{# } }}
</ul>
{{# } }}
<a class="text-color" href="javascript:;" data-index="{{i}}">+添加规格值</a>
<div class="add-spec-value-popup" data-index="{{i}}">
<select name="spec_value_item"></select>
<button class="layui-btn layui-btn-primary border-color text-color js-cancel-spec-value">取消</button>
</div>
</div>
</div>
</div>
{{# } }}
</script>
<!--SKU列表模板-->
<script type="text/html" id="skuTableTemplate">
{{# if(d.skuList.length){ }}
<table class="layui-table">
<colgroup></colgroup>
<thead>
<tr>
{{# if(d.showSpecName){ }}
<th colspan="{{d.colSpan}}" style="min-width: 60px;">商品规格</th>
{{# } }}
<th rowspan="{{d.rowSpan}}">SKU图片</th>
<th rowspan="{{d.rowSpan}}">副标题</th>
<th rowspan="{{d.rowSpan}}"><span class="required">*</span></th>
<th rowspan="{{d.rowSpan}}">划线价</th>
<th rowspan="{{d.rowSpan}}">成本价</th>
<th rowspan="{{d.rowSpan}}"><span class="required">*</span></th>
<th rowspan="{{d.rowSpan}}">库存预警</th>
<th rowspan="{{d.rowSpan}}">重量(kg)</th>
<th rowspan="{{d.rowSpan}}">体积()</th>
<th rowspan="{{d.rowSpan}}">商品编码多个编码以英文逗号分割</th>
<th rowspan="{{d.rowSpan}}" style="white-space: nowrap;">默认展示</th>
</tr>
{{# if(d.colSpan>1){ }}
<tr>
{{# for(var i=0;i<d.specList.length;i++){ }}
{{# if(d.specList[i].spec_name && d.specList[i].value.length> 0){ }}
<th>{{d.specList[i].spec_name}}</th>
{{# } }}
{{# } }}
</tr>
{{# } }}
</thead>
<tbody>
{{# for(var i=0;i<d.skuList.length;i++){ }}
<tr data-index="{{i}}">
<td class="sku_imgs" id="sku_img_{{i}}" style="width: 130px;">
{{# for(var j=0;j<d.skuList[i].sku_images_arr.length;j++){ }}
<div class="img-wrap" data-index="{{j}}" data-parent-index="{{i}}">
<a href="javascript:void(0)">
<img src="{{ns.img(d.skuList[i].sku_images_arr[j])}}" layer-src />
</a>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
</div>
{{# } }}
{{# if(d.skuList[i].sku_images_arr.length<d.goods_sku_max){ }}
<div class="upload-sku-img" data-index="{{i}}"><i class="layui-icon layui-icon-add-1"></i></div>
{{# } }}
</td>
<td>
<input type="text" name="spec_name" placeholder="副标题" maxlength="100" value="{{d.skuList[i].spec_name}}" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="price" placeholder="销售价" lay-verify="sku_price" value="{{d.skuList[i].price}}" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="market_price" placeholder="划线价" value="{{d.skuList[i].market_price}}" lay-verify="sku_market_price" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="cost_price" placeholder="成本价" value="{{d.skuList[i].cost_price}}" lay-verify="sku_cost_price" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="stock" placeholder="库存" value="{{d.skuList[i].stock}}" lay-verify="sku_stock" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="stock_alarm" placeholder="库存预警" value="{{d.skuList[i].stock_alarm}}" lay-verify="sku_stock_alarm" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="weight" placeholder="重量(kg)" value="{{d.skuList[i].weight}}" lay-verify="sku_weight" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="volume" placeholder="体积(m³)" value="{{d.skuList[i].volume}}" lay-verify="sku_volume" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="sku_no" placeholder="商品编码" value="{{d.skuList[i].sku_no}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td style="min-width: 40px;">
{{# if(d.skuList[i].is_default == 1) { }}
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch" checked>
{{# }else { }}
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch">
{{# } }}
</td>
</tr>
{{# } }}
</tbody>
</table>
{{# } }}
<div class="word-aux text-color" style="margin: 10px 0 0 0;">默认展示是多规格商品在客户访问商品时默认显示的商品规格</div>
</script>
<!--商品主图列表-->
<script type="text/html" id="goodsImage">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i],'small')}}" layer-src="{{ns.img(d.list[i])}}">
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
</script>
<!--商品视频-->
<script type="text/html" id="goodsVideo">
</script>
<!--属性列表模板-->
<script type="text/html" id="attrTemplate">
{{# for(var i=0;i<d.list.length;i++){ }}
<tr class="goods-attr-tr goods-attr-temp" data-attr-class-id="{{d.list[i].attr_class_id}}" data-attr-class-name="{{d.list[i].attr_class_name}}" data-attr-id="{{d.list[i].attr_id}}" data-attr-name="{{d.list[i].attr_name}}" data-attr-type="{{d.list[i].attr_type}}">
<td>{{d.list[i].attr_name}}</td>
<td>
{{# if(d.list[i].attr_type == 1){ }}
{{# for(var j=0;j<d.list[i].attr_value_format.length;j++){ }}
<input type="radio" name="attr_value_{{d.list[i].attr_id}}" value="{{d.list[i].attr_value_format[j].attr_value_id}}" title="{{d.list[i].attr_value_format[j].attr_value_name}}" data-attr-value-name="{{d.list[i].attr_value_format[j].attr_value_name}}" />
{{# } }}
{{# }else if(d.list[i].attr_type == 2){ }}
{{# for(var j=0;j<d.list[i].attr_value_format.length;j++){ }}
<input type="checkbox" name="attr_value_{{d.list[i].attr_id}}" value="{{d.list[i].attr_value_format[j].attr_value_id}}" title="{{d.list[i].attr_value_format[j].attr_value_name}}" data-attr-value-name="{{d.list[i].attr_value_format[j].attr_value_name}}" lay-skin="primary">
{{# } }}
{{# }else if(d.list[i].attr_type == 3){ }}
<input type="text" name="attr_value_{{d.list[i].attr_id}}" placeholder="{{d.list[i].attr_name}}" class="layui-input len-mid" autocomplete="off">
{{# } }}
</td>
<td><input type="number" name="" value="{{d.list[i].sort ? d.list[i].sort : 0}}" placeholder="" class="layui-input attr-sort" autocomplete="off"></td>
<td><div class="table-btn"><a class="layui-btn" onclick="delAttr(this)">删除</a></div></td>
</tr>
{{# } }}
</script>
<!--批量操作模版-->
<script type="text/html" id="batchOperateTemplate">
{{# for(var i=0;i<d.length;i++){ }}
{{# if(d[i].value.length > 0){ }}
<div class="layui-input-inline">
<select name="spec_value:{{d[i].spec_id}}" lay-search="" id="spec_value_{{d[i].spec_id}}" data-spec-name="{{d[i].spec_name}}" >
<option value="all">请选择{{d[i].spec_name}}</option>
{{# for(var j=0;j< d[i].value.length;j++){ }}
<option value="{{d[i].value[j].spec_value_id}}">{{d[i].value[j].spec_value_name}}</option>
{{# } }}
</select>
</div>
{{# } }}
{{# } }}
</script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
<script src="__STATIC__/ext/video/video.min.js"></script>
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>
<script src="SHOP_JS/category_select.js?time=20240821"></script>
<script src="SHOP_JS/goods_edit_common.js?time=20250527"></script>
<script src="SHOP_JS/goods_edit.js?time=20241217"></script>
<script>
layui.use('form', function () {
$('#goods_name').on('input', function (e) {
var num = e.target.value.length;
num = 60 - parseInt(num);
$('#add_goods_name .input-text-hint').html('剩余' + num);
});
});
</script>

View File

@@ -0,0 +1,139 @@
<style>
.form-row .layui-btn{margin-right:14px;}
.layui-btn+.layui-btn{margin-left: 0;}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>社群名称:</label>
<div class="layui-input-block">
<input name="qr_name" lay-verify="qr_name" type="text" lay-verify="required" class="layui-input len-long" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>社群描述:</label>
<div class="layui-input-block">
<textarea name="community_describe" class="layui-textarea len-long" maxlength="100" placeholder="请输入社群描述不能超过100个字符" id="" lay-verify="community_describe" lay-verify="required" cols="30" rows="10"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>二维码图片:</label>
<div class="layui-input-inline">
<div class="upload-img-block square">
<div class="upload-img-box">
<div class="upload-default" id="qr_img">
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<div class="operation">
<div>
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
<div class="replace_img js-replace">点击替换</div>
</div>
<input type="hidden" lay-verify="qr_img" name="qr_img" />
</div>
<!-- <p id="qr_img" class="no-replace">替换</p>
<i class="del">x</i> -->
</div>
</div>
</div>
<div class="form-row">
<button id="submit" class="layui-btn" lay-submit lay-filter="save">提交</button>
<button class="layui-btn layui-btn-primary" onclick="backCommunityQrcode()">返回</button>
</div>
</div>
<script>
layui.use(['form', 'laydate'], function() {
var form = layui.form,
laydate = layui.laydate,
repeat_flag = false; //防重复标识
form.render();
laydate.render({
elem: '#laydate'
});
var upload = new Upload({
elem: '#qr_img',
callback:function(res){
if(res.code==10067){
// $('#submit').css('display','inline-block')
}
}
});
/**
* 表单验证
*/
form.verify({
qr_name: function (value) {
if (!/[\S]+/.test(value)) {
return '请输入二维码名称';
}
if (value < 0) {
return '金额不能小于0!';
}
},
community_describe: function (value) {
if (!/[\S]+/.test(value)) {
return '请输入社群描述';
}
},
qr_img: function (value) {
if (!/[\S]+/.test(value)) {
return '请上传社群二维码';
}
}
});
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
// 删除图片
if(!data.field.qr_img) upload.delete();
if(repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: ns.url("shop/goods/addqrcode"),
data: data.field,
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function(index, layero){
location.hash = ns.hash("shop/goods/communityqrcode")
layer.close(index);
},
btn2: function (index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
});
});
});
function backCommunityQrcode() {
location.hash = ns.hash("shop/goods/communityqrcode");
}
</script>

View File

@@ -0,0 +1,237 @@
<style>
.layui-layout-admin .table-tab{margin-top: 0;}
</style>
<div class="layui-collapse tips-wrap">
<div class="layui-colla-item">
<h2 class="layui-colla-title">操作提示</h2>
<ul class="layui-colla-content layui-show">
<li>社群信息可以展示在商品详情中,需在商品中进行设置后才能展示。</li>
</ul>
</div>
</div>
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="add()">添加社群</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="keywords" placeholder="请输入社群名称" class="layui-input" autocomplete="off">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="manjian_tab">
<div class="layui-tab-content">
<!-- 列表 -->
<table id="qr_list" lay-filter="qr_list"></table>
</div>
</div>
<script type="text/html" id="qr_img">
<div class='table-title'>
<div class='title-pic'>
<img layer-src src="{{ns.img(d.qr_img)}}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' ">
</div>
<div class='title-pic' style="text-align:left">{{d.qr_name}}</div>
</div>
</script>
<script type="text/html" id="qr_state">
<div class='table-title'>
{{# if(d.qr_state == 0){ }}
<div class='title-pic' style="text-align:left">未启用</div>
{{# }else{ }}
<div class='title-pic text-color' style="text-align:left">启用</div>
{{# } }}
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit" >编辑</a>
{{# if(d.qr_state==0){ }}
<a class="layui-btn" lay-event="start">启用</a>
{{# }else{ }}
<a class="layui-btn" lay-event="close">关闭</a>
{{# } }}
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script>
var laytpl;
layui.use(['form','laytpl'], function() {
var table,
form = layui.form,
repeat_flag = false; //防重复标识
form.render();
laytpl = layui.laytpl;
table = new Table({
elem: '#qr_list',
url: ns.url("shop/goods/communityqrcode"),
cols: [
[ {
field: 'qr_img',
title: '社群信息',
unresize: 'false',
width: '18%',
templet:'#qr_img'
},{
field: 'community_describe',
title: '社群描述',
unresize: 'false',
width: '30%',
templet:'<div><span title="{{d.community_describe}}">{{d.community_describe}}</span></div>'
}, {
field: 'qr_state',
title: '社群状态',
unresize: 'false',
width: '15%',
templet: '#qr_state'
},{
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.hash = ns.hash("shop/goods/editqrcode", {"qr_id": data.qr_id});
break;
case 'delete': //删除
deleteQr(data.qr_id,data.qr_state);
break;
case 'close': //关闭
close(data.qr_id);
break;
case 'start': //启用
start(data.qr_id);
break;
}
});
/**
* 删除
*/
function deleteQr(qr_id,qr_state) {
if(qr_state == 1){
return layer.msg('请先关闭再删除');
}
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该社群吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goods/deleteqr"),
data: {
qr_id:qr_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
/**
* 关闭
*/
function close(qr_id) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定关闭吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goods/editstate"),
data: {
qr_id:qr_id,state:0
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
});
}
/**
* 开启
*/
function start(qr_id) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定启用吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goods/editstate"),
data: {
qr_id:qr_id,state:1
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
});
}
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
function add() {
location.hash = ns.hash("shop/goods/addqrcode");
}
</script>
<!-- 详情弹框html -->
<script type="text/html" id="detail">
<img layer-src src="{{ns.img(d.qr_img)}}" class="img_prev"/>
</script>

View File

@@ -0,0 +1,162 @@
<style type="text/css">
.examples {cursor: pointer;}
.keywords-item{position:relative;margin-bottom:10px}
.keywords-item .layui-icon-close{font-size:12px;position:absolute;top:-8px;right:-8px;width:16px;height:16px;line-height:16px;text-align:center;color:#fff;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;background:rgba(0,0,0,.3);cursor:pointer}
.layui-form .card-common .layui-card-body{padding:0px}
</style>
<div class="layui-form layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">默认搜索</span>
</div>
<div class="layui-form-item">
<label class="layui-form-label">默认搜索关键词:</label>
<div class="layui-input-block len-long">
<textarea name="default_words" class="layui-textarea" maxlength="150">{$default_search_words['words']}</textarea>
</div>
<div class="word-aux">默认搜索,将显示在前台搜索框,前台点击时直接作为关键词进行搜索 <a onclick="showDemo()" class="examples text-color">查看示例</a></div>
</div>
<div class="layui-card-header">
<span class="card-title">热门搜索</span>
</div>
<div class="layui-card card-common card-brief">
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">首页搜索的关键字:</label>
<div class="layui-input-block keywords-block">
{if !empty($hot_search_words.words_array)}
{foreach $hot_search_words.words_array as $k => $v}
<div class="layui-input-inline keywords-item">
<input type="text" name="words[]" lay-verify="required" value="{$v}" placeholder="" autocomplete="off" class="layui-input len-short">
<i class="layui-icon layui-icon-close" ></i>
</div>
{/foreach}
{else/}
<div class="layui-input-inline keywords-item">
<input type="text" name="words[]" lay-verify="required" value="" placeholder="" autocomplete="off" class="layui-input len-short">
<i class="layui-icon layui-icon-close" ></i>
</div>
{/if}
</div>
</div>
<div class="layui-form-item">
<div class="word-aux">首页显示的搜索关键字,可以通过拖拽来调整顺序</div>
<label class="layui-form-label"></label>
<div class="layui-input-block">
<div class="layui-input-inline">
<a class="text-color" href="javascript:void(0)" onclick="addKeywords()">添加</a>
</div>
</div>
</div>
</div>
</div>
<div class="layui-card-header">
<span class="card-title">百度拆词服务 <a target="_blank" href="https://www.kancloud.cn/niucloud/niushop_b2c_v5/3268653" class="examples text-color">接入指南</a></span>
</div>
<div class="layui-card card-common card-brief">
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">是否启用:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="is_open" value="0" title="关闭" autocomplete="off" class="layui-input len-long" {if $split_word.is_open==0} checked {/if}>
<input type="radio" name="is_open" value="1" title="开启" autocomplete="off" class="layui-input len-long" {if $split_word.is_open==1} checked {/if}>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="word-aux">开启后,商品搜索时将会使用百度拆词接口,提供更准确的搜索结果</div>
<div class="word-aux">例如:会员搜索华为手机关键词后,将自动拆词为华为、手机关键词分别搜索</div>
</div>
</div>
</div>
<div class="layui-card card-common card-brief">
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">apiKey</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="apiKey" value="{:empty($split_word.apiKey) ? '' : '******'}" autocomplete="off" class="layui-input len-long" >
</div>
</div>
<div class="word-aux">百度apiKey <a href="https://console.bce.baidu.com/iam/#/iam/accesslist" target="_blank" class="examples text-color">获取</a></div>
</div>
</div>
</div>
<div class="layui-card card-common card-brief">
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">secretKey</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="text" name="secretKey" value="{:empty($split_word.secretKey) ? '' : '******'}" autocomplete="off" class="layui-input len-long ">
</div>
</div>
<div class="word-aux">百度secretKey <a href="https://console.bce.baidu.com/iam/#/iam/accesslist" target="_blank" class="examples text-color">获取</a></div>
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script>
layui.use('form', function() {
var form = layui.form,repeat_flag=false;
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/goods/defaultsearchwords"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
layer.msg(res.message);
}
});
});
$(".keywords-item").arrangeable({
//拖拽结束后执行回调
callback: function (e) {
}
});
$('body').off('click', ".keywords-item .layui-icon-close").on('click', ".keywords-item .layui-icon-close",function () {
$(this).parent().remove();
});
});
function addKeywords(){
var html = '<div class="layui-input-inline keywords-item"><input type="text" name="words[]" lay-verify="required" value="" placeholder="" autocomplete="off" class="layui-input len-short"><i class="layui-icon layui-icon-close" ></i></div>';
$('.keywords-block').append(html);
setTimeout(function () {
$(".keywords-item").arrangeable({
//拖拽结束后执行回调
callback: function (e) {
}
});
}, 1);
}
function showDemo(){
layer.open({
title: '查看示例',
type: 1,
area: ['500px', '660px'],
content: '<img style="margin: 20px 80px;" src="SHOP_IMG/hot_search.png">'
})
}
</script>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,139 @@
<style>
.form-row .layui-btn{margin-right:14px;}
.layui-btn+.layui-btn{margin-left: 0;}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>社群名称:</label>
<div class="layui-input-block">
<input name="qr_name" type="text" lay-verify="qr_name" lay-verify="required" value="{$qr_data.qr_name}" class="layui-input len-long" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>社群描述:</label>
<div class="layui-input-block">
<textarea name="community_describe" class="layui-textarea len-long" maxlength="100" lay-verify="community_describe" id="" lay-verify="required" cols="30" rows="10">{$qr_data.community_describe}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>二维码图片:</label>
<div class="layui-input-inline">
<div class="upload-img-block square">
<div class="upload-img-box {notempty name="$qr_data['qr_img']"}hover{/notempty}">
<div class="upload-default" id="qr_img">
{if condition="$qr_data['qr_img']"}
<div class="preview_img" id="ceshi">
<img src="{:img($qr_data['qr_img'])}" class="img_prev" data-id="qr_img" layer-src/>
</div>
{else/}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{/if}
</div>
<div class="operation">
<div>
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
<div class="replace_img js-replace">点击替换</div>
</div>
<input type="hidden" name="qr_img" lay-verify="qr_img" value="{$qr_data['qr_img']}"/>
</div>
</div>
</div>
</div>
<div class="form-row">
<input type="hidden" name="qr_id" value="{$qr_data['qr_id']}"/>
<button id="submit" class="layui-btn" lay-submit lay-filter="save">提交</button>
<button class="layui-btn layui-btn-primary" onclick="backCommunityQrcode()">返回</button>
</div>
</div>
<script>
layui.use(['form', 'laydate'], function() {
var form = layui.form,
laydate = layui.laydate,
repeat_flag = false; //防重复标识
form.render();
laydate.render({
elem: '#laydate'
});
var upload = new Upload({
elem: '#qr_img',
callback:function(res){
// if(res.code==10067){
// $('#submit').css('display','inline-block')
// }
}
});
/**
* 表单验证
*/
form.verify({
qr_name: function(value){
if (!/[\S]+/.test(value)) {
return '请输入二维码名称';
}
},
community_describe: function(value){
if (!/[\S]+/.test(value)) {
return '请输入社群描述';
}
},
qr_img: function(value){
if (!/[\S]+/.test(value)) {
return '请上传社群二维码';
}
}
});
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
// 删除图片
if(!data.field.qr_img) upload.delete();
if(repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: ns.url("shop/goods/editqrcode"),
data: data.field,
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表'],
closeBtn: 0,
yes: function(index, layero) {
location.hash = ns.hash("shop/goods/communityqrcode")
layer.close(index);
},
});
}else{
layer.msg(res.message);
}
}
});
});
});
function backCommunityQrcode() {
location.hash = ns.hash("shop/goods/communityqrcode");
}
</script>

407
app/shop/view/goods/evaluate.html Executable file
View File

@@ -0,0 +1,407 @@
<link rel="stylesheet" type="text/css" href="SHOP_CSS/evaluate.css" />
<!-- 搜索框 -->
<div class="screen layui-collapse" >
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show" lay-filter="selection_panel">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">搜索类型</label>
<div class="layui-input-inline">
<select name="search_type">
<option value="sku_name">商品名称</option>
<option value="member_name">评价人名称</option>
</select>
</div>
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入搜索内容" class="layui-input len-mid" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">评价类型</label>
<div class="layui-input-inline">
<select name="explain_type">
<option value="">请选择评分类型</option>
<option value="1">好评</option>
<option value="2">中评</option>
<option value="3">差评</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">评论时间</label>
<div class="layui-input-inline">
<input type="text" name="start_time" id="start_time" placeholder="开始时间" class="layui-input" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline end-time">
<input type="text" name="end_time" id="end_time" placeholder="结束时间" class="layui-input" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<input type="hidden" name="goods_id" value="{$goods_id}">
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="is_audit">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="">全部</li>
<li lay-id="1">未审核</li>
<li lay-id="2">审核通过</li>
<li lay-id="3">审核拒绝</li>
</ul>
<div class="layui-tab-content">
<div class="table-bottom layui-table-bottom-tool-temp layui-form" style="float: left;border: none; padding-left: 15px;">
<input type="checkbox" name="check_all" lay-skin="primary" lay-filter="check_all">
<button class="layui-btn layui-btn-primary js-audit-pass" data-is-audit="1">批量通过</button>
<button class="layui-btn layui-btn-primary js-audit-refuse" data-is-audit="2">批量拒绝</button>
<button class="layui-btn layui-btn-primary js-audit-delete" data-is-audit="3">批量删除</button>
</div>
<table class="layui-table evaluate-table layui-form" lay-skin="line" lay-size="lg">
<div class="layui-tab-content">
<colgroup>
<col width="3%">
<col width="20%">
<col width="10%">
<col width="10%">
<col width="27%">
<col width="10%">
<col width="10%">
<col width="10%">
</colgroup>
<thead>
<tr>
<th><input type="checkbox" name="check_all" lay-skin="primary" lay-filter="check_all" /></th>
<th>商品信息</th>
<th>客户昵称</th>
<th>评论等级</th>
<th>评论详情</th>
<th>评论时间</th>
<th style="text-align: center;">审核状态</th>
<th class = 'operate'>操作</th>
</tr>
</thead>
<tbody></tbody>
</div>
</table>
<div class="tab-bottom">
<div class="table-bottom layui-table-bottom-tool-temp layui-form" style="float: left;border: none; padding-left: 15px;">
<input type="checkbox" name="check_all" lay-skin="primary" lay-filter="check_all">
<button class="layui-btn layui-btn-primary js-audit-pass" data-is-audit="1">批量通过</button>
<button class="layui-btn layui-btn-primary js-audit-refuse" data-is-audit="2">批量拒绝</button>
<button class="layui-btn layui-btn-primary js-audit-delete" data-is-audit="3">批量删除</button>
</div>
<div id="laypage"></div>
</div>
</div>
</div>
<script src="SHOP_JS/evaluate.js"></script>
<script>
var limit = 5;
var evaluate = new Evaluate(limit, [2, 5, 10]);
var goods_id = "{$goods_id}";
evaluate.getList({
"_this": evaluate,
"goods_id" : goods_id,
});
layui.use(['form', 'laydate','element'], function() {
var form = layui.form,
laydate = layui.laydate;
element = layui.element;
currentDate = new Date(),
minDate = "";
form.render();
//监听Tab切换
element.on('tab(is_audit)', function(data) {
var is_audit = $(this).attr("lay-id");
var num = $(".layui-laypage-limits option:selected").val()
var evaluate = new Evaluate(num, [2, 5, 10]);
data = form.val('selection_panel');
evaluate.getList({
"_this": evaluate,
"search_type": data.search_type,
"search_text": data.search_text,
"explain_type": data.explain_type,
"start_time": data.start_time,
"end_time": data.end_time,
"goods_id" : data.goods_id,
"is_audit" : is_audit,
});
return false;
});
currentDate.setDate(currentDate.getDate() - 7);
form.on('checkbox(check_all)', function(data){
$("input[name='evaluate']").prop("checked",data.elem.checked);
$("input[name='check_all']").prop("checked",data.elem.checked);
form.render();
});
form.on('checkbox(evaluate)', function(data){
if($("input[name='evaluate']:checked").length == limit){
$("input[name='check_all']").prop("checked",true);
} else {
$("input[name='check_all']").prop("checked",false);
}
form.render();
});
$(".js-audit-pass,.js-audit-refuse,.js-audit-delete").click(function () {
var evaluate_ids = [];
var is_audit = $(this).attr("data-is-audit");
$("input[name='evaluate']:checked").each(function () {
evaluate_ids.push($(this).val());
});
if(evaluate_ids.length<1) {
layer.msg("请选择要操作的数据");
return;
}
if(is_audit==3){
deleteEvaluate(evaluate_ids.toString());
}else{
modifyAuditEvaluate(evaluate_ids.toString(),is_audit);
}
});
//开始时间
laydate.render({
elem: '#start_time',
type: 'datetime'
});
//结束时间
laydate.render({
elem: '#end_time',
type: 'datetime'
});
/**
* 重新渲染结束时间
*/
function reRender() {
$("#end_time").remove();
$(".end-time").html('<input type="text" class="layui-input" placeholder="结束时间" name="end_time" id="end_time" >');
laydate.render({
elem: '#end_time',
type: 'datetime',
min: minDate
});
}
/**
* 搜索
*/
form.on('submit(search)', function(data) {
var num = $(".layui-laypage-limits option:selected").val()
var evaluate = new Evaluate(num, [2, 5, 10]);
var is_audit = $('.layui-tab-title .layui-this').attr('lay-id');
evaluate.getList({
"_this": evaluate,
"search_type": data.field.search_type,
"search_text": data.field.search_text,
"explain_type": data.field.explain_type,
"start_time": data.field.start_time,
"end_time": data.field.end_time,
"goods_id" : data.field.goods_id,
"is_audit" : is_audit,
});
return false;
});
});
function replay(e) {
var input = $(e).parents("tr").find(".evaluate_id");
var evaluate_id = input.val();
var isFirstExplain = input.attr("data-is-first-explain");
layer.prompt({
formType: 2,
value: '',
title: '请输入回复内容',
area: ['350px', '150px'] ,//自定义文本域宽高
yes: function(index, layero) {
var explain = layero.find(".layui-layer-input").val();
if (explain) {
$.ajax({
url: ns.url("shop/goods/evaluateapply"),
data: {
evaluate_id: evaluate_id,
explain: explain,
is_first_explain: isFirstExplain
},
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function(res) {
layer.closeAll();
if (res.code == 0) {
listenerHash(); // 刷新页面
} else {
evaluate.getList({
"_this": evaluate,
'is_audit' : $(".layui-tab-title").find('.layui-this').attr('lay-id')
});
layer.msg(res.message);
}
}
});
layer.close(index);
} else {
layer.msg('请输入回复内容!', {icon: 5, anim: 6});
}
}
});
}
var repeat_flag = false;
function deleteContent(e, isFirst) {
var input = $(e).parents("tr").find(".evaluate_id");
var evaluate_id = input.val();
if(repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除回复内容吗?', function(index) {
$.ajax({
url: ns.url("shop/goods/deleteContent"),
data: {
evaluate_id: evaluate_id,
is_first: isFirst
},
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
evaluate.getList({
"_this": evaluate,
'is_audit' : $(".layui-tab-title").find('.layui-this').attr('lay-id')
});
} else {
layer.msg(res.message);
}
layer.closeAll();
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
// 修改首评审核状态
function audit(e,is_audit) {
var input = $(e).parents("tr").find(".evaluate_id");
var evaluate_id = input.val();
modifyAuditEvaluate(evaluate_id,is_audit);
}
// 修改删除评论操作之前
function toDelete(e) {
var input = $(e).parents("tr").find(".evaluate_id");
var evaluate_id = input.val();
deleteEvaluate(evaluate_id);
}
function modifyAuditEvaluate(evaluate_ids,is_audit) {
var hint = '确定要审核通过吗?';
if(is_audit == 2){
hint = '确定要拒绝审核吗?';
}
layer.confirm(hint, function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goods/modifyAuditEvaluate"),
data: {
evaluate_ids: evaluate_ids,
is_audit: is_audit
},
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function (res) {
layer.msg(res.message);
if (res.code == 0) {
evaluate.getList({
"_this": evaluate,
'is_audit' : $(".layui-tab-title").find('.layui-this').attr('lay-id')
});
}
}
});
});
}
function deleteEvaluate(evaluate_ids) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除评论吗?', function (index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goods/deleteEvaluate"),
data: {
evaluate_ids: evaluate_ids,
},
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function (res) {
repeat_flag = false;
layer.msg(res.message);
if (res.code == 0) {
evaluate.getList({
"_this": evaluate,
'is_audit': $(".layui-tab-title").find('.layui-this').attr('lay-id')
});
listenerHash(); // 刷新页面
}
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
function again_audit(e,is_audit) {
var input = $(e).parents("tr").find(".evaluate_id");
var evaluate_id = input.val();
modifyAgainAuditEvaluate(evaluate_id,is_audit);
}
function modifyAgainAuditEvaluate(evaluate_ids,is_audit) {
$.ajax({
url: ns.url("shop/goods/modifyAgainAuditEvaluate"),
data: {
evaluate_ids: evaluate_ids,
again_is_audit: is_audit
},
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function (res) {
layer.msg(res.message);
if (res.code == 0) {
evaluate.getList({
"_this": evaluate,
'is_audit' : $(".layui-tab-title").find('.layui-this').attr('lay-id')
});
}
}
});
}
</script>

199
app/shop/view/goods/export.html Executable file
View File

@@ -0,0 +1,199 @@
<style>
.layui-card-header{background-color:#f8f8f8}
.apply-time{
float:left;
}
.export-select{float:left;}
.download-button{
float:right;
}
.export-list-view{
font-size:12px;
}
.export-foot-operation{overflow:hidden;margin-top:15px;}
.export-page{
float:right;
}
.export-content-bar{
float:left;
padding-top: 6px;
margin-left: 15px;
}
.export-foot-operation .layui-btn {
padding: 0px 5px;
font-size: 12px;
line-height: 2 !important;
height: auto;
display: inline-block;
}
.layui-unselect.layui-form-checkbox{
margin-top:-5px;
}
</style>
<div class="layui-layout layui-layout-admin">
<div class="body-content">
<div id="export_list"></div>
<div class="export-foot-operation">
<div class="export-content-bar layui-form bg-color-light-gray">
<input type="checkbox" name="export_select" lay-filter="allChoose" lay-skin="primary" title="全选">
</div>
<button class="layui-btn layui-btn-primary" onclick="deleteExport()">批量删除</button>
<div class='export-page' id="export_page"></div>
</div>
</div>
</div>
<script type="text/html" id="exportHtml">
{{# layui.each(d.data.list, function(index, item){ }}
<div class="layui-card export-list-view">
<div class="layui-card-header">
<div class="layui-form export-select">
<input type="checkbox" name="check[]" value="{{item.export_id}}" lay-skin="primary" title="">
</div>
<div class="apply-time">序号{{ item.export_id }}&nbsp;&nbsp;&nbsp;导出时间{{ ns.time_to_date(item.create_time) }}</div>
<div class="download-button">
{{# if(item.status == 0){ }}
<span>正在导出中请耐心等待</span>
{{# }else{ }}
{{# if(item.path != ''){ }}
<a class="text-color" href="{{ ns.img(item.path) }}" target="_blank">下载</a>
{{#}}}
{{#}}}
&nbsp;&nbsp;<a class="text-color" href="javascript:void(0)" data-export_id ="{{item.export_id}}" onclick="deleteExport(this)">删除</a>
</div>
</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space10">
{{# layui.each(JSON.parse(item.condition), function(condition_index, condition_item){ }}
<div class="layui-col-md3">
{{condition_item.name}}{{condition_item.value || '-'}}
</div>
{{# }); }}
</div>
</div>
</div>
{{# }); }}
{{# if(d.data.list.length === 0){ }}
<div class="layui-card export-list-view">
<div class="layui-card-header">
<div class="apply-time">商品导出记录</div>
</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space10">
<div class="layui-col-md3">暂无导出记录</div>
</div>
</div>
</div>
{{# } }}
</script>
<script>
var laypage,form;
layui.use(['form', 'laytpl', 'laypage'], function() {
form = layui.form;
laytpl = layui.laytpl;
form.render();
exportList(1,10);
laypage = layui.laypage;
/**
* 全选
*/
form.on("checkbox(allChoose)", function(data) {
$("input[name='check[]']").each(function() {
this.checked = data.elem.checked;
});
form.render('checkbox');
})
});
function exportList(page, limit){
$.ajax({
url: '{:addon_url("shop/goods/export")}',
data: {
limit,
page
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
var export_template = $("#exportHtml").html();
if(res.code >= 0){
laytpl(export_template).render(res, function (html) {
$("#export_list").html(html);
})
}
laypage.render({
elem: 'export_page',
count: res.data.count,
curr: page, //当前页
limit: limit,
jump: function(obj, first){
//obj包含了当前分页的所有参数比如
//首次不执行
if(!first){
exportList(obj.curr, obj.limit);
form.render();
}
}
});
form.render();
}
});
}
/**
* 删除导出记录
*/
var flag_delete = false;
function deleteExport(data) {
var export_ids = [];
if (!data) {
$("input[name='check[]']:checked").each(function (index, item) {
export_ids.push($(item).val());
});
} else {
export_ids.push($(data).attr("data-export_id"));
}
if (export_ids.length == 0) {
layer.msg('请选择要操作的数据');
return;
}
export_ids = export_ids.toString();
layer.confirm('确定要删除选择的商品导出记录吗?', {
btn: ['确定', '取消']
}, function (index) {
if (flag_delete) return;
flag_delete = true;
layer.close(index);
$.ajax({
type: "POST",
async: true,
url: ns.url("shop/goods/deleteExport"),
data: {
export_ids: export_ids,
},
dataType: "JSON",
success: function (data) {
layer.msg(data.message);
flag_delete = false;
if (data.code == 0) {
listenerHash(); // 刷新页面
}
}
});
}, function () {
layer.close();
});
}
</script>

View File

@@ -0,0 +1,77 @@
<!-- 列表 -->
<table id="good_list" lay-filter="good_list"></table>
<!-- 商品 -->
<script type="text/html" id="goodIntro">
<div class="table-title">
<div class="title-pic">
{{# if(d.sku_image){ }}
<img layer-src src="{{ns.img(d.sku_image.split(',')[0],'small')}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color">{{d.sku_name}}</a>
</div>
</div>
</script>
<script>
var form, table, laytpl;
layui.use(['form', 'laytpl'], function() {
form = layui.form;
laytpl = layui.laytpl;
form.render();
table = new Table({
elem: '#good_list',
url: '{:addon_url("shop/goods/goodsbrowse")}',
async : false,
where: {'goods_id': "{$goods_id}"},
parseData: function(res) {
return {
"code": res.code,
"msg": res.message,
"count": res.data.count,
"data": res.data.list,
};
},
cols: [
[{
title: '商品',
unresize: 'false',
width: '30%',
templet: '#goodIntro'
},{
title: '会员',
unresize: 'false',
width: '30%',
align: 'left',
templet: function(data) {
return data.nickname;
}
}, {
title: '浏览时间',
unresize: 'false',
width: '20%',
align: 'left',
templet: function(data){
return ns.time_to_date(data.browse_time);
}
}]
]
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
</script>

View File

@@ -0,0 +1,112 @@
<link rel="stylesheet" href="STATIC_EXT/colorPicker/css/colorpicker.css"/>
<link rel="stylesheet" href="SHOP_CSS/goods_detail_config.css"/>
<div id="diyView" class="layui-form">
<div class="preview-wrap">
<div class='diy-view-wrap'>
<div class="preview-head">
<span>商品详情</span>
</div>
<div class="preview-block">
<div class="preview-draggable">
<img src="SHOP_IMG/goods/goods_detail_preview.png">
</div>
<div class="edit-attribute">
<div class="attr-wrap">
<div class="attr-title">
<span class="title">商品详情</span>
</div>
<div class="edit-content-wrap">
<div class="layui-form-item">
<label class="layui-form-label sm">导航栏透明</label>
<div class="layui-input-block">
<input type="checkbox" name="nav_bar_switch" lay-skin="switch" value="1" {if $config['nav_bar_switch'] == 1}checked{/if} />
</div>
<div class="word-aux diy-word-aux">控制导航栏是否透明显示(只限小程序)</div>
</div>
<div class="layui-form-item flex">
<div class="flex_left">
<label class="layui-form-label sm">促销语颜色</label>
<div class="curr-color">
<span></span>
</div>
</div>
<div class="layui-input-block flex_fill">
<div id="introductionColor" class="picker colorSelector">
<div></div>
</div>
<input type="hidden" name="introduction_color">
<span class="color-selector-reset text-color" onclick="reset('introductionColor','#303133')">重置</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="custom-save">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
<script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
<script>
layui.use(['form', 'laydate', 'laytpl'], function () {
var form = layui.form;
var repeat_flag = false; //防重复标识
form.render();
var size = 139; // 公式二级面包屑layui-header-crumbs-second 55px+ 自定义模板区域上内边距diyview20px + 底部保存按钮90px
var commonHeight = $(window).height() - size;
$('.preview-wrap').css("height", (commonHeight) + "px");
$(".edit-attribute .attr-wrap").css("height", (commonHeight - 1) + "px");// 1px是上边框
$(".preview-block").css("min-height", (commonHeight - 104) + "px"); // 公式:高度 - 自定义模板区域上内边距20px - 自定义模板区域下外编辑20px- 自定义模板头部64px
setTimeout(function () {
$('#diyView').css('visibility', 'visible');
}, 50);
Colorpicker.create({
el: 'introductionColor',
color: "{$config['introduction_color']}",
change: function (elem, hex) {
$(elem).find("div").css('background', hex);
$(elem).parent().parent().find('.curr-color span').text(hex);
$(elem).next().val(hex);
}
});
form.on('submit(save)', function (data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
url: ns.url("shop/goods/goodsDetailConfig"),
data: data.field,
dataType: 'JSON',
success: function (res) {
repeat_flag = false;
layer.msg(res.message);
}
});
});
});
function reset(elem,color) {
$('#' + elem).children('div').css('background', color);
$('#' + elem).parent().parent().find('.curr-color span').text(color);
$('#' + elem).next().val(color);
}
</script>

View File

@@ -0,0 +1,83 @@
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>海报名称:</label>
<div class="layui-input-block">
<input name="poster_name" type="text" lay-verify="poster_name" lay-verify="required" {notempty name="$poster_data"} value="{$poster_data.poster_name}" {/notempty} class="layui-input len-long" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>选择模板:</label>
<div class="layui-input-block">
<button class="layui-btn" onclick="">选择模板</button>
</div>
<input type="hidden" name="json_data">
</div>
<div class="form-row">
<input type="hidden" name="poster_id" {notempty name="$poster_data"} value="{$poster_data.poster_id}" {/notempty}>
<button class="layui-btn" lay-submit lay-filter="save">提交</button>
<button class="layui-btn layui-btn-primary" onclick="backGoodsPoster()">返回</button>
</div>
</div>
<script>
layui.use(['form', 'laydate'], function() {
var form = layui.form,
laydate = layui.laydate,
repeat_flag = false; //防重复标识
form.render();
laydate.render({
elem: '#laydate'
});
/**
* 表单验证
*/
form.verify({
poster_name: function(value){
if (!/[\S]+/.test(value)) {
return '请输入海报名称';
}
},
});
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if(repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: ns.url("shop/goods/editposter"),
data: data.field,
dataType: 'JSON', //服务器返回json格式数据
type: 'POST', //HTTP请求类型
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('操作成功', {
title:'操作提示',
btn: ['返回列表'],
closeBtn: 0,
yes: function(index, layero) {
location.hash = ns.hash("shop/goods/poster")
layer.close(index);
},
});
}else{
layer.msg(res.message);
}
}
});
});
});
function backGoodsPoster() {
location.hash = ns.hash("shop/goods/poster");
}
</script>

View File

@@ -0,0 +1,229 @@
<link rel="stylesheet" href="STATIC_EXT/colorPicker/css/colorpicker.css" />
<link rel="stylesheet" href="STATIC_EXT/diyview/css/diyview.css?time=20240316" />
<link rel="stylesheet" href="SHOP_CSS/goods_list_config.css"/>
<div id="diyView" v-if="lazyLoad">
<div class="preview-wrap">
<div class="preview-restore-wrap">
<div class="div-wrap">
<div class='diy-view-wrap layui-form' :style="{ backgroundColor : global.pageBgColor }">
<div class="preview-head">
<tabbar :global="global"></tabbar>
</div>
<div class="preview-block">
<div class="preview-draggable">
<div class="goods-list row1-of2 style-2">
<div class="goods-item" v-for="(index) in [1,2,3,4]" :key="index">
<div class="goods-img">
<img :src="changeImgUrl('public/static/img/default_img/square.png')" />
</div>
<div class="info-wrap">
<div class="goods-name">商品名称</div>
<!-- <div class="tag-wrap">-->
<!-- <span class="hollow-tag text-color border-color">商品标签</span>-->
<!-- </div>-->
<div class="pro-info">
<div class="discount-price">
<div class="price-wrap">
<span class="unit text-color">¥</span>
<span class="price text-color">{{ index * 100 }}</span>
<span class="unit text-color">.00</span>
</div>
<div class="delete-price">¥198</div>
<div class="sale">已售63件</div>
</div>
<template v-if="data.control">
<!-- 购物车图标 -->
<div v-if="data.style == 'icon-cart'" class="cart shopping-cart-btn iconfont icongouwuche" :style="{ color : data.textColor }"></div>
<!--加号图标 -->
<div v-else-if="data.style == 'icon-add'" class="cart plus-sign-btn iconfont iconjia2" :style="{ color : data.textColor }"></div>
<!-- 按钮 -->
<div v-else-if="data.style == 'button'" class="cart buy-btn" :style="{fontWeight: (data.fontWeight ? 'bold' : 'normal'), backgroundColor : data.bgColor, color : data.textColor,borderRadius : data.aroundRadius + 'px',padding : ('0 '+ data.padding + 'px') }">{{ data.text }}</div>
<!-- 自定义图标 -->
<div v-else-if="data.style == 'icon-diy'" class="icon-diy">
<iconfont :icon="data.iconDiy.icon" v-if="data.iconDiy.icon" :value="data.iconDiy.style ? data.iconDiy.style : ''"></iconfont>
</div>
</template>
</div>
</div>
</div>
</div>
</div>
<div class="edit-attribute">
<div class="attr-wrap">
<div class="restore-wrap">
<div class="attr-title">
<span class="title">商品列表</span>
<div class="tab-wrap">
<span class="active bg-color" data-type="content">内容</span>
<span data-type="style">样式</span>
</div>
</div>
<div class="edit-content-wrap">
<div class="template-edit-title">
<h3>购买按钮</h3>
<div class="layui-form-item">
<label class="layui-form-label sm">是否显示</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="data.control = !data.control" :class="{ 'layui-form-checked' : data.control }">
<span>{{ data.control ? '显示' : '隐藏' }}</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
</div>
<template v-if="data.control">
<div class="layui-form-item">
<label class="layui-form-label sm">购物车事件</label>
<div class="layui-input-block">
<div @click="data.cartEvent='detail'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.cartEvent=='detail') }">
<i class="layui-anim layui-icon">{{ data.cartEvent=='detail' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>跳转商品详情</div>
</div>
<div @click="data.cartEvent='cart'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.cartEvent=='cart') }">
<i class="layui-anim layui-icon">{{ data.cartEvent=='cart' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>加入购物车</div>
</div>
</div>
<p class="word-aux" style="margin-left: 100px;" v-if="data.cartEvent=='cart'">只有实物商品才能加入购物车,虚拟商品会跳转到商品详情</p>
</div>
<div class="layui-form-item btn-style">
<label class="layui-form-label sm">样式</label>
<div class="layui-input-block">
<div class="item" :class="{ 'border-color' : data.style == 'button' }" @click="data.style = 'button';data.textColor= data.textColor == '#FF6A00' ? '#FFFFFF' : data.textColor">
<span class="buy-btn bg-color">按钮</span>
</div>
<div class="item" :class="{ 'border-color' : data.style == 'icon-cart' }" @click="data.style = 'icon-cart';data.textColor= data.textColor == '#FFFFFF' ? '#FF6A00' : data.textColor">
<span class="shopping-cart-btn iconfont icongouwuche text-color border-color"></span>
</div>
<div class="item" :class="{ 'border-color' : data.style == 'icon-add' }" @click="data.style = 'icon-add';data.textColor= data.textColor == '#FFFFFF' ? '#FF6A00' : data.textColor">
<span class="plus-sign-btn iconfont iconjia2 text-color border-color"></span>
</div>
<div class="item" :class="{ 'border-color' : data.style == 'icon-diy' }" @click="data.style = 'icon-diy';data.textColor= data.textColor == '#FFFFFF' ? '#FF6A00' : data.textColor">
<span class="diy-btn text-color border-color">自定义</span>
</div>
</div>
<div class="layui-input-block diy-icon" v-show="data.style == 'icon-diy'">
<img-icon-upload :data="{data : data.iconDiy, displayType : 'icon'}"></img-icon-upload>
<div class="action-box">
<div class="action" @click="iconStyle($event)"><i class="iconfont iconpifu"></i></div>
<div class="action" id="goods-list-color"><i class="iconfont iconyanse"></i></div>
</div>
</div>
</div>
<div class="layui-form-item" v-show="data.style == 'button'">
<label class="layui-form-label sm">文字</label>
<div class="layui-input-block">
<input type="text" v-model="data.text" maxlength="6" placeholder="请输入按钮文字" class="layui-input">
</div>
</div>
</template>
</div>
</div>
<div class="edit-style-wrap" style="display: none;">
<div class="template-edit-title">
<h3>商品样式</h3>
<div class="layui-form-item">
<label class="layui-form-label sm">商品名称</label>
<div class="layui-input-block">
<div v-for="(item,nameLineIndex) in nameLineModeList" :key="nameLineIndex" @click="data.nameLineMode=item.value" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.nameLineMode==item.value) }">
<i class="layui-anim layui-icon">{{ data.nameLineMode == item.value ? "&#xe643;" : "&#xe63f;" }}</i>
<div>{{item.text}}</div>
</div>
</div>
</div>
</div>
<div class="template-edit-title">
<h3>购买按钮</h3>
<template v-if="data.style == 'button'">
<div class="layui-form-item">
<label class="layui-form-label sm">是否加粗</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="data.fontWeight = !data.fontWeight" :class="{ 'layui-form-checked' : data.fontWeight }">
<span>{{ data.fontWeight ? '加粗' : '常规' }}</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
</div>
<slide :data="{ field : 'padding', label : '按钮边距', min: 0, max : 20 }"></slide>
<slide :data="{ field : 'aroundRadius', label: '圆角', min:0, max: 50 }"></slide>
</template>
<div class="layui-form-item">
<label class="layui-form-label sm">色调</label>
<div class="layui-input-block">
<div @click="data.theme='default'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.theme == 'default') }">
<i class="layui-anim layui-icon">{{ data.theme == 'default' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>跟随主题风格</div>
</div>
<div @click="data.theme='diy'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.theme == 'diy') }">
<i class="layui-anim layui-icon">{{ data.theme == 'diy' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>自定义</div>
</div>
</div>
</div>
<template v-if="data.theme == 'diy'">
<color v-if="data.style == 'button'" :data="{ field : 'bgColor', 'label' : '背景颜色', defaultColor : '#FF6A00' }"></color>
<color :data="{ field : 'textColor', 'label' : '文字颜色', defaultColor : '#FFFFFF' }"></color>
</template>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="custom-save js-bottom-custom-save">
<button class="layui-btn save" lay-submit lay-filter="save">保存</button>
</div>
</div>
<input id="goodsListConfig" type="hidden" value="{$config|json_encode}">
<script>
var storeIsExit = '{$store_is_exit}';
</script>
<script src="STATIC_JS/vue.js"></script>
<script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
<script src="STATIC_EXT/diyview/js/components.js"></script>
<script src="SHOP_JS/goods_list_config.js"></script>
{include file="app/shop/view/diy/iconfont_component.html"/}

View File

@@ -0,0 +1,39 @@
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label">商品编码唯一性:</label>
<div class="layui-input-block">
<input type="checkbox" name="uniqueness_switch" value="1" lay-skin="switch" {if condition="$info.uniqueness_switch == 1" }checked {/if} lay-title="启用|关闭"/>
</div>
<div class="word-aux">开启后,将验证商品编码唯一性,不能重复</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
<script>
layui.use(['form'], function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/goods/goodsno"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
layer.msg(res.message);
}
});
});
});
</script>

View File

@@ -0,0 +1,250 @@
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="add()">添加海报</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="keywords" placeholder="请输入海报名称" class="layui-input" autocomplete="off">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="manjian_tab">
<div class="layui-tab-content">
<!-- 列表 -->
<table id="poster_list" lay-filter="poster_list"></table>
</div>
</div>
<script type="text/html" id="qr_img">
<div class='table-title'>
<div class='title-pic'>
<img layer-src src="{{ns.img()}}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' ">
</div>
</div>
</script>
<script type="text/html" id="status">
<div class='table-title'>
{{# if(d.status == 0){ }}
<div class='title-pic' style="text-align:left">未启用</div>
{{# }else{ }}
<div class='title-pic text-color' style="text-align:left">启用</div>
{{# } }}
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="detail">预览</a>
<a class="layui-btn" lay-event="edit" >编辑</a>
{{# if(d.status==0){ }}
<a class="layui-btn" lay-event="start">启用</a>
{{# }else{ }}
<a class="layui-btn" lay-event="close">关闭</a>
{{# } }}
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script>
var laytpl;
layui.use(['form','laytpl'], function() {
var table,
form = layui.form,
repeat_flag = false; //防重复标识
form.render();
laytpl = layui.laytpl;
table = new Table({
elem: '#poster_list',
url: ns.url("shop/goods/poster"),
cols: [
[{
field: 'poster_id',
title: 'ID',
unresize: 'false',
width: '10%'
}, {
field: 'poster_name',
title: '海报名称',
unresize: 'false',
width: '15%',
}, {
field: 'poster_type',
title: '海报类型',
unresize: 'false',
width: '15%',
templet: function(data) {
return data.poster_type == 1 ? '商品海报': '--';
}
}, {
field: 'scan_num',
title: '扫码数',
unresize: 'false',
width: '15%',
}, {
field: 'status',
title: '海报状态',
unresize: 'false',
width: '15%',
templet: '#status'
},{
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'detail': //预览
laytpl($("#detail").html()).render(data, function (html) {
layer.open({
type: 1,
shadeClose: true,
shade: 0.3,
offset: 'auto',
fixed: false,
title: "预览",
area: ['auto', 'auto'],
btn: ['退出'],
content: html,
skin: 'detail'
});
});
break;
case 'edit': //编辑
location.hash = ns.hash("shop/goods/editposter", {"poster_id": data.poster_id});
break;
case 'delete': //删除
deletePoster(data.poster_id);
break;
case 'close': //关闭
close(data.poster_id);
break;
case 'start': //启用
start(data.poster_id);
break;
}
});
/**
* 删除
*/
function deletePoster(poster_id) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该海报吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goods/deleteposter"),
data: {
poster_id:poster_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
/**
* 关闭
*/
function close(poster_id) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定关闭吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goods/editstatus"),
data: {
poster_id:poster_id,status:0
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
});
}
/**
* 开启
*/
function start(poster_id) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定启用吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goods/editstatus"),
data: {
poster_id:poster_id,status:1
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
});
}
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
function add() {
location.hash = ns.hash("shop/goods/editposter");
}
</script>
<!-- 详情弹框html -->
<script type="text/html" id="detail">
<img layer-src src="{{ns.img(d.qr_img)}}" class="img_prev"/>
</script>

View File

@@ -0,0 +1,152 @@
<link rel="stylesheet" href="SHOP_CSS/goods_select.css">
<div class="select-goods">
<!-- 左侧固定展示商品分类 -->
<div class="select-goods-left">
<div class="select-goods-classification layui-collapse" lay-accordion lay-filter="oneCategory">
<div class="layui-colla-item">
<h2 class="layui-colla-title classification-item text-color" data-category_id="">全部分类</h2>
</div>
{foreach $category_list as $category_one_item}
<div class="layui-colla-item">
<h2 class="layui-colla-title classification-item {notempty name="$category_one_item.children"}arrow{/notempty}" data-category_id="{$category_one_item.category_id}">{$category_one_item.title}</h2>
{notempty name="category_one_item.children"}
{foreach $category_one_item.children as $category_two_item}
<div class="layui-colla-content">
<div class="select-goods-classification layui-collapse" lay-accordion lay-filter="twoCategory">
<div class="layui-colla-item">
<h2 class="layui-colla-title classification-item {notempty name="category_two_item.children"}arrow{/notempty}" data-category_id="{$category_two_item.category_id}">{$category_two_item.title}</h2>
{notempty name="category_two_item.children"}
{foreach $category_two_item.children as $category_three_item}
<div class="layui-colla-content classification-item" data-category_id="{$category_three_item.category_id}">{$category_three_item.title}</div>
{/foreach}
{/notempty}
</div>
</div>
</div>
{/foreach}
{/notempty}
</div>
{/foreach}
</div>
</div>
<!-- 右侧固定展示筛选和商品列表 -->
<div class="select-goods-right">
<!-- 筛选 -->
<div class="single-filter-box">
<div></div>
<div class="layui-form">
<div class="layui-inline">
<div class="layui-input-inline">
<select name="select_type" lay-filter="select_type">
<option value="all">全部商品</option>
<option value="selected">已选择商品</option>
</select>
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline">
<select name="label_id" lay-filter="label_id">
<option value="">选择商品标签</option>
{foreach name="$label_list" item="vo"}
<option value="{$vo['id']}">{$vo['label_name']}</option>
{/foreach}
</select>
</div>
</div>
{if $is_disabled_goods_class == 0}
<div class="layui-input-inline">
<select name="goods_class" lay-filter="goods_class">
<option value="{:join(',', array_column($goods_class_arr, 'goods_class'))}">选择商品类型</option>
{foreach name="$goods_class_arr" item="vo"}
<option value="{$vo.goods_class}" {if $goods_class == $vo.goods_class} selected{/if}>{$vo.goods_class_name}</option>
{/foreach}
</select>
</div>
{/if}
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入商品名称{if in_array($promotion, ['', 'all', 'module'])}或编码{/if}" autocomplete="off" class="layui-input len-mid">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
<!-- 分类id -->
<input type="hidden" name="category_id" value=""/>
</div>
</div>
<!-- 列表 -->
<table id="goods_list" lay-filter="goods_list"></table>
</div>
<input type="hidden" name="mode" value="{$mode}" title="商品类型,模式" />
<input type="hidden" name="maxNum" value="{$max_num}" title="最大商品数量" />
<input type="hidden" name="minNum" value="{$min_num}" title="最小商品数量" />
<input type="hidden" name="disabled" value="{$disabled}" title="不可选中" />
<input type="hidden" name="promotion" value="{$promotion}" title="营销标识" />
<input type="hidden" name="is_virtual" value="{$is_virtual}" title="是否虚拟" />
<input type="hidden" name="goods_class" value="{$goods_class}" title="商品类型" />
<input type="hidden" name="is_weigh" value="{$is_weigh}" title="是否称重" />
<input type="hidden" name="sale_channel" value="{$sale_channel ?? ''}" title="销售渠道" />
</div>
<script type="text/html" id="checkbox">
{{# if('{$promotion}' == "pintuan"){ }}
<div class="layui-hide">{{ d.goods_name = d.pintuan_name }}</div>
{{# } }}
<input type="checkbox" data-goods-id="{{d.goods_id}}" name="goods_checkbox" lay-skin="primary" lay-filter="goods_checkbox">
<input type="hidden" data-goods-id="{{d.goods_id}}" name="goods_json" value='{{ JSON.stringify(d) }}' />
<input type="hidden" data-goods-id="{{d.goods_id}}" name="goods_sku_list_json" value='{{ d.sku_list ? JSON.stringify(d.sku_list) : "" }}' />
</script>
<!-- 商品信息 -->
<script type="text/html" id="goods_info">
<div class="table-title">
{{# if(goodsSelectObj.mode == "sku"){ }}
<div class="contraction" data-goods-id="{{d.goods_id}}" data-open="0">
<span>+</span>
</div>
{{# } }}
<div class="title-pic" id="goods_img_{{d.goods_id}}">
<img layer-src src="{{ns.img(d.goods_image.split(',')[0], 'small')}}"/>
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color" title="{{d.goods_name}}">{{d.goods_name}}</a>
{{# if('{$promotion}' != 'pintuan' && '{$promotion}' != 'groupbuy' && '{$promotion}' != 'fenxiao'){ }}
<a href="javascript:;" class="multi-line-hiding text-color" >{{d.price}}</a>
{{# } }}
</div>
</div>
</script>
<!-- SKU商品列表 -->
<script type="text/html" id="skuList">
{{# for(var i=0;i<d.list.length;i++){ }}
<tr class="sku-list js-sku-list-{{d.list[i].goods_id}}" id="sku_img_{{d.list[i].goods_id}}">
<td></td>
<td>
<input type="checkbox" data-goods-id="{{d.list[i].goods_id}}" data-sku-id="{{d.list[i].sku_id}}" name="goods_sku_checkbox" lay-skin="primary" lay-filter="goods_sku_checkbox">
<input type="hidden" data-goods-id="{{d.list[i].goods_id}}" data-sku-id="{{d.list[i].sku_id}}" value='{{ JSON.stringify(d.list[i]) }}' name="goods_sku_json" />
<div class="table-title">
<div class="title-pic" id="sku_img_{{d.sku_id}}">
<img layer-src src="{{ns.img(d.list[i].sku_image, 'small')}}"/>
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color" title="{{d.list[i].sku_name}}" lay-event="preview">{{d.list[i].sku_name}}</a>
<a href="javascript:;" class="multi-line-hiding text-color" >{{d.list[i].price}}</a>
</div>
</div>
</td>
<td>{{d.list[i].stock}}</td>
<td>{{d.list[i].goods_class_name}}</td>
</tr>
{{# } }}
</script>
<script src="SHOP_JS/goods_select.js?time=20241218"></script>

View File

@@ -0,0 +1,88 @@
<style type="text/css">
.examples {cursor: pointer;}
.layui-carousel {width: 850px !important; height: 580px !important; background: #fff !important;}
.layui-carousel>[carousel-item]>* {background: #fff !important;}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label">排序方式:</label>
<div class="layui-input-block len-mid">
<select name="type">
<option value="asc" {if $goods_sort_config['type'] == 'asc'} selected {/if}>正序排列</option>
<option value="desc" {if $goods_sort_config['type'] == 'desc'} selected {/if}>倒序排列</option>
</select>
</div>
<div class="word-aux">如果选择正序排列,那么前台商品将会优先按照排序号从小到大顺序排列,当序号相同时,按照创建时间倒序排列;<br/>如果选择倒序排列时,那么前台商品会优先按照序号从大到小顺序排列,当序号相同时 ,按照创建时间倒序排列。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">默认排序值:</label>
<div class="layui-input-block len-mid">
<input type="number" class="layui-input" name="default_value" value="{$goods_sort_config['default_value']}">
</div>
<div class="word-aux">默认排值是当添加商品时,如果没有设置排序值的情况下,则按照该位置设置的默认数值参与排序 <a onclick="showDemo()" class="examples text-color">查看示例</a></div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
<script type="text/html" id="carouselInner">
<div class="layui-carousel" id="carousel">
<div carousel-item>
<img style="width: 600px; height: 500px; margin: 20px 130px;" src="SHOP_IMG/goods1.png" >
<img style="width: 600px; height: 400px; margin: 60px 125px;" src="SHOP_IMG/goods2.png" >
</div>
</div>
</script>
<script>
layui.use(['form','carousel'], function() {
var form = layui.form;
var carousel = layui.carousel;
repeat_flag = false; //防重复标识
form.render();
carousel.render({
elem: '#carousel'
,width: '100%' //设置容器宽度
,arrow: 'always' //始终显示箭头
});
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/goods/goodssort"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
layer.msg(res.message);
}
});
});
});
function showDemo(){
layer.open({
title: '查看示例',
type: 1,
area: ['900px', '660px'],
content: $('#carouselInner').html(),
})
layui.use('carousel', function(){
var carousel = layui.carousel;
//建造实例
carousel.render({
elem: '#carousel'
,width: '100%' //设置容器宽度
,arrow: 'always' //始终显示箭头
});
});
}
</script>

View File

@@ -0,0 +1,329 @@
<link rel="stylesheet" href="STATIC_EXT/colorPicker/css/colorpicker.css" />
<link rel="stylesheet" href="STATIC_EXT/diyview/css/diyview.css?time=20240316" />
<link rel="stylesheet" href="SHOP_CSS/guess_you_like.css"/>
<div id="diyView" v-if="lazyLoad">
<div class="preview-wrap">
<div class="preview-restore-wrap">
<div class="div-wrap">
<div class='diy-view-wrap layui-form' :style="{ backgroundColor : global.pageBgColor }">
<div class="preview-head">
<tabbar :global="global"></tabbar>
</div>
<div class="preview-block">
<div class="preview-draggable">
<h3 class="goods-recommend-title" v-if="data.title">
<span>{{ data.title }}</span>
</h3>
<div class="goods-list row1-of2 style-2">
<div class="goods-item" v-for="(index) in [1,2,3,4]" :key="index">
<div class="goods-img">
<img :src="changeImgUrl('public/static/img/default_img/square.png')" />
</div>
<div class="info-wrap">
<div class="goods-name">商品名称</div>
<div class="pro-info">
<div class="discount-price">
<div class="price-wrap">
<span class="unit text-color">¥</span>
<span class="price text-color">{{ index * 100 }}</span>
<span class="unit text-color">.00</span>
</div>
<div class="delete-price">¥198</div>
<div class="sale">已售63件</div>
</div>
<template v-if="data.control">
<!-- 购物车图标 -->
<div v-if="data.style == 'icon-cart'" class="cart shopping-cart-btn iconfont icongouwuche" :style="{ color : data.textColor }"></div>
<!--加号图标 -->
<div v-else-if="data.style == 'icon-add'" class="cart plus-sign-btn iconfont iconjia2" :style="{ color : data.textColor }"></div>
<!-- 按钮 -->
<div v-else-if="data.style == 'button'" class="cart buy-btn" :style="{fontWeight: (data.fontWeight ? 'bold' : 'normal'), backgroundColor : data.bgColor, color : data.textColor,borderRadius : data.aroundRadius + 'px',padding : ('0 '+ data.padding + 'px') }">{{ data.text }}</div>
<!-- 自定义图标 -->
<div v-else-if="data.style == 'icon-diy'" class="icon-diy">
<iconfont :icon="data.iconDiy.icon" v-if="data.iconDiy.icon" :value="data.iconDiy.style ? data.iconDiy.style : ''"></iconfont>
</div>
</template>
</div>
</div>
</div>
</div>
</div>
<div class="edit-attribute">
<div class="attr-wrap">
<div class="restore-wrap">
<div class="attr-title">
<span class="title">商品推荐</span>
<div class="tab-wrap">
<span class="active bg-color" data-type="content">内容</span>
<span data-type="style">样式</span>
</div>
</div>
<div class="edit-content-wrap">
<div class="layui-form-item">
<label class="layui-form-label sm">标题名称</label>
<div class="layui-input-block">
<input type="text" name="title" v-model="data.title" maxlength="15" placeholder="请输入标题" class="layui-input" autocomplete="off" lay-verify="required" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label sm">适用页面</label>
<div class="layui-input-block">
<div @click="addSupportPage('goods_detail')" class="layui-unselect layui-form-checkbox" :class="{ 'layui-form-checked' : data.supportPage.indexOf('goods_detail') != -1 }" lay-skin="primary">
<span>商品详情</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
<div @click="addSupportPage('cart')" class="layui-unselect layui-form-checkbox" :class="{ 'layui-form-checked' : data.supportPage.indexOf('cart') != -1 }" lay-skin="primary">
<span>购物车</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
<div @click="addSupportPage('collect')" class="layui-unselect layui-form-checkbox" :class="{ 'layui-form-checked' : data.supportPage.indexOf('collect') != -1 }" lay-skin="primary">
<span>关注页面</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
<div @click="addSupportPage('pay')" class="layui-unselect layui-form-checkbox" :class="{ 'layui-form-checked' : data.supportPage.indexOf('pay') != -1 }" lay-skin="primary">
<span>支付结果页</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
<div @click="addSupportPage('order_detail')" class="layui-unselect layui-form-checkbox" :class="{ 'layui-form-checked' : data.supportPage.indexOf('order_detail') != -1 }" lay-skin="primary">
<span>订单详情</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
{if addon_is_exit('supermember')}
<div @click="addSupportPage('super_member')" class="layui-unselect layui-form-checkbox" :class="{ 'layui-form-checked' : data.supportPage.indexOf('super_member') != -1 }" lay-skin="primary">
<span>超级会员卡</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
{/if}
{if addon_is_exit('divideticket')}
<div @click="addSupportPage('guafen')" class="layui-unselect layui-form-checkbox" :class="{ 'layui-form-checked' : data.supportPage.indexOf('guafen') != -1 }" lay-skin="primary">
<span>好友瓜分券</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
{/if}
{if addon_is_exit('fenxiao')}
<div @click="addSupportPage('fenxiao_level')" class="layui-unselect layui-form-checkbox" :class="{ 'layui-form-checked' : data.supportPage.indexOf('fenxiao_level') != -1 }" lay-skin="primary">
<span>分销等级页</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
{/if}
</div>
</div>
<div class="word-aux diy-word-aux">控制猜你喜欢模块在页面中的显示与隐藏</div>
<div class="layui-form-item">
<label class="layui-form-label sm">数据来源</label>
<div class="layui-input-block">
<div @click="data.sources = 'sort'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.sources == 'sort') }">
<i class="layui-anim layui-icon">{{ data.sources == 'sort' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>按排序获取</div>
</div>
<div @click="data.sources = 'browse'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.sources == 'browse') }">
<i class="layui-anim layui-icon">{{ data.sources == 'browse' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>按最近浏览</div>
</div>
<div @click="data.sources = 'sale'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.sources == 'sale') }">
<i class="layui-anim layui-icon">{{ data.sources == 'sale' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>按销量获取</div>
</div>
<div @click="data.sources = 'diy'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.sources == 'diy') }">
<i class="layui-anim layui-icon">{{ data.sources == 'diy' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>手动设置</div>
</div>
</div>
<div class="word-aux diy-word-aux js-sources-tips"></div>
</div>
<div class="layui-form-item js-diy-select-goods" v-if="data.sources == 'diy'">
<label class="layui-form-label sm">手动选择</label>
<div class="layui-input-block">
<div class="selected-style">
<span @click="addGoods()" :class="{ 'text-color' : data.goodsIds.length > 0 }">{{ data.goodsIds.length > 0 ? '已选' + data.goodsIds.length + '个' : '选择商品' }}</span>
<i class="iconfont iconyoujiantou"></i>
</div>
</div>
</div>
<div class="template-edit-title">
<h3>购买按钮</h3>
<div class="layui-form-item">
<label class="layui-form-label sm">是否显示</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="data.control = !data.control" :class="{ 'layui-form-checked' : data.control }">
<span>{{ data.control ? '显示' : '隐藏' }}</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
</div>
<template v-if="data.control">
<div class="layui-form-item">
<label class="layui-form-label sm">购物车事件</label>
<div class="layui-input-block">
<div @click="data.cartEvent='detail'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.cartEvent=='detail') }">
<i class="layui-anim layui-icon">{{ data.cartEvent=='detail' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>跳转商品详情</div>
</div>
<div @click="data.cartEvent='cart'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.cartEvent=='cart') }">
<i class="layui-anim layui-icon">{{ data.cartEvent=='cart' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>加入购物车</div>
</div>
</div>
<p class="word-aux" style="margin-left: 100px;" v-if="data.cartEvent=='cart'">只有实物商品才能加入购物车,虚拟商品会跳转到商品详情</p>
</div>
<div class="layui-form-item btn-style">
<label class="layui-form-label sm">样式</label>
<div class="layui-input-block">
<div class="item" :class="{ 'border-color' : data.style == 'button' }" @click="data.style = 'button';data.textColor= data.textColor == '#FF6A00' ? '#FFFFFF' : data.textColor">
<span class="buy-btn bg-color">按钮</span>
</div>
<div class="item" :class="{ 'border-color' : data.style == 'icon-cart' }" @click="data.style = 'icon-cart';data.textColor= data.textColor == '#FFFFFF' ? '#FF6A00' : data.textColor">
<span class="shopping-cart-btn iconfont icongouwuche text-color border-color"></span>
</div>
<div class="item" :class="{ 'border-color' : data.style == 'icon-add' }" @click="data.style = 'icon-add';data.textColor= data.textColor == '#FFFFFF' ? '#FF6A00' : data.textColor">
<span class="plus-sign-btn iconfont iconjia2 text-color border-color"></span>
</div>
<div class="item" :class="{ 'border-color' : data.style == 'icon-diy' }" @click="data.style = 'icon-diy';data.textColor= data.textColor == '#FFFFFF' ? '#FF6A00' : data.textColor">
<span class="diy-btn text-color border-color">自定义</span>
</div>
</div>
<div class="layui-input-block diy-icon" v-show="data.style == 'icon-diy'">
<img-icon-upload :data="{data : data.iconDiy, displayType : 'icon'}"></img-icon-upload>
<div class="action-box">
<div class="action" @click="iconStyle($event)"><i class="iconfont iconpifu"></i></div>
<div class="action" id="goods-list-color"><i class="iconfont iconyanse"></i></div>
</div>
</div>
</div>
<div class="layui-form-item" v-show="data.style == 'button'">
<label class="layui-form-label sm">文字</label>
<div class="layui-input-block">
<input type="text" v-model="data.text" maxlength="6" placeholder="请输入按钮文字" class="layui-input">
</div>
</div>
</template>
</div>
</div>
<div class="edit-style-wrap" style="display: none;">
<div class="template-edit-title">
<h3>商品样式</h3>
<div class="layui-form-item">
<label class="layui-form-label sm">商品名称</label>
<div class="layui-input-block">
<div v-for="(item,nameLineIndex) in nameLineModeList" :key="nameLineIndex" @click="data.nameLineMode=item.value" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.nameLineMode==item.value) }">
<i class="layui-anim layui-icon">{{ data.nameLineMode == item.value ? "&#xe643;" : "&#xe63f;" }}</i>
<div>{{item.text}}</div>
</div>
</div>
</div>
</div>
<div class="template-edit-title">
<h3>购买按钮</h3>
<template v-if="data.style == 'button'">
<div class="layui-form-item">
<label class="layui-form-label sm">是否加粗</label>
<div class="layui-input-block">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary" @click="data.fontWeight = !data.fontWeight" :class="{ 'layui-form-checked' : data.fontWeight }">
<span>{{ data.fontWeight ? '加粗' : '常规' }}</span>
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
</div>
<slide :data="{ field : 'padding', label : '按钮边距', min: 0, max : 20 }"></slide>
<slide :data="{ field : 'aroundRadius', label: '圆角', min:0, max: 50 }"></slide>
</template>
<div class="layui-form-item">
<label class="layui-form-label sm">色调</label>
<div class="layui-input-block">
<div @click="data.theme='default'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.theme == 'default') }">
<i class="layui-anim layui-icon">{{ data.theme == 'default' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>跟随主题风格</div>
</div>
<div @click="data.theme='diy'" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : (data.theme == 'diy') }">
<i class="layui-anim layui-icon">{{ data.theme == 'diy' ? "&#xe643;" : "&#xe63f;" }}</i>
<div>自定义</div>
</div>
</div>
</div>
<template v-if="data.theme == 'diy'">
<color v-if="data.style == 'button'" :data="{ field : 'bgColor', 'label' : '背景颜色', defaultColor : '#FF6A00' }"></color>
<color :data="{ field : 'textColor', 'label' : '文字颜色', defaultColor : '#FFFFFF' }"></color>
</template>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="custom-save js-bottom-custom-save">
<button class="layui-btn save" lay-submit lay-filter="save">保存</button>
</div>
</div>
<input id="guessYouLikeConfig" type="hidden" value="{$config|json_encode}">
<script>
var storeIsExit = '{$store_is_exit}';
</script>
<script src="STATIC_JS/vue.js"></script>
<script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
<script src="STATIC_EXT/diyview/js/components.js"></script>
<script src="SHOP_JS/guess_you_like.js"></script>
{include file="app/shop/view/diy/iconfont_component.html"/}

View File

@@ -0,0 +1,105 @@
<style>
.keywords-item{position:relative;margin-bottom:10px}
.keywords-item .layui-icon-close{font-size:12px;position:absolute;top:-8px;right:-8px;width:16px;height:16px;line-height:16px;text-align:center;color:#fff;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;background:rgba(0,0,0,.3);cursor:pointer}
.examples {cursor: pointer;}
</style>
<div class="layui-collapse tips-wrap">
<div class="layui-colla-item">
<h2 class="layui-colla-title">操作提示</h2>
<ul class="layui-colla-content layui-show">
<li>热门搜索,将显示在前台搜索框下面,前台点击时直接作为关键词进行搜索 <a onclick="showDemo()" class="examples text-color">查看示例</a></li>
</ul>
</div>
</div>
<div class="layui-form">
<div class="layui-card card-common card-brief">
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">首页搜索的关键字:</label>
<div class="layui-input-block keywords-block">
{if !empty($hot_search_words.words_array)}
{foreach $hot_search_words.words_array as $k => $v}
<div class="layui-input-inline keywords-item">
<input type="text" name="words[]" lay-verify="required" value="{$v}" placeholder="" autocomplete="off" class="layui-input len-short">
<i class="layui-icon layui-icon-close" ></i>
</div>
{/foreach}
{else/}
<div class="layui-input-inline keywords-item">
<input type="text" name="words[]" lay-verify="required" value="" placeholder="" autocomplete="off" class="layui-input len-short">
<i class="layui-icon layui-icon-close" ></i>
</div>
{/if}
</div>
</div>
<div class="layui-form-item">
<div class="word-aux">首页显示的搜索关键字,可以通过拖拽来调整顺序</div>
<label class="layui-form-label"></label>
<div class="layui-input-block">
<div class="layui-input-inline">
<a class="text-color" href="javascript:void(0)" onclick="addKeywords()">添加</a>
</div>
</div>
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script>
layui.use('form', function() {
var form = layui.form,repeat_flag=false;
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/goods/hotsearchwords"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
layer.msg(res.message);
}
});
});
$(".keywords-item").arrangeable({
//拖拽结束后执行回调
callback: function (e) {
}
});
$('body').off('click', ".keywords-item .layui-icon-close").on('click', ".keywords-item .layui-icon-close",function () {
$(this).parent().remove();
});
});
function addKeywords(){
var html = '<div class="layui-input-inline keywords-item"><input type="text" name="words[]" lay-verify="required" value="" placeholder="" autocomplete="off" class="layui-input len-short"><i class="layui-icon layui-icon-close" ></i></div>';
$('.keywords-block').append(html);
setTimeout(function () {
$(".keywords-item").arrangeable({
//拖拽结束后执行回调
callback: function (e) {
}
});
}, 1);
}
function showDemo(){
layer.open({
title: '查看示例',
type: 1,
area: ['500px', '660px'],
content: '<img style="margin: 20px 80px;" src="SHOP_IMG/hot_search.png">'
})
}
</script>

191
app/shop/view/goods/import.html Executable file
View File

@@ -0,0 +1,191 @@
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
<style type="text/css">
.data_load {display: flex;flex-direction: column;align-items: center;margin-top:100px;}
.data_load-img {width: 60px;height: 60px;}
.data_load-img img {width: 100%;height: 100%;}
.data_load-title {color: #333;font-size: 18px;margin-top: 15px;}
.data_load-content {color: #333;font-size: 14px;margin-top: 20px;}
.data_load-footer {color:var(--base-color);font-size: 14px;}
.data_load-content span {display:inline-block;}
.body-content {background: none !important;padding: 0 !important;margin: 0 !important;}
.footer {padding-bottom: 0px !important;}
.common-wrap {position: relative;display: flex;padding: 25px 140px;margin: 15px 15px 0 15px;background:#fff}
.common-wrap .tips-wrap {margin: 0px 20px;min-width: 130px;background-color: #ffffff;border-color: #ffffff;border-radius: 2px;}
.common-wrap .tips-wrap>span{display: block;width: 30px;height: 30px;line-height: 30px;text-align: center;color: var(--base-color);border-radius: 50px;border: 1px solid var(--base-color);font-size: 18px;margin: 0 auto;font-weight: bolder;margin-bottom: 15px;}
.common-wrap .tips-wrap>p{text-align: center;}
.common-wrap .interval-wrap{width: 300px;height: 45px;position: relative;border-bottom: 1px solid #e6e6e6;}
.common-wrap .interval-wrap>span{display: block;position: absolute;bottom: -5px;right: 0px;width: 8px;height: 8px;border: 1px solid #e6e6e6;transform: rotateZ(45deg);border-bottom: 0px;border-left: 0px;}
.layui-tab-brief {margin: 15px 15px 0px 15px;}
.card-common{padding-top: 20px;}
</style>
<form class="layui-form">
<div class="layui-form">
<div class="common-wrap">
<div class="tips-wrap">
<span>1</span>
<p>提前在系统内维护好</p>
<p><a class="text-color" href="{:href_url('shop/goodscategory/lists')}" target="_blank">商品分类</a></p>
</div>
<div class="interval-wrap">
<span></span>
</div>
<div class="tips-wrap">
<span>2</span>
<p>按商品类型下载商品导入模板,录入商品信息。</p>
</div>
<div class="interval-wrap">
<span></span>
</div>
<div class="tips-wrap">
<span>3</span>
<p>设置商品发布渠道,上传文件进行导入。</p>
</div>
</div>
<!--<div class="layui-collapse tips-wrap">-->
<!--<div class="layui-colla-item">-->
<!--<h2 class="layui-colla-title">操作提示</h2>-->
<!--<ul class="layui-colla-content layui-show">-->
<!--<li>第 1 步:提前在系统内维护好<a href="{:href_url('shop/goodscategory/lists')}" class="text-color">商品分类</a></li>-->
<!--</ul>-->
<!--<ul class="layui-colla-content layui-show">-->
<!--<li>第 2 步:按商品类型下载商品导入模板,录入商品信息。</li>-->
<!--</ul>-->
<!--<ul class="layui-colla-content layui-show">-->
<!--<li>第 3 步:设置商品发布渠道,上传文件进行导入。</li>-->
<!--</ul>-->
<!--</div>-->
<!--</div>-->
<div class="layui-tab-brief" lay-filter="goods_tab">
<div>
<div class="layui-tab-item layui-show">
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">商品导入</span>
<a href="javascript:location.reload()" id="contine" style="display:none;"><span style="color:var(--base-color)">继续导入</span></a><a href="{:href_url('shop/goods/importrecordlist')}" id="list" ><span style="color:var(--base-color)">导入历史</span></a>
</div>
<div class="layui-card-body">
<div class="layui-card-body" id="import">
<div class="layui-form-item">
<label class="layui-form-label">商品类型配置:</label>
<div class="layui-input-block">
<ul>
<li><input type="radio" lay-filter="encrypt" title="实物商品" class="type" name="type" value="1" checked><a class="text-color" href="{:img('public/static/img/goods_csv/goods.xlsx')}" target="_blank">下载模板</a>
</li>
</ul>
<ul>
<li><input type="radio" lay-filter="encrypt" title="虚拟商品" class="type" name="type" value="2"><a class="text-color" href="{:img('public/static/img/goods_csv/virtualgoods.xlsx')}" target="_blank">下载模板</a></li>
</ul>
<ul>
<li><input type="radio" lay-filter="encrypt" title="电子卡密" class="type" name="type" value="3"><a class="text-color" href="{:img('public/static/img/goods_csv/virtualcard.xlsx')}" target="_blank">下载模板</a></li>
</ul>
</div>
</div>
<div class="layui-form-item goods-image-wrap" style="margin-top: 20px">
<label class="layui-form-label">商品图片:</label>
<div class="layui-input-block">
<div>在导入前请先将商品图片上传到商品相册,<a href="{:href_url('shop/album/lists')}" class="text-color" target="_blank">去上传</a></div>
</div>
</div>
<div class="layui-form-item" style="margin-top: 30px">
<label class="layui-form-label">上传数据:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box" id="xlsUpload">
<div class="upload-default">
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>上传商品导入数据</p>
</div>
</div>
</div>
</div>
</div>
<div class="word-aux">请上传xlsx文件最大不要超过10M</div>
</div>
</div>
<!-- 商品导入成功 -->
<div class="data_load" style="display: none" id="success">
<div class="data_load-img"><img src="SHOP_IMG/success.png" /></div>
<div class="data_load-title">商品导入完成</div>
<div class="data_load-content">成功导入<span class="success-count text-color">0</span>条数据,导入失败<span class="error-count text-color">0</span>条数据</div>
<!-- <div class="data_load-footer" style="cursor:pointer;"><span id="exportError" style="display:none" onclick="exportError();">下载失败记录</span></div>-->
</div>
</div>
</div>
</div>
<!-- 商品详情 -->
<div class="layui-tab-item">
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js">
</script>
</div>
</div>
</div>
</div>
</form>
<script>
layui.use(['form', 'upload'], function() {
var form = layui.form,
upload = layui.upload,
type = 1;
form.on('radio(encrypt)', function(data){
type = data.value;
});
form.render();
//商品导入
var uploadInst = upload.render({
elem: '#xlsUpload',
url: ns.url("shop/goods/import"),
data:{type:function () {
return type
}},
field: 'xlsx',
accept:'file',
acceptMime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
exts: 'xlsx',
before: function(obj) { //obj参数包含的信息跟 choose回调完全一致可参见上文。
var index = layer.load(1, {
shade: [0.1, '#fff'], //0.1透明度的白色背景
time: 0
});
},
done: function(res) {
layer.closeAll();
if (res.code >= 0) {
$("#upload").attr("style","display:none;");//隐藏div
$("#import").attr("style","display:none;");//隐藏div
$("#contine").attr("style","display:flex;");//显示div
$("#list").attr("style","display:none;");//显示div
$("#success").attr("style","display:flex;");//显示div
$(".success-count").text(res.data.success_count);
$(".error-count").text(res.data.error_count);
if (res.data.error_count > 0) {
$("#exportError").attr("style","display:flex;");
} else {
$("#exportError").attr("style","display:none;");
}
} else {
layer.msg(res.message);
}
}
});
});
</script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script src="__STATIC__/ext/video/video.min.js"></script>
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>

View File

@@ -0,0 +1,279 @@
<style>
.progress-layer {width:400px;background:#fff;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:1px 1px 50px rgba(0,0,0,.3);padding:20px 20px;z-index:100;display:none;}
.progress-layer h3 {line-height:1;margin-bottom:15px;text-align:center;font-size:14px;}
.progress-layer .layui-progress-big,.progress-layer .layui-progress-big .layui-progress-bar {height:14px;line-height:14px;}
.progress-layer .layui-progress-text {line-height:14px;}
.goods-info {padding: 5px 0;align-items: center;flex-wrap:unset!important;}
.goods-info .room-name {padding-left: 5px;line-height: 1}
.goods-info img {width:50px;height: 50px;}
.single-filter-box{justify-content: end}
.add-good-form .layui-input-block {width: 450px;}
.add-good-form .layui-form-item {position: relative;}
.add-good-form .category-wrap {position: absolute; left: 150px; top: 40px; z-index: 9; background-color: #FFFFFF; border: 1px solid #EEEEEE;}
.add-good-form .category-wrap .category-list {display: flex;}
.add-good-form .category-wrap ul {width: 151px; height: 300px; overflow: auto; background-color: #FFFFFF; border-right: 1px solid #EEEEEE; box-sizing: border-box;}
.add-good-form .category-wrap ul:last-child {border-right: 1px solid #EEEEEE;}
.add-good-form .category-wrap ul li {line-height: 26px; padding: 0 15px; cursor: pointer;}
.add-good-form .category-wrap .category-btn {width: 100%; padding: 10px 15px; box-sizing: border-box; border-top: 1px solid #EEEEEE;}
.layui-layer-page .layui-layer-content {overflow: auto !important; position: relative;}
.goods-category-mask {width: 100%; height: 100%; position: absolute; left: 0; top: 0; z-index: 9;}
.selected-style {color: #FFFFFF;}
.reject-reason {height: 100%;padding-bottom: 20px;}
.reason .layui-layer-content {overflow: unset!important}
.layui-layout-admin .screen .layui-colla-content{margin-bottom: 15px;}
.layui-layout-admin .layui-form-item .layui-input-inline {
background-color: #fff;
}
</style>
<div class="single-filter-box">
<a href="{:href_url('shop/goods/import')}"><button class="layui-btn">导入商品</button></a>
</div>
<!-- 筛选面板 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show">
<div class="layui-form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">导入时间:</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="end_time" placeholder="结束时间" id="end_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<button class="layui-btn layui-btn-primary date-picker-btn date-picker-btn-seven" onclick="datePick(7, this);return false;">近7天</button>
<button class="layui-btn layui-btn-primary date-picker-btn date-picker-btn-thirty" onclick="datePick(30, this);return false;">近30天</button>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</div>
</form>
</div>
</div>
<table id="record_list" lay-filter="record_list"></table>
<!-- 直播间信息 -->
<script type="text/html" id="goodsinfo">
<div class="table-btn goods-info">
<img src="{{ ns.img(d.cover_img) }}">
<span class="room-name" title="{{ d.goods_name }}">{{ d.goods_name }}</span>
</div>
</script>
<script type="text/html" id="reason">
<div class="reject-reason">
{{d.reject_reason}}
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
{{# if(d.fail_num > 0){ }}
<a class="layui-btn" href="{{ ns.url('shop/goods/download?request_mode=download&id=' + d.id) }}" target="_blank">下载失败数据</a>
{{# } }}
</div>
</script>
<div class="progress-layer">
<h3>正在同步中...</h3>
<div class="layui-progress layui-progress-big" lay-showPercent="true" lay-filter="progress">
<div class="layui-progress-bar layui-bg-blue" lay-percent="0%"></div>
</div>
</div>
<script>
var form, table, element, laytpl,
download_flag = false,
goodsId = [], selectedGoodsId = [], goods_list = [],out_product_id='';
reLoad();
function reLoad() {
layui.use(['form', 'element', 'laytpl','laydate'], function () {
form = layui.form;
element = layui.element;
laytpl = layui.laytpl;
var laydate = layui.laydate;
form.render();
//渲染时间
laydate.render({
elem: '#start_time'
,type: 'datetime'
,change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
laydate.render({
elem: '#end_time'
,type: 'datetime'
,change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
// 搜索功能
form.on('submit(search)', function (data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
table = new Table({
elem: '#record_list',
url: ns.url("/shop/goods/importrecordlist"),
where: {
"start_time": $("#start_time").val(),
"end_time": $("#end_time").val(),
},
cols: [
[
{
title: '导入文件名称',
unresize: 'false',
width: '15%',
field: 'record_name'
},{
title: '站点',
unresize: 'false',
width: '15%',
field: 'site_id'
}, {
title: '导入时间',
unresize: 'false',
width: '15%',
field: 'import_time'
}, {
title: '成功数量',
unresize: 'false',
width: '15%',
field: 'success_num'
}, {
field: 'fail_num',
title: '失败数量',
unresize: 'false',
width: '15%'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
table.tool(function (obj) {
var data = obj.data;
switch (obj.event) {
case 'download': //下载文件
download(data.id);
break;
}
})
// 批量操作
table.bottomToolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].out_product_id);
switch (obj.event) {
case "delete":
deleteGoods(id_array.toString());
break;
case "listing":
listingGoods(id_array.toString());
break;
case "dellisting":
dellistingGoods(id_array.toString());
break;
}
});
function download(id){
layer.confirm('是否确定要下载该文件?', {title: '提示'}, function (index) {
if (download_flag) return;
download_flag = true;
layer.close(index);
$.ajax({
url: ns.url("/shop/goods/download"),
data: {id: id},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
download_flag = false;
table.reload();
}
});
});
}
});
}
/**
* 七天时间
*/
function datePick(date_num,event_obj){
$(".date-picker-btn").removeClass("selected");
$(event_obj).addClass('selected');
Date.prototype.Format = function (fmt,date_num) { //author: meizz
this.setDate(this.getDate()-date_num);
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"H+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};
// var now_time = new Date().Format("yyyy-MM-dd HH:mm:ss",0);//当前日期
var now_time = new Date().Format("yyyy-MM-dd 23:59:59",0);//当前日期
var before_time = new Date().Format("yyyy-MM-dd 00:00:00",date_num-1);//前几天日期
$("input[name=start_time]").val(before_time,0);
$("input[name=end_time]").val(now_time,date_num-1);
}
</script>
<script type="text/html" id="table_goods_list">
{{# layui.each(d, function(index, item) { }}
<tr>
<td>
<div class="table-title">
<div class="title-pic">
{{# if(item.goods_image){ }}
<img layer-src src="{{ns.img(item.goods_image.split(',')[0],'small')}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{item.goods_name}}">{{item.goods_name}}</a>
</div>
</div>
</td>
</tr>
{{# }) }}
</script>

762
app/shop/view/goods/lists.html Executable file
View File

@@ -0,0 +1,762 @@
<link rel="stylesheet" href="SHOP_CSS/goods_lists.css">
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css"/>
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
<style>
.layui-table .table-btn {justify-content:flex-end;}
.batch-operation-sku {display:block;}
.batch-operation-sku .layui-form-label {width:unset}
.batch-operation-sku span {margin-right:10px;display:inline-block;height:34px;line-height:34px;cursor:pointer;}
.batch-operation-sku input {display:inline-block;}
.batch-operation-sku input,.batch-operation-sku button {display:none;}
.sku-table {display:none;-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none}
.sku-table .layui-input-block .img-wrap {display:inline-block;position:relative;margin:8px;border:1px solid #e5e5e5;}
.sku-table .layui-input-block .img-wrap a {display:block;width:50px;height:50px;line-height:50px;text-align:center;overflow:hidden;}
.sku-table .layui-input-block .img-wrap a img {width:100%;}
.sku-table .layui-input-block .img-wrap .operation {position:absolute;top:0;z-index:10;width:50px;height:50px;background:rgba(0,0,0,0.3);color:#fff;cursor:pointer;line-height:50px;text-align:center;display:none;}
.sku-table .layui-input-block .img-wrap:hover .operation {display:block;}
.sku-table .layui-input-block .img-wrap .operation i {font-size:20px;}
.sku-table .layui-input-block .upload-sku-img {border:1px dashed #d9d9d9;width:50px;height:50px;border-radius:2px;background-color:#fbfbfb;text-align:center;cursor:pointer;margin:8px;display:inline-block;padding:15px 0;box-sizing:border-box;}
.sku-table .layui-input-block .layui-form-radio {margin:6px 0px 0 0;padding:0;}
.sku-table .layui-input-block .layui-form-radio>i {margin-right:3px;}
.batch-operation-sku .batch-btn {display:flex}
.batch-operation-sku .batch-btn input {margin-right:10px}
.category-wrap {width:185px!important;display: inline-block}
.el-input__inner {height:34px;line-height:34px;border-radius:2px;}
.goods-class-name {display: inline-block;white-space: nowrap;background: #eee;color: #999;font-size: 12px;padding: 3px 5px; line-height: 1;border-radius: 4px;}
.promotion-addon {display: flex;flex-wrap: wrap;}
input.disabled{cursor: not-allowed;}
</style>
<!-- 按钮容器 -->
<div class="single-filter-box top">
<button class="layui-btn" onclick="add()">添加商品</button>
</div>
<!-- 筛选面板 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商品名称</label>
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入商品名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品编码</label>
<div class="layui-input-inline">
<input type="text" name="sku_no" placeholder="请输入商品编码" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品分类</label>
<div class="layui-input-inline category-wrap">
<input type="text" autocomplete="off" show="false" class="layui-input select-category" id="select_category" placeholder="请选择" readonly="" style="display: inline-block !important;">
</div>
<input type="text" name="category_id" style="width: 1px;height: 1px;visibility: hidden;">
</div>
<div class="layui-inline">
<label class="layui-form-label">商品品牌</label>
<div class="layui-input-inline">
<select name="brand_id" lay-filter="brand_id">
<option value="">全部</option>
{foreach name="$brand_list" item="brand_vo"}
<option value="{$brand_vo['brand_id']}">{$brand_vo['brand_name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商品类型</label>
<div class="layui-input-inline">
<select name="goods_class" lay-filter="goods_class">
<option value="">全部</option>
{foreach name="$goods_class" item="vo"}
<option value="{$vo['goods_class']}">{$vo['goods_class_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品标签</label>
<div class="layui-input-inline">
<select name="label_id" lay-filter="label_id">
<option value="">全部</option>
{foreach name="$label_list" item="vo"}
<option value="{$vo['id']}">{$vo['label_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">营销活动</label>
<div class="layui-input-inline">
<select name="promotion_type" lay-filter="promotion_type">
<option value="">全部</option>
{foreach name="$promotion_type" item="vo"}
<option value="{$vo['type']}">{$vo['name']}</option>
{/foreach}
</select>
</div>
</div>
{if $is_install_supply}
<div class="layui-inline">
<label class="layui-form-label">供应商</label>
<div class="layui-input-inline">
<select name="supplier_id">
<option value="">全部</option>
{foreach name="$supplier_list" item="vo"}
<option value="{$vo['supplier_id']}">{$vo['title']}</option>
{/foreach}
</select>
</div>
</div>
{/if}
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商品销量</label>
<div class="layui-input-inline">
<input type="number" name="start_sale" id="start_sale" lay-verify="int" placeholder="最低销量" class="layui-input" autocomplete="off">
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input type="number" name="end_sale" id="end_sale" lay-verify="int" placeholder="最高销量" class="layui-input" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品价格</label>
<div class="layui-input-inline input-append">
<input type="flaot" name="start_price" id="start_price" lay-verify="float" placeholder="最低价格" class="layui-input" autocomplete="off">
</div>
<div class="layui-form-mid"></div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline input-append">
<input type="flaot" name="end_price" id="end_price" lay-verify="float" placeholder="最高价格" class="layui-input" autocomplete="off">
</div>
<div class="layui-form-mid"></div>
</div>
</div>
<input type="hidden" name="stockalarm" value="{$stockalarm}"/>
<input type="hidden" name="goods_state" value="{$goods_state}"/>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button class="layui-btn layui-btn-primary" lay-submit lay-filter="batch_export_goods">导出商品</button>
<a class="layui-btn layui-btn-primary" href="{:href_url('shop/goods/export')}" target="_blank">导出记录</a>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="goods_list_tab">
<ul class="layui-tab-title">
<li {if $goods_state=='1' }class="layui-this" {/if} lay-id="1" data-type="goods_state">销售中</li>
<li {if $goods_state=='0' }class="layui-this" {/if} lay-id="0" data-type="goods_state">仓库中</li>
<li {if $stockalarm=='1' } class="layui-this" {/if} lay-id="1" data-type="stockalarm">预警中</li>
<li {if $goods_state=='' && $stockalarm==0}class="layui-this" {/if} lay-id="">全部</li>
</ul>
<div class="layui-tab-content">
<!-- 列表 -->
<table id="goods_list" lay-filter="goods_list"></table>
</div>
</div>
<!-- 商品信息 -->
<script type="text/html" id="goods_info">
<div class="table-title">
<div class="contraction" data-goods-id="{{d.goods_id}}" data-open="0">
<span>+</span>
</div>
<div class="title-pic" id="goods_img_{{d.goods_id}}" {if addon_is_exit('pc')} onclick="pc_url({{d.sku_id}})" {/if}>
<!--layer-src="{{ns.img(d.goods_image.split(',')[0], 'big')}}" -->
<img src="{{ns.img(d.goods_image.split(',')[0], 'small')}}"/>
</div>
{if addon_is_exit('pc')}
<div class="title-content" onclick="pc_url({{d.sku_id}})">
<a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{d.goods_name}}">{{# if(d.supplier_name){ }}{{d.supplier_name}}{{# } }}{{d.goods_name}}</a>
{else /}
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{d.goods_name}}" lay-event="preview">{{d.goods_name}}</a>
{/if}
<!-- <span class="goods-class-name">{{ d.goods_class_name }}</span>-->
{{# if(d.promotion_addon && d.promotion_addon_list){ }}
<span class="promotion-addon">
{{# for(var i=0;i<d.promotion_addon_list.length;i++){ }}
<a href="{{ns.url( d.promotion_addon_list[i].url )}}">
<span class="bg-color" title="{{d.promotion_addon_list[i].name}}">{{ d.promotion_addon_list[i].short }}</span>
</a>
{{# } }}
</span>
{{# } }}
{{# if(d.label_name){ }}
<span class="promotion-addon" >
<span class="bg-color" style="background:red !important;">{{d.label_name}}</span>
</span>
{{# } }}
{{# if(d.is_consume_discount ==1){ }}
<span class="promotion-addon vips_price" data-goods-id="{{d.goods_id}}" data-open="0">
<span class="layui-bg-black " title="会员价"><span class="iconfont icon"> VIP</span></span>
</span>
{{# } }}
{{# if(d.sku_no){ }}
<div>
<span>{{d.sku_no}}</span>
</div>
{{# } }}
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="operation-wrap" data-goods-id="{{d.goods_id}}">
<div class="popup-qrcode-wrap"><img class="popup-qrcode-loadimg" src="__STATIC__/loading/loading.gif"/></div>
<div class="table-btn">
<a class="layui-btn text-color" lay-event="edit">编辑</a>
{{# if(d.goods_class == 2 || d.goods_class == 4){ }}
<a class="layui-btn" lay-event="verify">核销码</a>
{{# } }}
{{# if(d.goods_class == 3){ }}
<a class="layui-btn" lay-event="carmichael">卡密管理</a>
{{# } }}
{if empty($stock_config) || (!empty($stock_config) && $stock_config.is_audit == 0) }
{{# if(d.goods_class == 1 || d.goods_class == 2 || d.goods_class == 4 || d.goods_class == 5 || d.goods_class == 6){ }}
<a class="layui-btn" lay-event="editStock">库存</a>
{{# } }}
{/if}
{if $memberprice_is_exit == 1}
<a class="layui-btn" lay-event="member_price">会员价</a>
{/if}
{if $cardservice_is_exit == 1}
{{# if(d.goods_class == 5){ }}
<a class="layui-btn" lay-event="goods_card">卡项</a>
{{# } }}
{/if}
<a class="layui-btn" lay-event="more">更多</a>
<div class="more-operation">
<a class="operation" lay-event="spread">推广</a>
{{# if(d.goods_state == 1){ }}
<!-- <a class="layui-btn" lay-event="preview">预览</a> -->
<a class="operation" lay-event="off_goods">下架</a>
{{# }else{ }}
<a class="operation" lay-event="on_goods">上架</a>
{{# } }}
<a class="operation" lay-event="browse_records">浏览记录</a>
<a class="operation" lay-event="evaluate">评论</a>
<a class="operation" lay-event="copy">复制</a>
<a class="operation" lay-event="delete">删除</a>
</div>
</div>
</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
<button class="layui-btn layui-btn-primary" lay-event="on_goods">批量上架</button>
<button class="layui-btn layui-btn-primary" lay-event="off_goods">批量下架</button>
<button class="layui-btn layui-btn-primary" lay-event="batch_set">批量设置</button>
</script>
<!-- 批量操作 -->
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
<button class="layui-btn layui-btn-primary" lay-event="on_goods">批量上架</button>
<button class="layui-btn layui-btn-primary" lay-event="off_goods">批量下架</button>
<button class="layui-btn layui-btn-primary" lay-event="batch_set">批量设置</button>
</script>
<!-- SKU商品列表 -->
<script type="text/html" id="skuList">
<tr class="js-sku-list-{{d.index}}" id="sku_img_{{d.index}}">
<td></td>
{{# if (d.member_price_is_exit == 1) { }}
<td colspan="9">
{{# } else { }}
<td colspan="8">
{{# } }}
<ul class="sku-list">
{{# for(var i=0;i<d.list.length;i++){ }}
<li>
<div class="img-wrap">
<img layer-src="{{ns.img(d.list[i].sku_image, 'big')}}" src="{{ns.img(d.list[i].sku_image)}}">
</div>
<div class="info-wrap">
<span class="sku-name">{{ d.list[i].spec_name ? d.list[i].spec_name : d.list[i].sku_name }}</span>
<div>
{{# if(d.list[i].stock_alarm> 0 && d.list[i].stock<=d.list[i].stock_alarm){ }}
<span class="stock">库存<label style="color:red;">{{d.list[i].stock}}库存不足</label></span>
{{# }else{ }}
<span class="stock">库存{{d.list[i].stock}}</span>
{{# } }}
<span class="sale_num">销量{{d.list[i].sale_num}}</span>
</div>
</div>
<div class="prices">
原价: {{d.list[i].price}}
{{# if (d.list[i].member_price_list) { }}
{{# layui.each(d.list[i].member_price_list, function(index, item){ }}
<p class="vip_price">{{ item.level_name }}: {{ item.member_price }}</p>
{{# }); }}
{{# } }}
</div>
</li>
{{# } }}
</ul>
</td>
</tr>
</script>
<!-- 推广 -->
{include file="app/shop/view/component/promote_show.html"}
<!-- 编辑排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.goods_id}}, this)" value="{{d.sort}}" class="layui-input edit-sort len-short">
</script>
<!-- 编辑库存 -->
<script type="text/html" id="editStock">
<input name="sort" type="number" onchange="editSort({{d.goods_id}}, this)" value="{{d.sort}}" class="layui-input edit-sort len-short">
</script>
<!-- 编辑库存html -->
<script type="text/html" id="edit_stock">
<div class="layui-form" id="edit_stock_block" lay-filter="form">
<div class="layui-form-item batch-operation-sku">
<label class="layui-form-label">批量操作</label>
<div class="layui-input-inline batch-btn">
<span class="text-color" data-field="price" data-verify="price">销售价</span>
<span class="text-color" data-field="market_price" data-verify="market_price">划线价</span>
<span class="text-color" data-field="cost_price" data-verify="cost_price">成本价</span>
<span class="text-color" data-field="stock" data-verify="stock">库存</span>
{{# if(d.goods_class == 1){ }}
<span class="text-color" data-field="weight" data-verify="weight">重量(kg)</span>
<span class="text-color" data-field="volume" data-verify="volume">体积()</span>
{{# } }}
{{# if(d.goods_class == 2 && d.virtual_deliver_type == 'verify'){ }}
<span class="text-color" data-field="verify_num" data-verify="verify_num">核销次数</span>
{{# } }}
<span class="text-color" data-field="sku_no" data-verify="">商品编码</span>
<input type="text" class="layui-input len-short batch-val" autocomplete="off" />
<button class="layui-btn confirm" type="button">确定</button>
<button class="layui-btn layui-btn-primary cancel" type="button">取消</button>
</div>
</div>
<table class="layui-table" lay-skin="line">
<colgroup>
<col width="16%">
<col width="10%">
<col width="10%">
<col width="10%">
<col width="10%">
{{# if(d.goods_class == 1){ }}
<col width="10%">
<col width="10%">
{{# } }}
{{# if(d.goods_class == 2 && d.virtual_deliver_type == 'verify'){ }}
<col width="10%">
{{# } }}
<col width="10%">
</colgroup>
<thead>
<tr>
<th>商品名称</th>
<th>销售价</th>
<th>划线价</th>
<th>成本价</th>
<th>库存</th>
{{# if(d.goods_class == 1){ }}
<th>重量(kg)</th>
<th>体积()</th>
<th>起送限制不限制则任意价格都可以配送</th>
{{# } }}
{{# if(d.goods_class == 2 && d.virtual_deliver_type == 'verify'){ }}
<th>核销次数</th>
{{# } }}
<th>商品编码多个编码以英文逗号分割</th>
</tr>
</thead>
<tbody class="js-edit-sku-list-stock">
{{# layui.each(d.sku_list, function(index, item){ }}
<tr data-index="{{ index }}">
<td><input type="hidden" name="sku_id" value="{{ item.sku_id }}" class="layui-input">{{ item.sku_name }}</td>
<td><input type="number" name="price" value="{{ item.price }}" class="layui-input price" lay-verify="price"></td>
<td><input type="number" name="market_price" value="{{ item.market_price }}" class="layui-input market_price" lay-verify="market_price"></td>
<td><input type="number" name="cost_price" value="{{ item.cost_price }}" class="layui-input cost_price" lay-verify="cost_price"></td>
<td><input type="number" name="stock" value="{{ item.stock }}" class="layui-input stock {{ item.goods_class == 3 ? 'disabled' : '' }}" lay-verify="goods_stock" {{ item.goods_class == 3 ? 'disabled' : '' }}></td>
{{# if(d.goods_class == 1){ }}
<td><input type="number" name="weight" value="{{ item.weight }}" class="layui-input weight" lay-verify="weight"></td>
<td><input type="number" name="volume" value="{{ item.volume }}" class="layui-input volume" lay-verify="volume"></td>
<td>
<input type="checkbox" name="is_delivery_restrictions" id="is_delivery_restrictions_{{item.sku_id}}" lay-filter="is_delivery_restrictions" lay-skin="switch"
{{# if(item.is_delivery_restrictions == 1) { }} checked {{# } }}
>
</td>
{{# } }}
{{# if(d.goods_class == 2 && d.virtual_deliver_type == 'verify'){ }}
<td><input type="number" name="verify_num" value="{{ item.verify_num }}" class="layui-input verify_num" lay-verify="verify_num"></td>
{{# } }}
<td><input type="text" name="sku_no" value="{{ item.sku_no }}" class="layui-input sku_no"></td>
</tr>
{{# }); }}
</tbody>
</table>
<input type="hidden" name="goods_id" value="{{ d.goods_id }}"/>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="edit_stock">确定</button>
<button class="layui-btn layui-btn-primary" onclick="closeStock()">返回</button>
</div>
</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="batchSet">
<div class="batch-set-wrap">
<div class="tips">每次仅能设置一项点击保存成功之后生效</div>
<div class="set-wrap">
<div class="tab-wrap">
<ul>
<li class="active" data-type="group">商品标签</li>
<li data-type="service">商品服务</li>
<li data-type="sale">虚拟销量</li>
<li data-type="purchase_limit">商品限购</li>
<li data-type="shipping">配送设置</li>
<li data-type="category">商品分类</li>
{if $memberprice_is_exit == 1}
<li data-type="member_price">会员价</li>
{/if}
{if empty($stock_config) || (!empty($stock_config) && $stock_config['is_audit'] == 0) }
<li data-type="stock">库存设置</li>
{/if}
<li data-type="price">修改价格</li>
{if $form_is_exit == 1}
<li data-type="goods_form">商品表单</li>
{/if}
<li data-type="goods_brand">商品品牌</li>
</ul>
</div>
<div class="content-wrap">
<div class="tab-item tab-show group">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">商品标签</label>
<div class="layui-input-inline">
<select name="batch_goods_label" lay-search="">
<option value="0">请选择商品标签</option>
{foreach name="$label_list" item="vo"}
<option value="{$vo['id']}">{$vo['label_name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
</div>
<div class="tab-item service">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">商品服务</label>
<div class="layui-input-block">
{foreach name="$service_list" item="vo"}
<input type="checkbox" name="batch_goods_service" value="{$vo.id}" title="{$vo.service_name}" lay-skin="primary">
{/foreach}
</div>
</div>
</div>
</div>
<div class="tab-item sale">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">已售出数</label>
<div class="layui-input-block">
<input type="number" name="batch_virtual_sale" placeholder="0" value="0" lay-verify="virtual_sale" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid">/</div>
</div>
<div class="word-aux">该设置不计入商品统计数据</div>
</div>
</div>
</div>
<div class="tab-item purchase_limit">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">商品限购</label>
<div class="layui-input-block">
<input type="number" name="batch_max_buy" value="0" lay-verify="max_buy" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid">/</div>
</div>
<div class="word-aux">该限购为终身限购0为不限购</div>
</div>
</div>
</div>
<div class="tab-item shipping">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">配送方式</label>
<div class="layui-input-block">
{notempty name="$express_type"}
{foreach name="$express_type" item="vo" key="key"}
<input type="checkbox" name="support_trade_type" value="{$key}" title="{$vo.name}" lay-skin="primary" checked lay-filter="support_trade_type">
{/foreach}
{else/}
<a href="{:href_url('shop/delivery/express')}" class="text-color">未配置配送方式请先配置配送方式</a>
{/notempty}
</div>
</div>
<div class="support_trade_type_express">
<div class="layui-form-item">
<label class="layui-form-label">是否包邮</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="is_free_shipping" value="1" title="是" lay-filter="is_free_shipping">
<input type="radio" name="is_free_shipping" value="0" title="否" checked lay-filter="is_free_shipping">
</div>
</div>
</div>
<div class="layui-form-item hide shipping_template">
<label class="layui-form-label">运费模板</label>
<div class="layui-input-inline">
<select name="batch_shipping_template" lay-search="">
<option value="0">请选择运费模板</option>
{foreach name="$express_template_list" item="vo"}
<option value="{$vo['template_id']}">{$vo['template_name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="word-aux">该设置仅对实物商品有效</div>
</div>
</div>
<div class="tab-item category">
<div class="layui-form-item">
<label class="layui-form-label goods-category-css"><span class="required">*</span></label>
<div class="layui-input-block goods-cate">
<div class="layui-block first">
<div class="category-wrap">
<input type="text" readonly lay-verify="required" autocomplete="off" class="layui-input select-category"/>
<input type="hidden" class="category_id"/>
</div>
<a href="javascript:;" class="text-color goods-list-js-add-category">添加分类</a>
</div>
</div>
<div class="word-aux">商品可以属于多个分类最多10个</div>
</div>
</div>
<div class="tab-item member_price">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">是否参与</label>
<div class="layui-input-inline">
<input type="radio" name="is_consume_discount" value="0" title="不参与" checked>
<input type="radio" name="is_consume_discount" value="1" title="参与">
</div>
</div>
<div class="word-aux">批量设置参与会员等级折扣的商品如果之前未单独配置过优惠规则则按照默认会员等级折扣优惠</div>
</div>
</div>
{if empty($stock_config) || (!empty($stock_config) && $stock_config.is_audit == 0) }
<div class="tab-item stock">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">修改库存</label>
<div class="layui-input-inline">
<input type="radio" name="stock_type" value="inc" title="添加库存" checked>
<input type="radio" name="stock_type" value="dec" title="减少库存">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">目标数值</label>
<div class="layui-input-block">
<input type="number" name="stock_num" placeholder="0" value="0" class="layui-input len-short" autocomplete="off" onblur="stockinput(this)">
</div>
</div>
<div class="word-aux">批量调整商品库存该操作不会改变电子卡密的库存</div>
</div>
</div>
{/if}
<div class="tab-item price">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">计算方式</label>
<div class="layui-input-inline">
<input type="radio" name="type" lay-filter="type" value="money" title="固定金额" checked>
<input type="radio" name="type" lay-filter="type" value="calculate" title="公式计算">
</div>
</div>
</div>
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<div class="layui-input-inline" style="width:84px;">
<select name="price_type" lay-verify="required">
<option value="sale">销售价</option>
<option value="market">划线价</option>
<option value="cost">成本价</option>
</select>
</div>
<div class="layui-input-inline">=</div>
<div class="layui-input-inline price-calculate-block" style="display:none;">
<div class="layui-input-inline" style="width:84px;">
<select name="calculate_price_type" lay-verify="required">
<option value="sale">销售价</option>
<option value="market">划线价</option>
<option value="cost">成本价</option>
</select>
</div>
<div class="layui-input-inline" style="width:50px;">
<select name="sign" lay-filter="sign" lay-verify="required">
<option value="add">+</option>
<option value="subtract">-</option>
<option value="multiply">x</option>
<option value="division">÷</option>
</select>
</div>
</div>
<div class="layui-input-inline len-short">
<input type="number" name="price" autocomplete="off" class="layui-input"/>
</div>
<div class="layui-input-inline price-unit money-price-unit"></div>
<div class="layui-input-inline price-unit calculate-price-unit" style="display:none;"></div>
</div>
</div>
</div>
<div class="layui-form precise-block" style="display:none;">
<div class="layui-form-item">
<label class="layui-form-label">计算精度</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="precise" lay-filter="precise" value="1" title="全部保留" checked>
<input type="radio" name="precise" lay-filter="precise" value="2" title="抹分" >
<input type="radio" name="precise" lay-filter="precise" value="3" title="抹角" >
<input type="radio" name="precise" lay-filter="precise" value="4" title="四舍五入到分" >
<input type="radio" name="precise" lay-filter="precise" value="5" title="四舍五入到角" >
<input type="radio" name="precise" lay-filter="precise" value="6" title="四舍五入到元" >
</div>
</div>
</div>
</div>
</div>
{if $form_is_exit == 1}
<div class="tab-item goods_form">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">商品表单</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<select name="batch_goods_form" lay-search="">
<option value="0">请选择商品表单</option>
{foreach name="$form_list" item="vo"}
<option value="{$vo['id']}">{$vo['form_name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
</div>
</div>
{/if}
<div class="tab-item goods_brand">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">商品品牌</label>
<div class="layui-input-inline">
<select name="batch_goods_brand" lay-search="">
<option value="0">请选择商品品牌</option>
{foreach name="$brand_list" item="vo"}
<option value="{$vo['brand_id']}">{$vo['brand_name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
</div>
<div class="tab-item result">
<img src="SHOP_IMG/success.png">
<div class="text">设置成功</div>
</div>
</div>
</div>
<div class="footer-wrap">
<button class="layui-btn layui-btn-primary" onclick="layer.closeAll()">取消</button>
<button class="layui-btn" onclick="batchSetting()">保存</button>
</div>
</div>
</script>
<!--选择商品分类-->
<script type="text/html" id="selectedCategory">
<div class="category-list">
<div class="item">
<!--后续做搜索-->
<ul>
{foreach name="$goods_category_list" item="vo"}
{{# if(d.category_id_1 == '{$vo['category_id']}' ){ }}
<li data-category-id="{$vo['category_id']}" data-commission-rate="{$vo['commission_rate']}" data-level="{$vo['level']}" class="selected">
{{# }else{ }}
<li data-category-id="{$vo['category_id']}" data-commission-rate="{$vo['commission_rate']}" data-level="{$vo['level']}">
{{# } }}
<span class="category-name">{$vo['category_name']}</span>
<span class="right-arrow">&gt;</span>
</li>
{/foreach}
</ul>
</div>
<div class="item" data-level="2">
<!--后续做搜索-->
<ul></ul>
</div>
<div class="item" data-level="3">
<!--后续做搜索-->
<ul></ul>
</div>
</div>
<div class="selected-category-wrap">
<label>您当前选择的是</label>
<span class="js-selected-category"></span>
</div>
</script>
<script>
var member_price_is_exit = "{$memberprice_is_exit}";
var goods_sort = '{$goods_sort}';
var pc_domain = '{$pc_domain}';
var goods_class = {:json_encode($goods_class)};
var stockConfig = {:json_encode($stock_config)};
</script>
<script src="SHOP_JS/category_select.js?time=20240821"></script>
<script src="SHOP_JS/goods_list.js?time=20250111"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>

View File

@@ -0,0 +1,102 @@
<!-- 搜索框 -->
<div class="single-filter-box" style="margin:15px 0;">
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search" placeholder="请输入商品名称" class="layui-input" autocomplete="off">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="goods_browse_search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="goods_browse_list" lay-filter="goods_browse_list"></table>
<!-- 商品 -->
<script type="text/html" id="goodsBrowseInfo">
<div class="table-title">
<div class="title-pic">
{{# if(d.sku_image){ }}
<img layer-src src="{{ns.img(d.sku_image.split(',')[0],'small')}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color-sub">{{d.sku_name}}</a>
</div>
</div>
</script>
<script>
var form, goods_browse_table, laytpl;
layui.use(['form', 'laytpl'], function () {
form = layui.form;
laytpl = layui.laytpl;
form.render();
goods_browse_table = new Table({
elem: '#goods_browse_list',
url: '{:addon_url("shop/goods/membergoodsbrowse")}',
async: false,
where: {'member_id': "{$member_id}"},
parseData: function (res) {
return {
"code": res.code,
"msg": res.message,
"count": res.data.count,
"data": res.data.list,
};
},
cols: [
[{
title: '商品',
unresize: 'false',
width: '30%',
templet: '#goodsBrowseInfo'
}, {
field: 'price',
title: '商品价格',
unresize: 'false',
width: '10%',
align: 'left',
templet: function (data) {
return '¥<span class="goods-price">' + data.price + '</span>'
}
}, {
title: '商品状态',
unresize: 'false',
width: '10%',
align: 'left',
templet: function (data) {
return data.goods_state == 1 ? '正常' : '下架';
}
}, {
title: '浏览量',
unresize: 'false',
width: '10%',
align: 'left',
templet: function (data) {
return data.click_num;
}
}, {
title: '浏览时间',
unresize: 'false',
width: '20%',
align: 'left',
templet: function (data) {
return ns.time_to_date(data.browse_time);
}
}]
]
});
form.on('submit(goods_browse_search)', function (data) {
goods_browse_table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
</script>

View File

@@ -0,0 +1,106 @@
<!-- 搜索框 -->
<div class="single-filter-box" style="margin:15px 0;">
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search" placeholder="请输入商品名称" class="layui-input" autocomplete="off">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="goods_collect_search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="goods_collect_list" lay-filter="goods_collect_list"></table>
<!-- 商品 -->
<script type="text/html" id="goodsCollectInfo">
<div class="table-title">
<div class="title-pic">
{{# if(d.sku_image){ }}
<img layer-src src="{{ns.img(d.sku_image.split(',')[0],'small')}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color-sub">{{d.sku_name}}</a>
</div>
</div>
</script>
<script>
var form, goods_collect_table, laytpl;
layui.use(['form', 'laytpl'], function () {
form = layui.form;
laytpl = layui.laytpl;
form.render();
goods_collect_table = new Table({
elem: '#goods_collect_list',
url: '{:addon_url("shop/goods/membergoodscollect")}',
async: false,
where: {'member_id': "{$member_id}"},
parseData: function (res) {
return {
"code": res.code,
"msg": res.message,
"count": res.data.count,
"data": res.data.list,
};
},
cols: [
[{
title: '商品',
unresize: 'false',
width: '30%',
templet: '#goodsCollectInfo'
}, {
field: 'price',
title: '商品价格',
unresize: 'false',
width: '10%',
align: 'left',
templet: function (data) {
return '¥<span class="goods-price">' + data.price + '</span>'
}
}, {
title: '商品状态',
unresize: 'false',
width: '10%',
align: 'left',
templet: function (data) {
return data.goods_state == 1 ? '正常' : '下架';
}
}, {
title: '收藏量',
unresize: 'false',
width: '10%',
align: 'left',
templet: function (data) {
return data.collect_num;
}
}, {
title: '收藏时间',
unresize: 'false',
width: '20%',
align: 'left',
templet: function (data) {
return ns.time_to_date(data.create_time);
}
}]
]
});
/**
* 搜索功能
*/
form.on('submit(goods_collect_search)', function (data) {
goods_collect_table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
</script>

381
app/shop/view/goods/recycle.html Executable file
View File

@@ -0,0 +1,381 @@
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
<style>
.contraction{display: inline-block;margin-right: 5px;}
.contraction span{cursor: pointer;display: inline-block;width: 17px;height: 17px;text-align: center;line-height: 14px;user-select: none;}
.sku-list{overflow: hidden;padding: 0 45px;}
.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;}
.sku-list li .img-wrap{vertical-align: middle;margin-right: 8px;width: 120px;height: 120px;text-align: center;line-height: 120px;}
.sku-list li .img-wrap img{max-width: 100%;max-height: 100%;}
.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;}
.sku-list li .info-wrap span.sku-name{-webkit-line-clamp: 2;margin-bottom: 5px;}
.sku-list li .info-wrap span:last-child{margin-bottom: 0;}
.category-wrap {width:185px!important;display: inline-block}
.el-input__inner {height:34px;line-height:34px;border-radius:2px;}
</style>
<!-- 筛选面板 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商品名称</label>
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入商品名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品分类</label>
<div class="layui-input-inline category-wrap">
<input type="text" autocomplete="off" show="false" class="layui-input select-category" placeholder="请选择" readonly="">
<input type="hidden" name="category_id">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">商品类型</label>
<div class="layui-input-inline">
<select name="goods_class" lay-filter="goods_class">
<option value="">全部</option>
<option value="1">实物商品</option>
<option value="2">虚拟商品</option>
{if $virtualcard_exit}<option value="3">电子卡密</option>{/if}
</select>
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<!-- 列表 -->
<table id="goods_list" lay-filter="goods_list"></table>
<!-- 商品信息 -->
<script type="text/html" id="goods_info">
<div class="table-title">
<div class="contraction" data-goods-id="{{d.goods_id}}" data-open="0">
<span>+</span>
</div>
<div class="title-pic">
<img layer-src="{{ns.img(d.goods_image.split(',')[0], 'big')}}" src="{{ns.img(d.goods_image.split(',')[0], 'small')}}"/>
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{d.goods_name}}">{{d.goods_name}}</a>
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="delete">删除</a>
<a class="layui-btn" lay-event="recovery">恢复</a>
</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
<button class="layui-btn layui-btn-primary" lay-event="recovery">恢复</button>
</script>
<!-- 批量操作 -->
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
<button class="layui-btn layui-btn-primary" lay-event="recovery">恢复</button>
</script>
<!-- SKU商品列表 -->
<script type="text/html" id="skuList">
<tr class="js-sku-list-{{d.index}}">
<td></td>
<td colspan="8">
<ul class="sku-list">
{{# for(var i=0;i<d.list.length;i++){ }}
<li>
<div class="img-wrap">
<img src="{{ns.img(d.list[i].sku_image, 'small')}}">
</div>
<div class="info-wrap">
<span class="sku-name">{{d.list[i].sku_name}}</span>
<span class="price">价格{{d.list[i].price}}</span>
<span class="stock">库存{{d.list[i].stock}}</span>
<span class="sale_num">销量{{d.list[i].sale_num}}</span>
</div>
</li>
{{# } }}
</ul>
</td>
</tr>
</script>
<script>
var laytpl, layCascader;
$(function () {
$("body").off("click", ".contraction").on("click", ".contraction",function () {
var goods_id = $(this).attr("data-goods-id");
var open = $(this).attr("data-open");
var tr = $(this).parent().parent().parent().parent();
var index = tr.attr("data-index");
if(open == 1){
$(this).children("span").text("+");
$(".js-sku-list-"+index).remove();
}else{
$(this).children("span").text("-");
$.ajax({
url: ns.url("shop/goods/getGoodsSkuList"),
data: {goods_id:goods_id},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
var list = res.data;
var sku_list = $("#skuList").html();
var data ={
list : list,
index : index
};
laytpl(sku_list).render(data, function(html) {
tr.after(html);
});
}
});
}
$(this).attr("data-open",(open == 0 ? 1 : 0));
})
});
layui.use(['form','laytpl', 'layCascader'], function () {
var form = layui.form,
repeat_flag = false; //防重复标识
laytpl = layui.laytpl;
layCascader = layui.layCascader;
form.render();
var table = new Table({
elem: '#goods_list',
url: ns.url("shop/goods/recycle"),
cols: [
[
{
type: 'checkbox',
unresize: 'false',
width: '3%'
},
{
title: '商品信息',
unresize: 'false',
width: '39%',
templet: '#goods_info'
},
{
field: 'price',
title: '价格',
unresize: 'false',
width: '6%',
align: 'right',
templet: function(data) {
return '¥'+ data.price;
}
},
{
unresize: 'false',
width: '2%'
},
{
field: 'goods_stock',
title: '库存',
unresize: 'false',
width: '8%'
},
{
field: 'sale_num',
title: '销量',
unresize: 'false',
width: '7%'
},
{
title: '商品状态',
unresize: 'false',
width: '8%',
templet: function (data) {
var str = '';
if (data.goods_state == 1) {
str = '正常';
} else if (data.goods_state == 0) {
str = '下架';
}
return str;
}
},
{
title: '创建时间',
unresize: 'false',
width: '15%',
templet: function (data) {
return ns.time_to_date(data.create_time);
}
},
{
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}
]
],
toolbar: '#toolbarOperation',
bottomToolbar: "#batchOperation"
});
/**
* 监听工具栏操作
*/
table.tool(function (obj) {
var data = obj.data;
switch (obj.event) {
case 'delete':
//删除
deleteRecycleGoods(data.goods_id);
break;
case 'recovery':
//恢复
recoveryRecycle(data.goods_id);
break;
}
});
/**
* 删除
*/
function deleteRecycleGoods(goods_ids) {
layer.confirm('确定要删除该商品吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("shop/goods/deleteRecycleGoods"),
data: {goods_ids : goods_ids.toString()},
dataType: 'JSON',
type: 'POST',
success: function (res) {
repeat_flag = false;
if (res.code == 0) {
table.reload();
layer.msg(res.data.cannot_delete_reasons || res.message);
}else{
layer.msg(res.message);
}
}
});
});
}
//商品恢复
function recoveryRecycle(goods_ids) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/goods/recoveryRecycle"),
data: {goods_ids: goods_ids.toString()},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
}
/**
* 批量操作
*/
table.bottomToolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].goods_id);
switch (obj.event) {
case "delete":
deleteRecycleGoods(id_array.toString());
break;
case 'recovery':
//恢复
recoveryRecycle(id_array.toString());
break;
}
});
/**
* 批量操作
*/
table.toolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].goods_id);
switch (obj.event) {
case "delete":
deleteRecycleGoods(id_array.toString());
break;
case 'recovery':
//恢复
recoveryRecycle(id_array.toString());
break;
}
});
// 搜索功能
form.on('submit(search)', function (data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
$.ajax({
url : ns.url("shop/goodscategory/lists"),
dataType: 'JSON',
type: 'POST',
success: function(res) {
if($('.select-category').length) {
var _cascader = layCascader({
elem: '.select-category',
options: res.data,
props: {
value: 'category_id',
label: 'category_name',
children: 'child_list'
}
});
_cascader.changeEvent(function (value, node) {
$('[name="category_id"]').val(value)
});
}
}
})
});
</script>

274
app/shop/view/goods/verify.html Executable file
View File

@@ -0,0 +1,274 @@
<style>
.screen{margin-bottom: 15px;}
.contraction span {
cursor: pointer;
display: inline-block;
width: 17px;
height: 17px;
text-align: center;
line-height: 14px;
user-select: none;
}
.table-title .title-content p{overflow: hidden;text-overflow:ellipsis;white-space: nowrap;}
.goods-box{
display: flex;
padding: 10px;
justify-content: space-between;
margin-bottom: 20px;
}
.goods-box .goods-info{
width: 340px;
}
.goods-box .goods-info .goods-name{
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
display: -moz-box;
-moz-line-clamp: 2;
-moz-box-orient: vertical;
overflow-wrap: break-word;
word-break: break-all;
white-space: normal;
overflow: hidden;
height: 38px;
}
.goods-box .goods-info .goods-desc{
margin-top: 5px;
}
.goods-box .goods-img{
margin-right: 15px;
display: flex;
align-items: center;
}
.goods-box .goods-img img{
width: 80px;
max-height: 80px;
}
.goods-box .box-left{
display: flex;
}
.goods-box .box-right{
display: flex;
align-items: center;
}
.stat-box{
display: flex;
justify-content: space-around;
height: 100px;
align-items: center;
background: #f7f7f7;
margin-bottom: 10px;
}
.stat-box .stat-item .stat-val{
margin-top: 10px;
font-size: 20px;
font-weight: bold;
}
.user-detail{
cursor: pointer;
}
.table-title .title-content{
overflow: unset;
}
</style>
<!--商品信息-->
<div class="goods-box">
<div class="box-left">
<div class="goods-img">
<img src="{:img(explode(',', $goods_info['goods_image'])[0])}">
</div>
<div class="goods-info">
<div class="goods-name">{$goods_info['goods_name']}</div>
<div class="goods-price">价格:{$goods_info['price']}</div>
<div class="goods-desc">库存:{$goods_info['goods_stock']}&nbsp;&nbsp;&nbsp;销量:{$goods_info['sale_num']}</div>
</div>
</div>
<div class="box-right">
<button class="layui-btn layui-btn-primary" onclick="location.hash='{:hash_url('shop/goods/lists')}'">返回</button>
</div>
</div>
<div class="stat-box">
<div class="stat-item">
<div class="stat-txt">核销码总数(个)</div>
<div class="stat-val">{$total_count}</div>
</div>
<div class="stat-item">
<div class="stat-txt">已核销(次)</div>
<div class="stat-val">{$verify_use_num}</div>
</div>
</div>
<!-- 搜索框 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">购买人:</label>
<div class="layui-input-inline">
<input type="text" name="nickname" placeholder="请输入购买人名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">核销码:</label>
<div class="layui-input-inline">
<input type="text" name="verify_code" placeholder="请输入核销码" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<!-- 列表 -->
<table id="verify_list" lay-filter="verify_list"></table>
<!-- 工具栏操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="record">核销记录</a>
</div>
</script>
<script type="text/html" id="userdetail">
<div class='table-title user-detail' onclick="memberDetail({{d.member_id}})">
<div class='title-pic'>
<img layer-src src="{{ns.img(d.headimg)}}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' ">
</div>
<div class='title-content'>
{{d.nickname}}
</div>
</div>
</script>
<script type="text/html" id="goodsDetail">
<div class="table-title">
<div class=" table-title">
<div class="title-pic"><img src="{{ns.img(d.sku_image)}}"></div>
<div class="title-content">
<p title="{{ d.sku_name }}">{{ d.sku_name }}</p>
</div>
</div>
</div>
</script>
<script>
var laytpl;
$(function () {
layui.use(['form', 'laydate','laytpl'], function () {
laytpl = layui.laytpl;
var table,
form = layui.form,
laydate = layui.laydate;
form.render();
//渲染时间
laydate.render({
elem: '#start_time',
type: 'datetime'
});
laydate.render({
elem: '#end_time',
type: 'datetime'
});
/**
* 加载表格
*/
table = new Table({
elem: '#verify_list',
url: ns.url("shop/goods/verify"), //数据接口
where: {goods_id:"{$goods_id}"},
cols: [
[{
title: '商品信息',
width: '20%',
templet: '#goodsDetail'
},{
field: 'nickname',
title: '买家信息',
templet: '#userdetail'
},{
field: 'code',
title: '核销码',
},
{
field: 'order_no',
title: '订单编号',
templet: function (data) {
return '<a href="'+ ns.href("shop/order/detail", {order_id:data.order_id}) +'" target="_blank">'+ data.order_no +'</a>';
}
},{
field: '',
title: '已核销/可核销',
templet: function (data) {
return data.verify_use_num + '/' + data.verify_total_count;
}
},
{
field: 'sold_time',
title: '售出时间',
width: '10%',
templet: function (data) {
return ns.time_to_date(data.sold_time)
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'record':
window.open(ns.href("shop/verify/records?verify_code=" + data.code))
break;
}
});
/**
* 搜索功能
*/
form.on('submit(search)', function (data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
//批量导出
form.on('submit(export_verify)', function (data) {
location.href = ns.url("shop/verify/exportVerify?request_mode=download", data.field);
return false;
});
});
})
function memberDetail(member_id){
window.open(ns.href("shop/member/editmember", {'member_id':member_id}))
}
</script>