初始上传

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

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>