初始上传

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,218 @@
<style>
/* 提示弹出框 */
.layui-card-body .content{width: 50%;}
.layui-card-body .bottom-title{color: #909399;font-size: 14px;margin-top: 5px;}
.layui-laydate-content tr{border: none;}
.layui-table-body .layui-none{height: 56px;line-height: 56px;padding: 0;}
.table-bottom .layui-table-page {position: inherit;text-align: right}
.table-tab .layui-tab-content{margin-bottom: 0;}
.screen {margin-top: 15px}
.table-title {cursor: pointer}
.layui-layout-admin .screen{margin-bottom: 15px;}
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
</style>
<div class="layui-card card-common card-brief panel-content">
<div class="layui-card-header simple">
<span class="card-title">余额概况</span>
</div>
<div class="layui-card-body">
<div class="content">
<p class="title">总余额</p>
<p class="money">{$total_balance + $total_balance_money}</p>
<p class="bottom-title">
<span>现金余额:{$total_balance_money}</span>
<span>储值余额:{$total_balance}</span>
</p>
</div>
<div class="content">
<p class="title">累计消费余额</p>
<p class="money">{$total_consume_money}</p>
<p class="bottom-title">
<span>&nbsp;</span>
<span>&nbsp;</span>
</p>
</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="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">
<select name="from_type">
<option value="">全部</option>
{foreach $from_type as $k => $val}
<option value="{$k}">{$val.type_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">
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</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>
<div class="form-row">
<button class="layui-btn" lay-submit="" id="search" lay-filter="search">筛选</button>
</div>
</form>
</div>
</div>
<table id="account_detail" lay-filter="account_detail"></table>
<script type="text/html" id="memberInfo">
<div class='table-title'>
<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' onclick="location.hash = ns.hash('shop/member/editmember?member_id={{d.member_id}}')">
<p class="layui-elip">{{d.nickname}}</p>
<p class="layui-elip">{{d.mobile}}</p>
</div>
</div>
</script>
<script>
var form, laydate;
layui.use(['laydate','form', 'element'], function(){
form = layui.form;
laydate = layui.laydate;
form.on('submit(search)', function(data) {
if ($('#start_time').val() != '' && $('#end_time').val() != '' && (new Date($('#end_time').val()).getTime() <= new Date($('#start_time').val()).getTime() )) {
layer.msg('结束时间不能小于开始时间');
return false;
}
data.field.account_type = 'balance,balance_money';
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
laydate.render({
elem: '#start_time',
type: 'datetime',
max: 0,
change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
laydate.render({
elem: '#end_time',
type: 'datetime',
max: 0,
change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
table = new Table({
elem: '#account_detail',
url: ns.url("shop/memberaccount/accountdetail"),
where: {
account_type: 'balance,balance_money'
},
cols: [
[{
templet: '#memberInfo',
title: '会员信息',
width: '20%',
unresize: 'false'
}, {
title: '金额变化',
width: '10%',
unresize: 'false',
align: 'right',
templet: function (d) {
if (d.account_data > 0) return '+' + parseFloat(d.account_data).toFixed(2);
return parseFloat(d.account_data).toFixed(2);
}
}, {
title: '账户类型',
width: '10%',
unresize: 'false',
templet: function (data) {
return data.account_type == 'balance' ? '储值余额' : '现金余额';
}
}, {
field: 'type_name',
title: '发生方式',
width: '15%',
unresize: 'false'
}, {
field: 'create_time',
title: '发生时间',
width: '20%',
unresize: 'false',
templet: function(data) {
return ns.time_to_date(data.create_time);
}
}, {
field: 'remark',
title: '备注',
width: '25%',
unresize: 'false'
}]
]
});
})
/**
* 七天时间
*/
function datePick(date_num,event_obj){
$(".date-picker-btn").removeClass("selected");
$(event_obj).addClass('selected');
// alert(new Date().format("yyyy-MM-dd hh:mm"));
var now_date = new Date();
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>

348
app/shop/view/account/coupon.html Executable file
View File

@@ -0,0 +1,348 @@
<style>
.layui-card-body .content{width: 33.3%;}
.layui-card-body .bottom-title{color: #909399;font-size: 14px;margin-top: 5px;}
.table-bottom .layui-table-page {position: inherit;text-align: right}
.table-tab .layui-tab-content{margin-bottom: 0;}
.screen {margin-top: 15px}
.table-title {cursor: pointer}
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
</style>
<div class="layui-card card-common card-brief panel-content">
<div class="layui-card-header simple">
<span class="card-title">优惠券概况</span>
</div>
<div class="layui-card-body">
<div class="content">
<p class="title">累计发放</p>
<p class="money">{$total_count}</p>
</div>
<div class="content">
<p class="title">已使用</p>
<p class="money">{$used_count}</p>
</div>
<div class="content">
<p class="title">待使用</p>
<p class="money">{$not_used_count}</p>
</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="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">
<select name="get_type">
<option value="">全部</option>
{foreach $get_type as $k => $val}
<option value="{$k}">{$val}</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">
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</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>
<div class="form-row">
<button class="layui-btn" lay-submit="" id="search" lay-filter="search">筛选</button>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="coupon_tab">
<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">
<!-- 列表 -->
<table id="coupon" lay-filter="coupon"></table>
</div>
</div>
<script type="text/html" id="memberInfo">
<div class='table-title'>
<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' onclick="location.hash = ns.hash('shop/member/editmember?member_id={{d.member_id}}')">
<p class="layui-elip">{{d.nickname}}</p>
<p class="layui-elip">{{d.mobile}}</p>
</div>
</div>
</script>
<script type="text/html" id="operation">
<div class="table-btn" align="right">
{{# if(d.state == 1){ }}
<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="recovery">批量回收</button>
</script>
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="recovery">批量回收</button>
</script>
<script>
var form, laydate, element, getType = {:json_encode($get_type)};
layui.use(['laydate','form', 'element'], function(){
form = layui.form;
laydate = layui.laydate;
element = layui.element;
element.on('tab(coupon_tab)', function(){
table.reload({
page: {curr: 1},
where: {'state': this.getAttribute('lay-id')},
})
});
form.on('submit(search)', function(data) {
if ($('#start_time').val() != '' && $('#end_time').val() != '' && (new Date($('#end_time').val()).getTime() <= new Date($('#start_time').val()).getTime() )) {
layer.msg('结束时间不能小于开始时间');
return false;
}
data.field.state = this.getAttribute('lay-id');
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
laydate.render({
elem: '#start_time',
type: 'datetime',
max: 0,
change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
laydate.render({
elem: '#end_time',
type: 'datetime',
max: 0,
change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
table = new Table({
elem: '#coupon',
url: ns.url("shop/memberaccount/coupon"),
cols: [
[{
type: 'checkbox',
width: '3%',
unresize: 'false'
},{
templet: '#memberInfo',
title: '会员信息',
width: '20%',
unresize: 'false'
}, {
field: 'coupon_name',
title: '优惠券',
width: '10%',
unresize: 'false',
templet: function(data) {
return `<a href="`+ ns.href('coupon://shop/coupon/detail', {coupon_type_id: data.coupon_type_id }) +`" target="_blank" class="text-color">`+ data.coupon_name +`</a>`;
}
}, {
title: '类型',
width: '10%',
unresize: 'false',
templet: function (data) {
return data.type == 'reward' ? '满减券' : '折扣券';
}
}, {
title: '获取方式',
width: '10%',
unresize: 'false',
templet: function(data) {
return getType[data.get_type] ? getType[data.get_type] : '';
}
}, {
title: '状态',
width: '12%',
unresize: 'false',
templet: function (data) {
var str = '';
switch (data.state) {
case 1:
str = '已领取';
break;
case 2:
str = '已使用';
break;
case 3:
str = '已过期';
break;
}
return str;
}
}, {
title: '领取时间',
width: '15%',
unresize: 'false',
templet: function(data) {
return ns.time_to_date(data.fetch_time);
}
}, {
title: '使用时间',
width: '15%',
templet: function(data) {
return data.use_time ? ns.time_to_date(data.use_time) : '';
}
},
{
title: '操作',
width: '5%',
templet: '#operation'
}
]
],
parseData: function(data){
data.data.list = data.data.list.map(function (item) {
item.LAY_DISABLED = item.state != 1;
return item;
})
return {
"code": data.code,
"msg": data.message,
"count": data.data.count,
"data": data.data.list
};
},
toolbar: '#toolbarOperation',
bottomToolbar: "#batchOperation"
});
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'recovery': //编辑
recoveryCoupon([{coupon_type_id: data.coupon_type_id, coupon_id: data.coupon_id}]);
break;
}
})
/**
* 批量操作
*/
table.bottomToolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "recovery":
var id_array = new Array();
for (i in obj.data) id_array.push({coupon_type_id: obj.data[i].coupon_type_id, coupon_id: obj.data[i].coupon_id});
recoveryCoupon(id_array);
break;
}
});
/**
* 批量操作
*/
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "recovery":
var id_array = new Array();
for (i in obj.data) id_array.push({coupon_type_id: obj.data[i].coupon_type_id, coupon_id: obj.data[i].coupon_id});
recoveryCoupon(id_array);
break;
}
});
});
function recoveryCoupon(data) {
layer.confirm('回收将会收回会员领取的待使用的优惠券,已使用的将无法回收,确定要回收所选优惠券吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("coupon://shop/coupon/recoverycoupon"),
data: {
coupon_list: JSON.stringify(data)
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
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>

View File

@@ -0,0 +1,352 @@
<style>
.survey .layui-card {background:#f2f3f5;vertical-align:top;width:50%;display:inline-block;border-radius:0;float:left;margin-top:10px;box-shadow:unset;}
.survey .layui-card-header {font-size:14px;box-shadow:unset;border:0;}
.survey .layui-card:nth-child(3n) {margin-right:0;}
.survey {box-shadow:unset;}
.layui-card-body {font-size:24px;padding-top:0px;cursor:pointer;}
.layui-card.layui-input-inline {padding-left:40px;box-sizing:border-box;}
.tab-status {height:41px;}
.layui-card.layui-input-inline {position:relative;}
.stat-name {justify-content:space-between;}
.layui-elem-quote .time {font-size:12px;margin-left:10px;}
.screen-title {font-size:14px;font-weight:600;}
.stat-list {margin-top:10px;display:flex;flex-wrap:wrap;}
.stat-item {padding:15px;box-sizing:border-box;margin-right:10px;width:calc((100% - 30px) / 4);margin-bottom:10px;border:1px solid #eee;}
.stat-name span {position:relative;}
.stat-name .iconfont {margin-left:5px;cursor:pointer;}
.stat-name>a {float:right;margin-top:1px;font-size:14px;font-weight:normal;}
.stat-list .stat-item:nth-child(4n) {margin-right:0;}
.stat-value {font-size:24px;margin-top:15px;}
@media screen and (max-width:1580px) {.stat-list .stat-item {width:calc((100% - 20px) / 3);}
.stat-list .stat-item:nth-child(4n) {margin-right:10px;}
.stat-list .stat-item:nth-child(3n) {margin-right:0;}
}
.survey {margin:20px 0px;background:#f2f3f5;display:flex;}
.survey.stat .layui-card {width:150px !important;}
.survey.stat {margin-left:0;margin-right:0;height:90px;margin-top:10px;}
.survey.stat .layui-card-body {padding-top:0px;}
.symbol {padding:35px 20px;font-size:18px;}
.stat-text {padding:35px 10px;font-size:14px;}
.date-btn {height:32px;line-height:32px;font-size:14px;padding:0 10px;display:inline-block;box-sizing:border-box;float:left;cursor:pointer;}
.layui-form-center {display:inline-block;}
.js-prompt-top {color:#C8C9CC;font-size:14px;z-index:999;margin-left:5px;cursor:pointer;}
#time_fission {border: 1px solid #eee;padding: 7px 10px;}
.layui-layout-admin .layui-body .body-content{padding: 0; background-color: transparent;}
.main-wrap .common-wrap{margin-right: 0;margin-left: 0;}
</style>
<div id="app">
<div class="main-wrap">
<div class="common-wrap">
<div class="head">
<span class="title">统计报表</span>
<span class="sub-title">更新时间:{:date('Y-m-d H:i:s')}</span>
</div>
<div class="body">
<div class="layui-input-inline">
<div class="layui-inline layui-inline-margin" id="time_fission">
<div class="layui-input-inline">
<input type="text" id="start_time" name="start_time" autocomplete="off" class="layui-input" placeholder="请输入开始时间" value="{notempty name='$start_time'}{$start_time|date='Y-m-d H:i:s'}{/notempty}">
<i class="iconfont iconriqi"></i>
</div>
<div class="layui-form-center">-</div>
<div class="layui-input-inline">
<input type="text" id="end_time" name="end_time" autocomplete="off" class="layui-input" placeholder="请输入结束时间" value="{notempty name='$end_time'}{$end_time|date='Y-m-d H:i:s'}{/notempty}">
<i class="iconfont iconriqi"></i>
</div>
</div>
</div>
<div class="layui-input-inline">
<div class="date-btn text-color selected" onclick="datePick(2, this)">今日</div>
<div class="date-btn selected" onclick="datePick(1, this)">昨日</div>&nbsp;&nbsp;
<div class="date-btn selected" onclick="datePick(3, this)">本周</div>&nbsp;&nbsp;
<div class="date-btn selected" onclick="datePick(4, this)">本月</div>&nbsp;&nbsp;
</div>
<div class="survey">
<div class="layui-card layui-input-inline" >
<div class="layui-card-header">
<span class="hint">预计收入(元) </span>
<span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,店铺收入的金额减去支出的金额"></span>
</div>
<div class="layui-card-body">
<span class="num total_income" v-text="$options.filters.moneyFormat(realIncome)">0.00</span>
</div>
</div>
<div class="layui-card layui-input-inline" >
<div class="layui-card-header">
<span class="hint">收入总额(元) </span>
<span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,店铺收入的金额(订单收入、会员充值、会员开卡等)"></span>
</div>
<div class="layui-card-body">
<span class="num total_income" v-text="$options.filters.moneyFormat(totalIncome)">0.00</span>
</div>
</div>
<div class="layui-card layui-input-inline" >
<div class="layui-card-header">
<span class="hint">支出总额(元) </span>
<span class="iconfont iconwenhao js-prompt-top" data-tips="统计时间内,店铺支出的金额(退款、会员提现、现金红包等)"></span>
</div>
<div class="layui-card-body">
<span class="num total_expenditure" v-text="$options.filters.moneyFormat(totalDisburse)">0.00</span>
</div>
</div>
<div class="layui-clear"></div>
</div>
</div>
</div>
<div class="common-wrap">
<div class="head">
<span class="title">收入概况</span>
</div>
<div class="body">
<div class="survey stat">
<div class="layui-card layui-input-inline">
<div class="layui-card-header">
<span class="hint">收入总额</span>
</div>
<div class="layui-card-body">
<span class="num total_income" v-text="$options.filters.moneyFormat(totalIncome)">0.00</span>
</div>
</div>
<div class="symbol"> = </div>
<template v-for="(item, index) in incomeData">
<div class="symbol" v-if="index > 0"> + </div>
<div class="stat-text" v-text="item.title"></div>
</template>
</div>
<div class="stat-list">
<div class="stat-item" v-for="(item, index) in incomeData" :key="index">
<div class="stat-name">
<span><span v-text="item.title"></span><i class="iconfont iconwenhao js-prompt-top" :data-tips="item.desc"></i></span>
<a :href="url(item.url)" class="text-color" target="_blank">明细</a>
</div>
<div class="stat-value" v-text="$options.filters.moneyFormat(item.value)">0.00</div>
</div>
</div>
</div>
</div>
<div class="common-wrap">
<div class="head">
<span class="title">支出概况</span>
</div>
<div class="body">
<div class="survey stat">
<div class="layui-card layui-input-inline">
<div class="layui-card-header">
<span class="hint">支出总额</span>
</div>
<div class="layui-card-body">
<span class="num total_income" v-text="$options.filters.moneyFormat(totalDisburse)">0.00</span>
</div>
</div>
<div class="symbol"> = </div>
<template v-for="(item, index) in disburseData">
<div class="symbol" v-if="index > 0"> + </div>
<div class="stat-text" v-text="item.title"></div>
</template>
</div>
<div class="stat-list">
<div class="stat-item" v-for="(item, index) in disburseData" :key="index">
<div class="stat-name">
<span><span v-text="item.title"></span><i class="iconfont iconwenhao js-prompt-top" :data-tips="item.desc"></i></span>
<a :href="url(item.url)" class="text-color" target="_blank">明细</a>
</div>
<div class="stat-value" v-text="$options.filters.moneyFormat(item.value)">0.00</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="STATIC_JS/vue.js"></script>
<script>
var laydate;
layui.use(['laydate'], function () {
laydate = layui.laydate;
//立即执行不生效
setTimeout(function(){
new LayDate({
elem: '#time_fission',
type: 'datetime',
rangeId:['start_time','end_time'],
max: '{:date("Y-m-d")}',
done: function(value, date, endDate){
var time_arr = value.split(' - ');
var start_time = time_arr[0];
var end_time = time_arr[1];
getIncomeData({start_time: dateToTime(start_time), end_time: dateToTime(end_time)});
getDisburseData({start_time: dateToTime(start_time), end_time: dateToTime(end_time)});
$('input[name="start_time"]').val(time_arr[0]);
$('input[name="end_time"]').val(time_arr[1]);
}
});
}, 200)
});
var vue = new Vue({
el: '#app',
data: {
totalIncome: {$total_income}, //总收入
totalDisburse: {$total_disburse}, // 总支出
incomeData: {:json_encode($income_data)}, // 收入组成
disburseData: {:json_encode($disburse_data)} // 支出组成
},
computed: {
realIncome: function(){
return this.totalIncome - this.totalDisburse;
}
},
methods: {
url: function(href){
return ns.href(href)
}
},
filters: {
/**
* 金额格式化输出
* @param {Object} money
*/
moneyFormat(money) {
if (isNaN(parseFloat(money))) return money;
return parseFloat(money).toFixed(2);
}
}
})
/**
* 查询收入数据
* @param data
*/
function getIncomeData(data) {
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("shop/account/income"),
data: data,
success: function(res) {
vue.incomeData = res.data;
var total = 0;
res.data.forEach(function(item){
total += parseFloat(item.value);
});
vue.totalIncome = total;
}
});
}
/**
* 查询支出数据
* @param data
*/
function getDisburseData(data) {
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("shop/account/disburse"),
data: data,
success: function(res) {
vue.disburseData = res.data;
var total = 0;
res.data.forEach(function(item){
total += parseFloat(item.value);
});
vue.totalDisburse = total;
}
});
}
function datePick(date_type,event_obj) {
$(".date-btn").removeClass("select");
$(".date-btn").removeClass("text-color");
$(event_obj).addClass('select');
$(event_obj).addClass('text-color');
var beginTime, endTime;
var now = new Date();
switch (date_type) {
case 1:
now.setDate(now.getDate() - 1);
var Year = now.getFullYear();
var Month = now.getMonth() + 1;
var Day = now.getDate();
if (Month < 10) Month = '0' + Month;
if (Day < 10) Day = '0' + Day;
beginTime = Year + "-" + Month + "-" + Day + ' 00:00:00'; //格式 Y-m-d
endTime = Year + "-" + Month + "-" + Day + ' 23:59:59'; //格式 Y-m-d
break;
case 2:
var Year = now.getFullYear();
var Month = now.getMonth() + 1;
var Day = now.getDate();
if (Month < 10) Month = '0' + Month;
if (Day < 10) Day = '0' + Day;
beginTime = Year + "-" + Month + "-" + Day + ' 00:00:00'; //格式 Y-m-d
endTime = Year + "-" + Month + "-" + Day + ' 23:59:59'; //格式 Y-m-d
break;
case 3:
var Year = now.getFullYear();
var Month = now.getMonth() + 1;
var Day = now.getDate();
if (Month < 10) Month = '0' + Month;
if (Day < 10) Day = '0' + Day;
var week_day = now.getDay();
if (week_day == 0) //星期天表示 0 故当星期天的时候,获取上周开始的时候
{
week_day = 7;
}
now.setDate(Day - week_day + 1);
var prev_year = now.getFullYear();
var prev_month = now.getMonth() + 1;
var prev_day = now.getDate();
if (prev_month < 10) prev_month = '0' + prev_month;
if (prev_day < 10) prev_day = '0' + prev_day;
beginTime = prev_year + "-" + prev_month + "-" + prev_day + ' 00:00:00'; //格式 Y-m-d
endTime = Year + "-" + Month + "-" + Day + ' 23:59:59'; //格式 Y-m-d
break;
case 4:
var beginTimes = now.getFullYear(); //开始计算
var Month = now.getMonth() + 1; //getMonth()是以0开始的月份
var Day = now.getDate();
if (Month < 10) Month = '0' + Month;
if (Day < 10) Day = '0' + Day;
beginTime = beginTimes + "-" + Month + "-01 00:00:00"; //格式 Y-m-d
endTime = beginTimes + "-" + Month + "-" + Day + ' 23:59:59'; //格式 Y-m-d
break;
}
new LayDate({
elem: '#time_fission',
type: 'datetime',
rangeId: ['start_time', 'end_time'],
value: beginTime + ' - ' + endTime,
max: '{:date("Y-m-d")}'
});
$('#start_time').val(beginTime);
$('#end_time').val(endTime);
getIncomeData({start_time: dateToTime(beginTime), end_time: dateToTime(endTime)})
getDisburseData({start_time: dateToTime(beginTime), end_time: dateToTime(endTime)})
}
function dateToTime(date){
return new Date(date).getTime() / 1000;
}
</script>

178
app/shop/view/account/growth.html Executable file
View File

@@ -0,0 +1,178 @@
<style>
.screen {margin-top: 15px}
.table-title {cursor: pointer}
.layui-layout-admin .screen {margin-top: 0;margin-bottom: 15px;}
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
.table-bottom .layui-table-page {position: inherit;text-align: right}
</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">
<select name="from_type">
<option value="">全部</option>
{foreach $from_type as $k => $val}
<option value="{$k}">{$val.type_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">
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</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>
<div class="form-row">
<button class="layui-btn" lay-submit="" id="search" lay-filter="search">筛选</button>
</div>
</form>
</div>
</div>
<table id="account_detail" lay-filter="account_detail"></table>
<script type="text/html" id="memberInfo">
<div class='table-title'>
<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' onclick="location.hash = ns.hash('shop/member/editmember?member_id={{d.member_id}}')">
<p class="layui-elip">{{d.nickname}}</p>
<p class="layui-elip">{{d.mobile}}</p>
</div>
</div>
</script>
<script>
var form, laydate;
layui.use(['laydate','form', 'element'], function(){
form = layui.form;
laydate = layui.laydate;
form.on('submit(search)', function(data) {
if ($('#start_time').val() != '' && $('#end_time').val() != '' && (new Date($('#end_time').val()).getTime() <= new Date($('#start_time').val()).getTime() )) {
layer.msg('结束时间不能小于开始时间');
return false;
}
data.field.account_type = 'growth';
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
laydate.render({
elem: '#start_time',
type: 'datetime',
max: 0,
change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
laydate.render({
elem: '#end_time',
type: 'datetime',
max: 0,
change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
table = new Table({
elem: '#account_detail',
url: ns.url("shop/memberaccount/accountdetail"),
where: {
account_type: 'growth'
},
cols: [
[{
templet: '#memberInfo',
title: '会员信息',
width: '20%',
unresize: 'false'
}, {
title: '成长值变化',
width: '15%',
unresize: 'false',
templet: function (d) {
if (d.account_data > 0) return '+' + parseInt(d.account_data);
return parseInt(d.account_data);
}
}, {
field: 'type_name',
title: '发生方式',
width: '15%',
unresize: 'false'
}, {
field: 'create_time',
title: '发生时间',
width: '20%',
unresize: 'false',
templet: function(data) {
return ns.time_to_date(data.create_time);
}
}, {
field: 'remark',
title: '备注',
width: '30%',
unresize: 'false'
}]
]
});
})
/**
* 七天时间
*/
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>

200
app/shop/view/account/point.html Executable file
View File

@@ -0,0 +1,200 @@
<style>
.layui-card-body .content{width: 33.3%;}
.layui-card-body .bottom-title{color: #909399;font-size: 14px;margin-top: 5px;}
.table-bottom .layui-table-page {position: inherit;text-align: right}
.table-tab .layui-tab-content{margin-bottom: 0;}
.js-prompt-top{color: #C8C9CC;font-size: 14px;z-index: 999;margin-left: 5px;cursor: pointer;}
.table-title {cursor: pointer}
.layui-layout-admin .screen{margin: 15px 0;}
.layui-layout-admin .layui-form-item .layui-input-inline { background-color: #fff; }
</style>
<div class="layui-card card-common card-brief panel-content">
<div class="layui-card-header simple">
<span class="card-title">积分概况</span>
</div>
<div class="layui-card-body">
<div class="content">
<p class="title">可用积分</p>
<p class="money">{$total_usable_point}</p>
</div>
<div class="content">
<p class="title">累计发放积分</p>
<p class="money">{$grant_point}</p>
</div>
<div class="content">
<p class="title">累计使用积分</p>
<p class="money">{$consume_point}</p>
</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="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">
<select name="from_type">
<option value="">全部</option>
{foreach $from_type as $k => $val}
<option value="{$k}">{$val.type_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">
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</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>
<div class="form-row">
<button class="layui-btn" lay-submit="" id="search" lay-filter="search">筛选</button>
</div>
</form>
</div>
</div>
<table id="account_detail" lay-filter="account_detail"></table>
<script type="text/html" id="memberInfo">
<div class='table-title'>
<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' onclick="location.hash = ns.hash('shop/member/editmember?member_id={{d.member_id}}')">
<p class="layui-elip">{{d.nickname}}</p>
<p class="layui-elip">{{d.mobile}}</p>
</div>
</div>
</script>
<script>
var form, laydate;
layui.use(['laydate','form', 'element'], function(){
form = layui.form;
laydate = layui.laydate;
form.on('submit(search)', function(data) {
if ($('#start_time').val() != '' && $('#end_time').val() != '' && (new Date($('#end_time').val()).getTime() <= new Date($('#start_time').val()).getTime() )) {
layer.msg('结束时间不能小于开始时间');
return false;
}
data.field.account_type = 'point';
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
laydate.render({
elem: '#start_time',
type: 'datetime',
max: 0,
change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
laydate.render({
elem: '#end_time',
type: 'datetime',
max: 0,
change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
table = new Table({
elem: '#account_detail',
url: ns.url("shop/memberaccount/accountdetail"),
where: {
account_type: 'point'
},
cols: [
[{
templet: '#memberInfo',
title: '会员信息',
width: '20%',
unresize: 'false'
}, {
title: '积分变化',
width: '10%',
align:'right',
unresize: 'false',
templet: function (d) {
if (d.account_data > 0) return '+' + parseInt(d.account_data);
return parseInt(d.account_data);
}
}, {
field: 'type_name',
title: '发生方式',
align:'center',
unresize: 'false'
}, {
field: 'create_time',
title: '发生时间',
unresize: 'false',
templet: function(data) {
return ns.time_to_date(data.create_time);
}
}, {
field: 'remark',
title: '备注',
unresize: 'false'
}]
]
});
})
/**
* 七天时间
*/
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>

View File

@@ -0,0 +1,390 @@
<style>
.layui-card-body .content{width: 33.3%;}
.layui-card-body .bottom-title{color: #909399;font-size: 14px;margin-top: 5px;}
.table-bottom .layui-table-page{top: 0;position: static;}
.table-tab .layui-tab-content{margin-bottom: 0;}
.layui-layout-admin .screen{margin-bottom: 15px;}
.align-center {text-align: center!important;}
.layui-table td, .layui-table th {padding: 15px}
</style>
<div class="layui-card card-common card-brief panel-content">
<div class="layui-card-header simple">
<span class="card-title">积分概况</span>
</div>
<div class="layui-card-body">
<div class="content">
<p class="title">可用积分 <a href="{:href_url('shop/memberaccount/point')}" class="text-color">明细</a></p>
<p class="money">{$total_usable_point}</p>
</div>
<div class="content">
<p class="title">累计发放积分 <a href="{:href_url('shop/memberaccount/point')}" class="text-color">明细</a></p>
<p class="money">{$grant_point}</p>
</div>
<div class="content">
<p class="title">累计使用积分 <a href="{:href_url('shop/memberaccount/point')}" class="text-color">明细</a></p>
<p class="money">{$consume_point}</p>
</div>
</div>
</div>
<div class="layui-card card-common card-brief">
<div class="layui-card-header simple">
<span class="card-title">积分规则</span>
</div>
<div class="layui-card-body" style="padding: 10px 25px!important;">
<table class="layui-table" lay-skin="nob">
<colgroup>
<col width="20%">
<col width="50%">
<col width="15%">
<col width="15%">
</colgroup>
<thead>
<tr>
<th>规则名称</th>
<th>规则详情</th>
<th>更新时间</th>
<th class="align-center">操作</th>
</tr>
</thead>
<tbody>
{foreach name="$rule" item="vo"}
<tr>
<td>{$vo.title}</td>
<td>{$vo.content}</td>
<td>{if $vo.update_time}{:time_to_date($vo.update_time)}{else/}-{/if}</td>
<td class="align-center"><a href="{:href_url($vo.url)}" class="text-color" target="_blank">查看</a></td>
</tr>
{/foreach}
<tr>
</tbody>
</table>
</div>
</div>
<div class="layui-card card-common card-brief">
<div class="layui-card-header simple">
<span class="card-title">积分操作</span>
</div>
<div class="layui-card-body" style="padding: 10px 25px!important;">
<button class="layui-btn" onclick="clearpoint()">积分清零</button>
<button class="layui-btn" onclick="reset()">积分重置</button>
</div>
</div>
<div class="layui-card card-common card-brief">
<div class="layui-card-header simple">
<span class="card-title">积分任务</span>
</div>
<div class="layui-card-body" style="padding: 10px 25px!important;">
<span id="point_task_config_desc"></span>
<a class="text-color" onclick="pointTaskConfig()" href="javascript:;">设置</a>
</div>
</div>
<script id="clear_html" type="text/html">
<div class="layui-form member-form" id="reset_label" lay-filter="form">
<div class="layui-form-item">
<label class="layui-form-label sm">说明</label>
<div class="layui-input-block">
<textarea name="remark" class="layui-textarea len-long" maxlength="150"></textarea>
</div>
<div class="word-aux sm"><p>积分清零后会将会员现有的积分全部清零,请谨慎操作</p></div>
</div>
<div class="form-row sm">
<button class="layui-btn" lay-submit lay-filter='clear_bth'>确定</button>
<button class="layui-btn layui-btn-primary" lay-submit lay-filter='clear_close_bth'>取消</button>
</div>
</div>
</script>
<script id="point_task_config" type="text/html">
<div class="layui-form member-form" lay-filter="form">
<div class="layui-form-item">
<label class="layui-form-label sm">任务状态</label>
<div class="layui-input-block">
<input type="radio" name="status" value="1" title="开启" {{# if(d.status == 1){ }} checked {{# } }} lay-filter="status">
<input type="radio" name="status" value="0" title="关闭" {{# if(d.status == 0){ }} checked {{# } }} lay-filter="status">
</div>
</div>
<div id="point_status_on" {{# if(d.status == 0){ }}style="display:none;"{{# } }}>
<div class="layui-form-item">
<label class="layui-form-label sm">任务类型</label>
<div class="layui-input-block">
<input type="radio" name="type" value="clear" title="清零" {{# if(d.type == 'clear'){ }} checked {{# } }}>
<input type="radio" name="type" value="reset" title="重置" {{# if(d.type == 'reset'){ }} checked {{# } }}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label sm">任务时间</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="hidden" name="time_type" value="1"/>
每年
</div>
<div class="layui-input-inline len-short">
<select name="month" lay-filter="month1">
{{# d.month_arr.forEach((item)=>{ }}
<option value="{{item.id}}" {{# if(d.month == item.id){ }}selected{{# } }}>{{item.name}}</option>
{{# }) }}
</select>
</div>
<div class="layui-input-inline len-short">
<select name="day">
{{# d.day_arr.forEach((item)=>{ }}
<option value="{{item.id}}" {{# if(d.day == item.id){ }}selected{{# } }}>{{item.name}}</option>
{{# }) }}
</select>
</div>
</div>
</div>
</div>
<div class="form-row sm">
<button class="layui-btn" lay-submit lay-filter='point_task_config_save'>确定</button>
<button class="layui-btn layui-btn-primary" lay-filter='point_task_config_cancel'>取消</button>
</div>
</div>
</script>
<script>
var form, laydate, laytpl;
layui.use(['laydate','form', 'element', 'laytpl'], function(){
form = layui.form;
laydate = layui.laydate;
laytpl = layui.laytpl;
});
var clear_tag = false;
var clear_index;
function clearpoint(){
laytpl($("#clear_html").html()).render([], function(html) {
clear_index = layer.open({
title: '积分清零',
skin: 'layer-tips-class',
type: 1,
area: ['600px'],
content: html,
success: function(){
form.on('submit(clear_bth)', function(obj) {
var field = obj.field;
if (clear_tag) return;
clear_tag = true;
$.ajax({
type: 'POST',
url: ns.url("shop/memberaccount/pointclear"),
dataType: 'JSON',
data: field,
success: function(res) {
clear_tag = false;
layer.msg(res.message);
if (res.code >= 0) {
listenerHash(); // 刷新页面
layer.closeAll();
}
}
});
});
form.on('submit(clear_close_bth)', function(obj) {
clear_tag = false;
layer.close(clear_index);
})
}
});
});
form.render();
}
var reset_tag = false;
function reset() {
if (reset_tag) return;
reset_tag = true;
layer.confirm('您确定要将会员现有的积分全部重置吗(重置后会员的积分以及积分记录全都会被删除)', {
btn: ['确定', '取消'] //按钮
}, function (index) {
layer.close(index);
$.ajax({
type: 'POST',
url: ns.url("shop/memberaccount/pointreset"),
dataType: 'JSON',
success: function (res) {
reset_tag = false;
layer.msg(res.message);
if (res.code >= 0) {
listenerHash(); // 刷新页面
}
}
});
}, function () {
reset_tag = false;
layer.closeAll();
});
}
//积分任务设置
var point_task_config = {:json_encode($point_task_config)};
var task_index = null;
function pointTaskConfigDesc(){
var desc = '';
if(point_task_config['status'] == 0){
desc += '无任务';
}else{
switch(Number(point_task_config['time_type'])){
case 1:
var time_arr = point_task_config['time'].split('/');
var month = time_arr[0];
var day = time_arr[1];
desc += '每年'+month+'月'+day+'日';
break;
}
switch(point_task_config['type']){
case 'clear':
desc += '积分清零';
break;
case 'reset':
desc += '积分重置';
break;
}
desc += '<span style="padding-left:10px;"></span>下次任务时间:'+ns.time_to_date(point_task_config['cron_time'], 'Y-m-d');
}
$("#point_task_config_desc").html(desc);
}
pointTaskConfigDesc();
function pointTaskConfig(){
function _render(callback){
_timeToField(point_task_config);
point_task_config.month_arr = _getMonth();
point_task_config.day_arr = _getDay(point_task_config['month1']);
laytpl($("#point_task_config").html()).render(point_task_config, function(html) {
callback(html);
})
}
function _open(html, callback){
task_index = layer.open({
title: '积分任务',
skin: 'layer-tips-class',
type: 1,
area: ['600px'],
content: html,
success: function(){
$(".layui-layer-content").css('height','auto');
form.render();
callback();
}
})
}
function _getMonth(){
var arr = [];
for(let i = 1; i <= 12; i ++){
arr.push({
id : i,
name : i + '月',
})
}
return arr;
}
function _getDay(month) {
month = Number(month);
var day_num = 30;
if([2].indexOf(month) > -1){
day_num = 29;
}else if([1,3,5,7,8,10,12].indexOf(month) > -1){
day_num = 31;
}
var arr = [];
for(let i = 1; i <= day_num; i ++){
arr.push({
id : i,
name : i + '日',
})
}
return arr;
}
function _monthSelect(){
form.on('select(month1)', function (data){
var month = data.value;
var day_arr = _getDay(month);
let html = '';
day_arr.forEach((item)=>{
html += '<option value="'+ item.id +'">'+ item.name +'</option>';
})
$("select[name='day1']").html(html);
form.render();
})
}
function _statusChange(){
form.on('radio(status)', function (data){
var status = data.value;
var dom = $("#point_status_on");
if(status == 1){
dom.show();
}else{
dom.hide();
}
})
}
function _timeToField(field){
switch(Number(field.time_type)){
case 1:
var time_arr = field.time.split('/');
field.month = time_arr[0];
field.day = time_arr[1];
break;
}
}
function _fieldToTime(field){
switch(Number(field.time_type)){
case 1:
field.time = field.month+'/'+field.day;
break;
}
}
function _save(){
form.on('submit(point_task_config_save)', function(data) {
var field = data.field;
_fieldToTime(field);
if (clear_tag) return;
clear_tag = true;
$.ajax({
type: 'POST',
url: ns.url("shop/memberaccount/pointtaskconfig"),
dataType: 'JSON',
data: field,
success: function(res) {
clear_tag = false;
layer.msg(res.message);
if (res.code >= 0) {
point_task_config = res.data;
pointTaskConfigDesc();
layer.close(task_index);
}
}
});
});
}
function _cancel(){
$("button[lay-filter='point_task_config_cancel']").on('click', function() {
layer.close(task_index);
});
}
_render((res)=>{
_open(res, ()=>{
_statusChange();
_monthSelect();
_save();
_cancel();
})
})
}
</script>

216
app/shop/view/address/manage.html Executable file
View File

@@ -0,0 +1,216 @@
<style>
.align-left {text-align: left!important;}
.align-right {text-align: right!important;}
.area-table .toggle {user-select: none;cursor: pointer;}
.area-table .toggle .icon {display: inline-block;width: 10px;text-align: center}
.area-table .flex-wrap {display: flex;align-items: center}
.area-table .level-icon { margin-right: 10px; }
.area-table .add-child {margin-left: 10px}
.area-table tr th:first-child, .area-table tr td:first-child {padding: 9px 0 9px 10px}
</style>
<div class="single-filter-box">
<button class="layui-btn add-area">添加地区</button>
</div>
<table class="layui-table area-table mt-auto" lay-skin="nob">
<colgroup>
<col width="1%">
<col width="50%">
<col width="16%">
<col width="17%">
<col width="16%">
</colgroup>
<thead>
<tr>
<th></th>
<th class="align-left">名称</th>
<th class="align-left">简称</th>
<th class="align-left">地区编码</th>
<th class="align-right">操作</th>
</tr>
</thead>
{foreach name="area" item="vo"}
<tbody data-parent="0" data-id="{$vo.id}" data-level="1">
<tr>
{if $vo.child_num}
<td class="toggle"><span class="icon text-color">+</span></td>
{else/}
<td></td>
{/if}
<td class="flex-wrap">
<input type="text" class="layui-input len-mid" name="name" value="{$vo.name}">
<a href="javascript:;" class="text-color add-child">添加下级地区</a>
</td>
<td>
<input type="text" class="layui-input len-mid" name="shortname" value="{$vo.shortname}">
</td>
<td>{$vo.id}</td>
<td class="align-right">
<a href="javascript:;" class="text-color delete-area">删除</a>
</td>
</tr>
</tbody>
{/foreach}
</table>
<script type="text/javascript">
$(function(){
// 点击展开子菜单
$('body').off('click', '.area-table .toggle').on('click', '.area-table .toggle', function(){
var data = $(this).parents('tbody').data();
if (!$('.area-table tbody[data-parent="'+ data.id +'"][data-id]').length) {
var child = getChild(data.id, data.level + 1);
if (child.length) {
var html = '';
child.forEach(function(item){
html += '<tbody data-parent="'+ data.id +'" data-id="'+ item.id +'" data-level="'+ (data.level + 1) +'"><tr>';
if (item.child_num) html += '<td class="toggle"><span class="icon text-color">+</span></td>';
else html += '<td></td>';
html += '<td class="flex-wrap"><span class="level-icon">'+ (data.level == 1 ? '|--' : '|----') +'</span><input type="text" class="layui-input len-mid" name="name" value="'+ item.name +'">';
if (data.level < 2) html += '<a href="javascript:;" class="add-child text-color">添加下级地区</a></td>';
else html += '</td>';
html += '<td><input type="text" class="layui-input len-mid" name="shortname" value="'+ item.shortname +'"></td>';
html += '<td>'+ item.id +'</td>';
html+= '<td class="align-right"><a href="javascript:;" class="text-color delete-area">删除</a></td>';
html+= '</tr></tbody>';
})
$(this).parents('tbody').after(html);
}
$(this).html('<span class="icon text-color">-</span>');
} else {
if ($('.area-table tbody[data-parent="'+ data.id +'"][data-id]:eq(0)').is(':hidden')) {
$('.area-table tbody[data-parent="'+ data.id +'"]').show();
$(this).html('<span class="icon text-color">-</span>');
} else {
$('.area-table tbody[data-parent="'+ data.id +'"]').hide();
$(this).html('<span class="icon text-color">+</span>');
}
}
})
// 添加子菜单
$('body').off('click', '.area-table .add-child').on('click', '.area-table .add-child', function(){
var data = $(this).parents('tbody').data();
var html = '<tbody data-parent="'+ data.id +'" data-id="0" data-level="'+ (data.level + 1) +'"><tr>';
html += '<td></td>';
html += '<td class="flex-wrap"><span class="level-icon">'+ (data.level == 1 ? '|--' : '|----') +'</span><input type="text" class="layui-input len-mid" name="name" value=""></td>';
html += '<td><input type="text" class="layui-input len-mid" name="shortname" value=""></td>';
html += '<td><input type="text" class="layui-input len-short" name="id" value=""></td>';
html += '<td class="align-right"></td>';
html+= '</tr></tbody>';
if (!$('.area-table tbody[data-parent="'+ data.id +'"]').length) {
$(this).parents('tbody').after(html);
} else {
$('.area-table tbody[data-parent="'+ data.id +'"]:last').after(html);
}
})
$('.add-area').click(function (){
var html = `<tbody data-parent="0" data-id="0" data-level="1">
<tr>
<td></td>
<td class="flex-wrap">
<input type="text" class="layui-input len-mid" name="name" value="">
</td>
<td>
<input type="text" class="layui-input len-mid" name="shortname" value="">
</td>
<td>
<input type="text" class="layui-input len-short" name="id" value="">
</td>
<td class="align-right">
</td>
</tr>
</tbody>`;
$('.area-table thead').after(html);
})
// 保存或编辑地区
$('body').off('change', '.area-table input').on('change', '.area-table input', function(){
var tbody = $(this).parents('tbody');
var form = {
id: tbody.attr('data-id') != 0 ? tbody.attr('data-id') : tbody.find('[name="id"]').val().trim(),
pid: tbody.attr('data-parent'),
level: tbody.attr('data-level'),
name: tbody.find('[name="name"]').val().trim(),
shortname: tbody.find('[name="shortname"]').val().trim(),
};
if (form.id == 0 || !form.name) return;
$.ajax({
url: ns.url('shop/address/savearea'),
data: form,
dataType: 'json',
success: function(res){
if (res.code == 0) {
if (!tbody.attr('data-id')) tbody.attr('data-id', res.data);
} else {
layer.msg(res.message);
}
}
})
})
var deleteRepeat = false;
$('body').off('click', '.area-table .delete-area').on('click', '.area-table .delete-area', function(){
var tbody = $(this).parents('tbody');
layer.confirm('删除该地区将会连该地区下级的地区也一并删除,是否要继续操作?', function(index) {
if (deleteRepeat) return;
deleteRepeat = true;
layer.close(index);
$.ajax({
url: ns.url('shop/address/deletearea'),
data: {
id: tbody.attr('data-id'),
level: tbody.attr('data-level'),
},
dataType: 'json',
success: function(res){
deleteRepeat = false;
if (res.code == 0) {
layer.closeAll();
tbody.remove();
switch (tbody.attr('data-level')) {
case '1':
$('.area-table tbody[data-parent="'+ tbody.attr('data-id') +'"]').each(function (){
let id = $(this).attr('data-id');
$('.area-table tbody[data-parent="'+ id +'"]').remove();
$(this).remove();
})
break;
case '2':
$('.area-table tbody[data-parent="'+ tbody.attr('data-id') +'"]').remove();
break;
}
} else {
layer.msg(res.message);
}
}
})
})
})
})
function getChild(pid, level){
var data = [];
$.ajax({
url: ns.url('shop/address/getAreaList'),
data: {
pid: pid,
level: level,
child: 1
},
dataType: 'json',
async: false,
success: function(res){
if (res.code == 0 && res.data) {
data = res.data;
}
}
})
return data;
}
</script>

220
app/shop/view/adv/add_adv.html Executable file
View File

@@ -0,0 +1,220 @@
<style>
.adv-url-show{margin-right: 10px;}
.layui-colorpicker-main-input div.layui-inline{margin-right: 0;}
.layui-colorpicker-main-input input.layui-input{width: 130px;height: 34px;}
</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="adv_title" type="text" lay-verify="required" class="layui-input len-long">
</div>
</div>
{notempty name="$adv_position_list"}
<div class="layui-form-item">
<label class="layui-form-label">所属广告位:</label>
<div class="layui-input-block len-mid">
<select name="ap_id" lay-filter="ap_id">
{foreach $adv_position_list as $adv_position_k => $adv_position_v}
<option value="{$adv_position_v.ap_id}" {if $ap_id == $adv_position_v.ap_id}selected{/if} data-type="{$adv_position_v.type}" data-width="{$adv_position_v.ap_width}" data-height="{$adv_position_v.ap_height}">{$adv_position_v.ap_name}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item" data-type="2" {if $adv_position_list[0]['type'] == 1}style="display: none"{/if}>
<label class="layui-form-label">移动端广告链接:</label>
<div class="layui-input-block len-mid">
<span class="adv-url-show"></span>
<button class="layui-btn layui-btn-primary sm" onclick="selectedLink()">选择链接</button>
</div>
</div>
<input name="adv_url" type="hidden" />
{/notempty}
<div class="layui-form-item">
<label class="layui-form-label">广告图片:</label>
<div class="layui-input-block">
<div class="upload-img-block img-upload">
<div class="upload-img-box">
<div class="upload-default" id="adv_image">
<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" name="adv_image" value="">
</div>
</div>
</div>
<div class="word-aux">建议宽度<span class="pic_width">750</span>px 建议高度<span class="pic_height">350</span>px</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input name="slide_sort" value="0" type="number" placeholder="排序" lay-verify="num" class="layui-input len-short">
</div>
<div class="word-aux">排序值必须为整数</div>
</div>
<div class="layui-form-item" style="display: none">
<label class="layui-form-label">广告价格:</label>
<div class="layui-input-block">
<input name="price" value="0.00" type="number" placeholder="广告价格" lay-verify="flo" class="layui-input len-short">
</div>
<div class="word-aux">广告价格 / 月</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backAdvList()">返回</button>
<a id="advImageId"></a>
</div>
<input type="hidden" name="background" id="ap_background_color" value="#FFFFFF" />
</div>
<script>
var saveData = null;
var totalUploadNum = 0;
var completeUploadNum = 0;
var logo_upload;
layui.use(['form', 'colorpicker'], function () {
var form = layui.form,
colorpicker = layui.colorpicker,
repeat_flag = false; //防重复标识
form.render();
form.on('select(ap_id)', function(data){
var type = $(data.elem).find("option:selected").attr("data-type");
$("[data-type]").hide();
$("[data-type='"+ type+"']").show();
});
/**
* 颜色
*/
colorpicker.render({
elem: '#bg_color', //绑定元素
color: "#FFFFFF",
done: function(color) {
$(".tdrag-name").css("color", color);
$("#ap_background_color").val(color);
}
});
// 广告图片
logo_upload = new Upload({
elem: '#adv_image',
auto:false,
bindAction:'#advImageId',
callback: function(res) {
uploadComplete('adv_image', res.data.pic_path);
}
});
function uploadComplete(field, pic_path) {
saveData.field[field] = pic_path;
completeUploadNum += 1;
if(completeUploadNum == totalUploadNum){
saveFunc();
}
}
function saveFunc(){
var data = saveData;
$.ajax({
url: ns.url("shop/adv/addAdv"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
yes: function(index, layero) {
location.hash = ns.hash("shop/adv/lists", {ap_id: '{$ap_id}'})
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
});
}
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
saveData = data;
var obj = $("img.img_prev[data-prev='1']");
totalUploadNum = obj.length;
if(totalUploadNum > 0){
obj.each(function(){
var actionId = $(this).attr('data-action-id');
$(actionId).click();
})
}else{
saveFunc();
}
});
/**
* 表单验证
*/
form.verify({
num: function (value) {
let reg = ns.getRegexp('>=0num');
if (value !== '' && !reg.test(value)) {
return '排序数值必须为大于或等于0的整数'
}
},
flo: function (value) {
let reg = ns.getRegexp('>=0float2');
if (value !== '' && !reg.test(value)) {
return '价格必须大于或等于0最多保留两位小数'
}
}
});
});
function backAdvList() {
location.hash = ns.hash("shop/adv/lists", {ap_id : '{$ap_id}'})
}
function selectedLink() {
var d = {};
ns.select_link(d, function (data) {
for (var o in data) {
if (data[o] == null) delete data[o];
}
$("input[name='adv_url']").val(JSON.stringify(data));
$(".adv-url-show").text(data.title);
});
}
</script>

View File

@@ -0,0 +1,115 @@
<style>
.layui-colorpicker-main-input div.layui-inline{margin-right: 0;}
.layui-colorpicker-main-input input.layui-input{width: 130px;height: 34px;}
</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="ap_name" type="text" lay-verify="required" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>广告关键字:</label>
<div class="layui-input-block">
<input name="keyword" type="text" lay-verify="required" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">广告位简介:</label>
<div class="layui-input-block len-long">
<textarea name="ap_intro" class="layui-textarea" maxlength="150"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否启用:</label>
<div class="layui-input-block">
<input type="checkbox" name="state" value="1" lay-skin="switch" lay-filter="state" checked/>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backAdvIndex()">返回</button>
</div>
<input type="hidden" name="ap_background_color" id="ap_background_color" value="#FFFFFF" />
</div>
<script>
layui.use(['form', 'colorpicker'], function () {
var form = layui.form,
colorpicker = layui.colorpicker,
repeat_flag = false; //防重复标识
form.render();
/**
* 颜色
*/
colorpicker.render({
elem: '#bg_color', //绑定元素
color: "#FFFFFF",
done: function(color) {
$(".tdrag-name").css("color", color);
$("#ap_background_color").val(color);
}
});
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/adv/addPosition"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
yes: function(index, layero) {
location.hash = ns.hash("shop/adv/index")
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
});
});
/**
* 表单验证
*/
form.verify({
int: function (value) {
if (value == '') {
return;
}
if (value < 0 || value%1 != 0) {
return '请输入0或正整数'
}
}
});
});
function backAdvIndex() {
location.hash = ns.hash("shop/adv/index")
}
</script>

233
app/shop/view/adv/edit_adv.html Executable file
View File

@@ -0,0 +1,233 @@
<style>
.adv-url-show{margin-right: 10px;}
.layui-colorpicker-main-input div.layui-inline{margin-right: 0;}
.layui-colorpicker-main-input input.layui-input{width: 130px;height: 34px;}
</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="adv_title" type="text" value="{$adv_info.adv_title}" lay-verify="required" class="layui-input len-long">
</div>
</div>
{notempty name="$adv_position_list"}
<div class="layui-form-item">
<label class="layui-form-label">所属广告位:</label>
<div class="layui-input-block len-mid">
<select name="ap_id" lay-filter="ap_id">
{foreach $adv_position_list as $adv_position_k => $adv_position_v}
<option value="{$adv_position_v.ap_id}" data-type="{$adv_position_v.type}" data-width="{$adv_position_v.ap_width}" data-height="{$adv_position_v.ap_height}" {if condition="$adv_position_v.ap_id == $adv_info.ap_id"}selected{/if} >{$adv_position_v.ap_name}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item" data-type="2" {if $type == 1}style="display: none"{/if}>
<label class="layui-form-label">移动端广告链接:</label>
<div class="layui-input-block len-mid">
<span class="adv-url-show"></span>
<button class="layui-btn layui-btn-primary sm" onclick="selectedLink()">选择链接</button>
</div>
</div>
<input name="adv_url" type="hidden" value="{$adv_info.adv_url}" />
{/notempty}
<div class="layui-form-item">
<label class="layui-form-label">广告图片:</label>
<div class="layui-input-block">
<div class="upload-img-block img-upload">
<div class="upload-img-box {notempty name="$adv_info['adv_image']"}hover{/notempty}">
<div class="upload-default" id="adv_image">
{if condition="$adv_info.adv_image"}
<div id="preview_adv_image" class="preview_img">
<img layer-src src="{:img($adv_info.adv_image)}" class="img_prev"/>
</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" 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" name="adv_image" value="{$adv_info.adv_image}">
</div>
</div>
</div>
<div class="word-aux">建议宽度<span class="pic_width">750</span>px 建议高度<span class="pic_height">350</span>px</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input name="slide_sort" value="{$adv_info.slide_sort}" type="number" placeholder="排序" lay-verify="num" class="layui-input len-short">
</div>
<div class="word-aux">排序值必须为整数</div>
</div>
<div class="layui-form-item" style="display: none">
<label class="layui-form-label">广告价格:</label>
<div class="layui-input-block">
<input name="price" value="{$adv_info.price}" type="number" placeholder="广告价格" lay-verify="flo" class="layui-input len-short">
</div>
<div class="word-aux">单位:元 &nbsp;&nbsp; 价格不能小于0可以保留两位小数</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backAdvList()">返回</button>
<a id="advImageId"></a>
</div>
<input type="hidden" name="background" id="background" value="{$adv_info.background}" />
<input type="hidden" name="adv_id" value="{$adv_info.adv_id}" />
</div>
<script>
var color = $("#background").val();
var adv_url_json = $("input[name='adv_url']").val();
var saveData = null;
var totalUploadNum = 0;
var completeUploadNum = 0;
var ap_id = '{$ap_id}';
var logo_upload;
if(adv_url_json) adv_url_json = JSON.parse(adv_url_json);
$(".adv-url-show").text(adv_url_json.title);
layui.use(['form', 'colorpicker'], function () {
var form = layui.form,
colorpicker = layui.colorpicker,
repeat_flag = false; //防重复标识
form.render();
form.on('select(ap_id)', function(data){
var type = $(data.elem).find("option:selected").attr("data-type");
$("[data-type]").hide();
$("[data-type='"+ type+"']").show();
});
/**
* 颜色
*/
colorpicker.render({
elem: '#bg_color', //绑定元素
color: color,
done: function(color) {
$(".tdrag-name").css("color", color);
$("#background").val(color);
}
});
// 广告图片
logo_upload = new Upload({
elem: '#adv_image',
auto:false,
bindAction:'#advImageId',
callback: function(res) {
uploadComplete('adv_image', res.data.pic_path);
}
});
function uploadComplete(field, pic_path) {
saveData.field[field] = pic_path;
completeUploadNum += 1;
if(completeUploadNum == totalUploadNum){
saveFunc();
}
}
function saveFunc(){
var data = saveData;
$.ajax({
url: ns.url("shop/adv/editAdv"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("shop/adv/lists", {ap_id:ap_id})
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
});
}
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
saveData = data;
var obj = $("img.img_prev[data-prev='1']");
totalUploadNum = obj.length;
if(totalUploadNum > 0){
obj.each(function(){
var actionId = $(this).attr('data-action-id');
$(actionId).click();
})
}else{
saveFunc();
}
});
/**
* 表单验证
*/
form.verify({
num: function (value) {
let reg = ns.getRegexp('>=0num');
if (value !== '' && !reg.test(value)) {
return '排序数值必须为大于或等于0的整数'
}
},
flo: function (value) {
let reg = ns.getRegexp('>=0float2');
if (value !== '' && !reg.test(value)) {
return '价格必须大于或等于0最多保留两位小数'
}
}
});
});
function backAdvList() {
location.hash = ns.hash("shop/adv/lists", {ap_id:ap_id})
}
function selectedLink() {
if (adv_url_json == "") {
adv_url_json = {};
}
ns.select_link(adv_url_json, function (data) {
for (var o in data) {
if (data[o] == null) delete data[o];
}
$("input[name='adv_url']").val(JSON.stringify(data));
$(".adv-url-show").text(data.title);
});
}
</script>

View File

@@ -0,0 +1,117 @@
<style>
.layui-colorpicker-main-input div.layui-inline{margin-right: 0;}
.layui-colorpicker-main-input input.layui-input{width: 130px;height: 34px;}
</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="ap_name" type="text" value="{$info.ap_name}" lay-verify="required" class="layui-input len-long {if condition="$info.is_system == 1"}layui-btn-disabled{/if}" {if condition="$info.is_system == 1"}disabled{/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>广告关键字:</label>
<div class="layui-input-block">
<input name="keyword" value='{$info.keyword}'type="text" lay-verify="required" class="layui-input len-long {if condition="$info.is_system == 1"}layui-btn-disabled{/if}" {if condition="$info.is_system == 1"}disabled{/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">广告位简介:</label>
<div class="layui-input-block len-long">
<textarea name="ap_intro" maxlength="150" class="layui-textarea {if condition="$info.is_system == 1"}layui-btn-disabled{/if}" {if condition="$info.is_system == 1"}disabled{/if}>{$info.ap_intro}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否启用:</label>
<div class="layui-input-block">
<input type="checkbox" name="state" value="1" lay-skin="switch" lay-filter="state" {if condition="$info.state == 1"} checked {/if} />
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backAdvIndex()">返回</button>
</div>
<input type="hidden" name="ap_id" value="{$info.ap_id}" />
<input type="hidden" name="ap_background_color" id="ap_background_color" value="{$info.ap_background_color}" />
</div>
<script>
var colorN = $("#ap_background_color").val();
layui.use(['form', 'colorpicker'], function () {
var form = layui.form,
colorpicker = layui.colorpicker,
repeat_flag = false; //防重复标识
form.render();
/**
* 颜色
*/
colorpicker.render({
elem: '#font_color', //绑定元素
color: colorN,
done: function(color) {
$(".tdrag-name").css("color", color);
$("#ap_background_color").val(color);
}
});
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/adv/editPosition"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("shop/adv/index")
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
});
});
/**
* 表单验证
*/
form.verify({
int: function (value) {
if (value == '') {
return;
}
if (value < 0 || value%1 != 0) {
return '请输入0或正整数'
}
}
});
});
function backAdvIndex() {
location.hash = ns.hash("shop/adv/index")
}
</script>

240
app/shop/view/adv/index.html Executable file
View File

@@ -0,0 +1,240 @@
<style>
.layui-form{margin-left: initial !important;}
.single-filter-box{padding-top: 0;}
</style>
<div class="single-filter-box">
<div></div>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入广告位名称" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="adv_position" lay-filter="adv_position"></table>
<!-- 广告位宽度 -->
<script type="text/html" id="ap_width">
<input name="ap_width" type="number" onchange="editPosition({{d.ap_id}}, 'ap_width', this)" value="{{d.ap_width}}"
class="layui-input sort-len">
</script>
<!-- 广告位高度 -->
<script type="text/html" id="ap_height">
<input name="ap_height" type="number" onchange="editPosition({{d.ap_id}}, 'ap_height', this)" value="{{d.ap_height}}" class="layui-input sort-len">
</script>
<!-- 操作 -->
<script type="text/html" id="action">
<div class="table-btn">
<a class="layui-btn" lay-event="manager">管理广告</a>
<a class="layui-btn" lay-event="edit">编辑</a>
</div>
</script>
<!-- 批量删除 -->
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="del">批量删除</button>
</script>
<!-- 批量删除 -->
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="del">批量删除</button>
</script>
<script>
var table, form,
repeat_flag = false; //防重复标识
layui.use('form', function () {
form = layui.form;
form.render();
form.on('switch(state)', function(data){
let state = data.elem.checked ? 1 : 0;
let ap_id = $(data.elem).attr('data-ap-id');
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/adv/alterAdvPositionState"),
data: {
ap_id : ap_id,
state : state,
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
}
});
})
table = new Table({
elem: '#adv_position',
url: ns.url("shop/adv/index"),
cols: [
[
{
field: 'ap_name',
title: '广告位名称',
unresize: 'false',
width: '16%',
}, {
field: 'keyword',
title: '广告关键字',
unresize: 'false',
width: '24%',
}, {
title: '是否是系统',
unresize: 'false',
templet: function(data) {
return data.is_system == 0 ? "否" : "是";
},
width: '10%',
},{
title: '是否启用',
unresize: 'false',
templet: function(data) {
return '<input type="checkbox" name="state" value="1" lay-skin="switch" lay-filter="state" data-ap-id="'+ data.ap_id +'" '+ (data.state == 1 ? 'checked' : '') +' />';
},
width: '10%',
}, {
title: '操作',
toolbar: '#action',
unresize: 'false',
align : 'right'
}]
],
});
/**
* 监听工具栏操作
*/
table.tool(function (obj) {
var data = obj.data;
switch (obj.event) {
case 'manager': //管理
location.hash = ns.hash("shop/adv/lists?ap_id=" + data.ap_id);
break;
case 'edit': //编辑
location.hash = ns.hash("shop/adv/editPosition?ap_id=" + data.ap_id);
break;
case 'delete': //删除
deletePosition(data.ap_id);
break;
}
});
/**
* 批量操作
*/
table.toolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "del":
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].ap_id);
deletePosition(id_array.toString());
break;
}
});
table.bottomToolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "del":
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].ap_id);
deletePosition(id_array.toString());
break;
}
});
/**
* 删除
*/
function deletePosition(ap_ids) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('删除将会影响广告位的使用,确定要删除吗?', function (index) {
layer.close(index);
$.ajax({
url: ns.url("shop/adv/deletePosition"),
data: {'ap_ids': ap_ids},
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;
});
}
/**
* 监听搜索
*/
form.on('submit(search)', function (data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
// 监听单元格编辑--编辑宽度
function editPosition(id, type, event) {
var value = $(event).val();
let reg = ns.getRegexp('>0num');
if (!reg.test(value)) {
layer.msg("广告位宽高必须为大于0的整数");
return;
}
$.ajax({
type: 'POST',
url: ns.url("shop/adv/editPositionField"),
data: {
'type': type,
'value': value,
'ap_id': id
},
dataType: 'JSON',
success: function (res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
}
function add() {
location.hash = ns.hash("shop/adv/addPosition");
}
</script>

292
app/shop/view/adv/lists.html Executable file
View File

@@ -0,0 +1,292 @@
<div>
<button class="layui-btn" onclick="add()">添加广告</button>
<div class="layui-form" style="display:none;">
<div class="layui-input-inline">
<select name="ap_id">
<option value="">所属广告位</option>
{notempty name="adv_position"}
{foreach name="adv_position" item="vo"}
<option value="{$vo.ap_id}" {if $ap_id == $vo.ap_id}selected{/if}>{$vo.ap_name}</option>
{/foreach}
{/notempty}
</select>
</div>
<div class="layui-input-inline len-mid">
<input type="text" name="search_text" placeholder="请输入广告名称" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
<input type="hidden" name="ap_id" value="{$ap_id}" />
</div>
<!-- 列表 -->
<table id="adv_list" lay-filter="adv_list"></table>
<!-- 广告图片 -->
<script type="text/html" id="adv_image">
<div class="img-box">
<img layer-src src="{{ns.img(d.adv_image)}}" />
</div>
</script>
<!-- 排序 -->
<script type="text/html" id="slide_sort">
<input name="slide_sort" type="number" onchange="editSort({{d.adv_id}},'slide_sort', this)" value="{{d.slide_sort}}" class="layui-input sort-len">
</script>
<!-- 广告链接 -->
<script type="text/html" id="adv_url">
<a href="{{d.adv_url}}">{{d.adv_url}}</a>
</script>
<!-- 操作 -->
<script type="text/html" id="action">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<!-- 批量删除 -->
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="del">批量删除</button>
</script>
<!-- 批量删除 -->
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="del">批量删除</button>
</script>
<script>
var ap_id = '{$ap_id}';
layui.use('form', function () {
var table,
form = layui.form,
repeat_flag = false; //防重复标识
form.render();
form.on('switch(state)', function(data){
let state = data.elem.checked ? 1 : 0;
let adv_id = $(data.elem).attr('data-adv-id');
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/adv/alterAdvState"),
data: {
adv_id : adv_id,
state : state,
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
}
});
})
table = new Table({
elem: '#adv_list',
url: ns.url("shop/adv/lists"),
where: {
'ap_id': '{$ap_id}'
},
cols: [
[{
width: '3%',
type: 'checkbox',
unresize: 'false',
}, {
field: 'adv_title',
title: '广告名称',
unresize: 'false',
width: '15%'
}, {
title: '广告链接',
unresize: 'false',
width: '15%',
templet: function(data) {
var adv_url = data.adv_url;
if(adv_url){
adv_url = JSON.parse(data.adv_url);
return adv_url.title ? adv_url.title : '';
}else{
return '';
}
}
}, {
field: 'ap_name',
title: '所属广告位',
unresize: 'false',
templet:'#ap_posi',
width: '15%'
}, {
title: '广告图片',
unresize: 'false',
templet: '#adv_image',
width: '15%'
}, {
field: 'slide_sort',
title: '排序',
templet: '#slide_sort',
align: 'center',
sort : true,
width: '12%'
},{
title: '是否启用',
unresize: 'false',
templet: function(data) {
return '<input type="checkbox" name="state" value="1" lay-skin="switch" lay-filter="state" data-adv-id="'+ data.adv_id +'" '+ (data.state == 1 ? 'checked' : '') +' />';
},
width: '10%',
}, {
title: '操作',
toolbar: '#action',
unresize: 'false',
align:'right'
}]
],
bottomToolbar: "#batchOperation",
toolbar: "#toolbarOperation"
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.hash = ns.hash("shop/adv/editadv",{"adv_id":data.adv_id, ap_id:ap_id});
break;
case 'delete': //删除
deleteAdv(data.adv_id);
break;
}
});
/**
* 批量操作
*/
table.bottomToolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "del":
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].adv_id);
deleteAdv(id_array.toString());
break;
}
});
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 批量操作
*/
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "del":
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].adv_id);
deleteAdv(id_array.toString());
break;
}
});
/**
* 删除
*/
function deleteAdv(adv_ids) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该广告吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/adv/deleteAdv"),
data: {'adv_ids': adv_ids},
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;
});
}
/**
* 监听搜索
*/
form.on('submit(search)', function(data){
ap_id = $("select[name='ap_id']").val();
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
// 监听单元格编辑
function editSort(adv_id, type, event){
var value = $(event).val();
let reg = ns.getRegexp('>=0num');
if (!reg.test(value)) {
layer.msg("排序号必须是大于或等于0的整数");
return;
}
$.ajax({
type: 'POST',
url: ns.url("shop/adv/editAdvField"),
data: {'type': type, 'value': value, 'adv_id': adv_id},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if(res.code==0){
table.reload();
}
}
});
}
function add() {
location.hash = ns.hash("shop/adv/addAdv", {ap_id : ap_id});
}
</script>

752
app/shop/view/album/album.html Executable file
View File

@@ -0,0 +1,752 @@
<link rel="stylesheet" type="text/css" href="SHOP_CSS/album_manager.css" />
<style>
body{background-color: #fff;}
.album-icon-wrap{border: none;width: 100%;height: 449px;}
.album-box .album-list-box{height: 380px;margin-right: 20px;display: flex;flex-direction: column;}
.album-box .album-list-box .album-list {flex: 1;height: 0;overflow-y: scroll}
.album-box .album-list-box .album-list::-webkit-scrollbar{display: none;}
.album-box .album-img{max-height: 336px;}
.album-box .album-img li:nth-child(5n){margin-right: 0;}
.layui-tab-content{padding: 0;height: 449px;}
.album-tab.layui-tab{margin: 5px 0 0;}
.album-tab.layui-tab .layui-tab-item{height: 449px;}
.layui-laypage{margin: 10px 0 0;}
.album-tab .layui-tab-title {margin: 0 20px}
#album {padding: 0 20px;}
.page {text-align: right}
.layui-btn-disabled{background-color: #fff !important;}
</style>
<div class="layui-tab layui-tab-brief album-tab">
<ul class="layui-tab-title layui-hide">
<li class="layui-this">选择图片</li>
<li>选择图标</li>
</ul>
<div class="layui-tab-content">
<div id="album" class="layui-tab-item">
<!-- 搜索框 -->
<div class="single-filter-box">
{if $type == 'img'}
<button class="layui-btn" onclick="uploadImg()">上传{$type_list[$type]}</button>
{else if $type == 'video'}
<button class="layui-btn" onclick="uploadVideo()">上传{$type_list[$type]}</button>
{/if}
<div class="layui-btn layui-btn-primary text-color border-color" onclick="addGrouping()">添加分组</div>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_keys" placeholder="请输入{$type_list[$type]}名称" autocomplete="off" class="layui-input album-img-sreach">
<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="album-box">
<div class="album-list-box">
<ul class="album-list layui-nav layui-nav-tree">
<div class="layui-tree">
{foreach $album_tree_list as $k => $v}
<div class="layui-tree-set layui-tree-checkedFirst layui-tree-setHide ">
<div class="layui-tree-entry">
<div class="layui-tree-main">
{if isset($v['child_list'])}
<span class="layui-tree-iconClick" onclick="childSwitch(this)"><i class="layui-tree-iconArrow"></i></span>
{else /}
<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow layui-hide"></i></span>
{/if}
<div class="layui-tree-txt {$k == 0 ? 'selected text-color' : ''}" onclick="switchGroup(this)" data-id="{$v['album_id']}" data-album="{$v['child'] ? implode(',', $v['child']) : $v['album_id']}" data-name="{$v['album_name']}">
<span>{$v['album_name']}</span>
<span class="num">{$v['num']}</span>
</div>
</div>
</div>
{if isset($v['child_list'])}
<div class="layui-tree-pack layui-tree-child">
{foreach $v['child_list'] as $key => $val}
<div class="layui-tree-set">
<div class="layui-tree-entry">
<div class="layui-tree-main">
<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow layui-hide"></i></span>
<div class="layui-tree-txt" onclick="switchGroup(this)" data-id="{$val['album_id']}" data-album="{$val['album_id']}" data-name="{$val['album_name']}">
<span>{$val['album_name']}</span>
<span class="num">{$val['num']}</span>
</div>
</div>
</div>
</div>
{/foreach}
</div>
{/if}
</div>
{/foreach}
</div>
</ul>
</div>
<div class="album-content">
<ul class="album-img">
</ul>
<div id="paged" class="page"></div>
</div>
</div>
</div>
<div class="layui-tab-item album-icon-wrap"></div>
</div>
</div>
<!-- 多图上传 -->
<script type="text/html" id="multuple_html">
<div class="layui-form multuple-list-box">
<div class="layui-form-item">
<label class="layui-form-label sm">本地图片</label>
<ul class="layui-input-block multuple-list">
<li class="multuple-list-img" id="ImgUpload">
<span class="bg-color">+</span>
<span>点击添加图片</span>
</li>
</ul>
</div>
<div class="form-row sm">
<button class="layui-btn layui-btn-disabled" disabled="disabled" id="chooseListAction">提交</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
</script>
<!-- 视频上传 -->
<script type="text/html" id="video_html">
<div class="layui-form multuple-list-box">
<div class="layui-form-item">
<label class="layui-form-label sm">视频</label>
<ul class="layui-input-block multuple-list">
<li class="multuple-list-img" id="VideoUpload">
<span class="bg-color">+</span>
<span>点击添加</span>
</li>
</ul>
</div>
<div class="form-row sm">
<button class="layui-btn layui-btn-disabled" disabled="disabled" id="chooseVideoAction">提交</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
</script>
<!-- 图片展示 -->
<script type="text/html" id="albumList">
{{# layui.each(d.list,function(index,item){ }}
<li data-pic-id="{{item.pic_id}}" data-json_data='{{JSON.stringify(item)}}' class="media-list-item">
<div class="bg-color-gray">
{if $type == 'img'}
{{# if(item.is_thumb == 0 || /\.gif$/.test(item.pic_path)){ }}
<img src="{{ ns.img(item.pic_path) }}" alt="{{item.pic_name}}">
{{# }else{ }}
<img src="{{ ns.img(item.pic_path,'mid') }}" alt="{{item.pic_name}}">
{{# } }}
{else if($type == 'video')}
<video src="{{ ns.img(item.pic_path) }}" load="none" alt="{{item.pic_name}}"></video>
{/if}
{{# if( getActiveArrayIndex(item.pic_id) != "-1"){ }}
<div class="image-box-active border-color"><i class="active-index">{{ getActiveArrayIndex(item.pic_id) }}</i></div>
{{# } }}
</div>
<span>{{item.pic_name}}</span>
</li>
{{# }) }}
{{# if(d.list.length === 0){ }}
<div class="empty-data">暂无数据</div>
{{# } }}
</script>
<!-- 添加分组 -->
<script type="text/html" id="addGroup">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid">上级分组</label>
<div class="layui-input-block len-mid">
<select name="pid">
<option value="0">顶级分组</option>
{{# layui.each(d.list, function(index, item){ }}
{{# if(item.level == 1 && item.type == '{$type}' ){ }}
<option value="{{ item.album_id }}" >{{ item.album_name }}</option>
{{# } }}
{{# }) }}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="album_name" type="text" placeholder="请输入分组名称" lay-verify="required" class="layui-input len-mid">
</div>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="add_group">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeLayer()">返回</button>
</div>
</div>
</script>
<!-- 分组列表 -->
<script type="text/html" id="groupList">
{{# layui.each(d, function(index, item){ }}
<div class="layui-tree-set layui-tree-checkedFirst layui-tree-setHide ">
<div class="layui-tree-entry">
<div class="layui-tree-main">
{{# if(item.child_list){ }}
<span class="layui-tree-iconClick" onclick="childSwitch(this)"><i class="layui-tree-iconArrow"></i></span>
{{# }else{ }}
<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow layui-hide"></i></span>
{{# } }}
<div class="layui-tree-txt {{index == 0 ? 'selected text-color' : ''}}" onclick="switchGroup(this)" data-id="{{ item.album_id }}" data-album="{{ item.child ? item.child.toString() : item.album_id }}" data-name="{{ item.album_name }}">
<span>{{item.album_name}}</span>
<span class="num">{{item.num}}</span>
</div>
</div>
</div>
{{# if(item.child_list){ }}
<div class="layui-tree-pack layui-tree-child">
{{# layui.each(item.child_list, function(subIndex, subItem){ }}
<div class="layui-tree-set">
<div class="layui-tree-entry">
<div class="layui-tree-main">
<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow layui-hide"></i></span>
<div class="layui-tree-txt" onclick="switchGroup(this)" data-id="{{subItem.album_id}}" data-album="{{subItem.album_id}}" data-name="{{subItem.album_name}}">
<span>{{subItem.album_name}}</span>
<span class="num">{{subItem.num}}</span>
</div>
</div>
</div>
</div>
{{# }) }}
</div>
{{# } }}
</div>
{{# }) }}
</script>
<script>
var form, laytpl, laypage, upload,element,
limit = 10,
active_array = [],
album_id = $('.album-list .layui-this').attr("data-id");
var repeat_flag = false;
var display_type = "{$display_type}";
layui.use(['form', 'laytpl', 'laypage', 'upload', 'element'], function() {
form = layui.form;
laytpl = layui.laytpl;
laypage = layui.laypage;
element = layui.element;
upload = layui.upload;
form.render();
//初始化数据
init();
//监听搜索事件
form.on('submit(search)', function() {
albumImgList(1, limit);
});
/**
* 添加分组
*/
form.on('submit(add_group)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
data.field.type = "{$type}";
data.field.app_module = ns_url.appModule;
data.field.site_id = ns_url.siteId;
$.ajax({
url: ns.url("shop/Album/addAlbum"),
data: data.field,
type: "POST",
dataType: "JSON",
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
updateGroupList();
albumImgList(1, limit);
updateAlbumNum(album_id);
layer.closeAll();
}
}
});
return false;
});
});
function switchGroup(obj){
$('.album-list .selected').removeClass('selected text-color');
$(obj).addClass('selected text-color');
album_id = $(obj).attr("data-id");
albumImgList(1, limit);
}
function closeLayer() {
layer.closeAll();
}
/**
* 更新分组图片数量
*/
function updateAlbumNum(album_id){
$.ajax({
type: "POST",
async: true,
url: ns.url("shop/Album/albumInfo"),
data: {
album_id,
app_module: ns_url.appModule,
site_id: ns_url.siteId
},
dataType: "JSON",
success: function(res) {
if (res.code == 0 && res.data) {
$('[data-id="'+album_id+'"]').find('.num').text(res.data.num);
}
}
});
}
/**
* 图片加载
* @param page
* @param limit
*/
function albumImgList(page, limit) {
var album_id = $('.album-list .selected').attr("data-album");
console.log(limit)
$.ajax({
url: ns.url("shop/Album/Album"),
type: "POST",
dataType: "JSON",
async: false,
data: {
album_id,
limit,
page,
pic_name: $(".album-img-sreach").val(),
app_module: ns_url.appModule,
site_id: ns_url.siteId
},
success: function (res) {
laytpl($("#albumList").html()).render(res.data, function (data) {
$(".album-img").html(data);
$("#album_num_" + album_id).html(res.data.count);
});
laypage.render({
elem: 'paged',
count: res.data.count,
limit,
curr: page,
jump: function (obj, first) {
if (!first) {
albumImgList(obj.curr, obj.limit);
}
}
})
}
})
}
/**
* 选择个体
*/
function checkItem() {
$("#album").unbind('click').on("click", ".media-list-item", function() {
var json_data = $(this).data("json_data");
json_data.id = parseInt(json_data.pic_id);
if ($(this).find(".image-box-active").length > 0) {
var active_index = getDeleteActiveArrayIndex(json_data.id);
sortActiveArrayIndex(active_index);
$(this).find(".image-box-active").remove();
} else {
json_data.index = active_array.length + 1;
if (json_data.index > imgNum) {
$(".album-box .album-img li").each((index,item) => {
if($(item).attr("data-pic-id") == active_array[0].pic_id)
$(item).find(".image-box-active").remove();
});
var active_index = getDeleteActiveArrayIndex(active_array[0].pic_id);
sortActiveArrayIndex(active_index);
--json_data.index;
}
active_array.push(json_data);
var active_html = '<div class="image-box-active border-color"><i class="active-index">' + active_array.length +
'</i></div>';
$(this).find("div").append(active_html);
}
});
}
//获取选择图片信息
function selectAlbumListener(callback) {
if (typeof callback != "function") return false;
if($(".album-tab .layui-tab-content .layui-tab-item").eq(0).hasClass("layui-show")){
callback(active_array);
}else{
callback(window.currIcon);
}
}
//获取选中
function getActiveArrayIndex(id) {
var delete_index = -1;
$.each(active_array, function(i, item) {
if (item.pic_id == id) {
delete_index = item.index;
return false;
}
});
return delete_index;
}
//删除选中
function getDeleteActiveArrayIndex(id) {
var delete_index;
$.each(active_array, function(i, item) {
if (item.id == id) {
delete_index = item.index;
active_array.splice(i, 1);
return false;
}
});
return delete_index;
}
//重新排序
function sortActiveArrayIndex(index) {
$.each(active_array, function(i, item) {
var item_index = item.index;
if (item_index > index) {
active_array[i]["index"] = item_index - 1;
if ($("#album").find(".media-list-item[data-pic-id = '" + item["id"] + "']").length > 0) {
$("#album").find(".media-list-item[data-pic-id = '" + item["id"] + "']").find(".image-box-active i ").text(item["index"]);
}
}
})
}
/**
* 初始化数据
*/
function init() {
albumImgList(1, limit); //分组图像
checkItem(); //选择个体
var arr = display_type.split(",");
if(arr.includes("img")){
$(".album-tab .layui-tab-content .layui-tab-item").eq(0).addClass('layui-show').siblings().removeClass('layui-show');
}
if(arr.includes("icon")){
$.ajax({
url: ns.url('shop/diy/iconfont', {site_id: ns_url.siteId, app_module: ns_url.appModule}),
dataType: 'html',
type: 'get',
success: function (html) {
$(".album-icon-wrap").html(html);
}
});
if(arr.length == 1){
$(".album-tab .layui-tab-content .layui-tab-item").eq(1).addClass('layui-show').siblings().removeClass('layui-show');
}else{
$(".album-tab.layui-tab .layui-tab-title").removeClass("layui-hide");
}
}
}
/**
* 多图上传
*/
function uploadImg() {
laytpl($("#multuple_html").html()).render({}, function(html) {
var album_id = $('.album-list .selected').attr("data-id");
layer_one = layer.open({
type: 1,
area: ['580px', '430px'],
title: '本地上传',
content: html,
cancel: function() {
$("#chooseListAction").removeClass("bg-color").addClass("layui-btn-disabled").attr("disabled", "disabled");
},
success: function(res) {
//上传图片
upload.render({
elem: '#ImgUpload',
url: ns.url("shop/upload/album"),
data: {
album_id : album_id,
is_thumb:'{$is_thumb}'
},
exts:'jpg|jpeg|png|gif|webp|bmp|tif',
multiple: true,
auto: false,
bindAction: '#chooseListAction',
choose: function(obj) {
//将每次选择的文件追加到文件队列
var files = this.files = obj.pushFile();
//预读本地文件,如果是多文件,则会遍历。(不支持ie8/9)
obj.preview(function(index, file, result) {
//追加预览图片
var html = '';
html += '<li class="multuple-list-img upload-wrap" index="' + index + '">';
html += '<img src="' + result + '" alt="' + file.name + '">';
html += '<span class="upload-close-modal" id="upload_img_' + index + '">×</span>';
html += '<div class="upload-image-curtain">50%</div>';
html += '</li>';
$(".multuple-list").prepend(html);
//删除预览图片
$("#upload_img_" + index).bind("click", function() {
delete files[index];
// delete picture_arr[index];//删除所选队列
$(this).parent('.upload-wrap').remove();
// uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
//禁止点击
if ($(".multuple-list li").length <= 1) {
$("#chooseListAction").removeClass("bg-color").addClass("layui-btn-disabled").attr("disabled", "disabled");
}
});
//禁止点击
if ($(".multuple-list li").length > 1) {
$("#chooseListAction").addClass("bg-color").removeClass("layui-btn-disabled").removeAttr("disabled");
}
});
},
before: function(obj){ //obj参数包含的信息跟 choose回调完全一致可参见上文。
$("#chooseListAction").removeClass("bg-color").addClass("layui-btn-disabled").attr("disabled","disabled");
},
done: function(res, index) {
// picture_arr.push(res.data);
var image_box = $(".upload-wrap[index='" + index + "']").parent().find(".upload-image-curtain");
image_box.text("50%");
image_box.show();
if (res.code >= 0) {
setTimeout(function() {
image_box.text("100%");
}, 500);
setTimeout(function() {
albumImgList(1, limit);
updateAlbumNum(album_id);
layer.close(layer_one);
}, 1000);
return delete this.files[index]; //删除文件队列已经上传成功的文件
} else {
setTimeout(function() {
image_box.text("上传失败");
}, 500);
ns.uploadImageError(res);
}
},
allDone: function(obj){ //当文件全部被提交后,才触发
$("#chooseListAction").addClass("bg-color").removeClass("layui-btn-disabled").removeAttr("disabled");
}
});
}
})
});
}
/**
* 视频上传
*/
function uploadVideo() {
laytpl($("#video_html").html()).render({}, function(html) {
var album_id = $('.album-list .selected').attr("data-id");
layer_one = layer.open({
type: 1,
area: ['580px', '430px'],
title: '本地上传',
content: html,
cancel: function() {
$("#chooseVideoAction").removeClass("bg-color").addClass("layui-btn-disabled").attr("disabled", "disabled");
},
success: function(res) {
//上传图片
upload.render({
elem: '#VideoUpload',
url: ns.url("shop/upload/videoToAlbum"),
data: {
album_id: album_id,
},
multiple: true,
accept: 'video',
auto: false,
size: 50 * 1024,
bindAction: '#chooseVideoAction',
choose: function (obj) {
//将每次选择的文件追加到文件队列
var files = this.files = obj.pushFile();
//预读本地文件,如果是多文件,则会遍历。(不支持ie8/9)
obj.preview(function (index, file, result) {
//追加预览图片
var html = '';
html += '<li class="multuple-list-img upload-wrap" index="' + index + '">';
html += '<video class="multuple-list-image" src="' + result + '" alt="' + file.name + '"></video>';
html += '<span class="upload-close-modal" id="upload_img_' + index + '">×</span>';
html += '<div class="upload-image-curtain">50%</div>';
html += '</li>';
$(".multuple-list").prepend(html);
//删除预览图片
$("#upload_img_" + index).bind("click", function () {
delete files[index];
// delete picture_arr[index];//删除所选队列
$(this).parent('.upload-wrap').remove();
// uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
//禁止点击
if ($(".multuple-list li").length <= 1) {
$("#chooseVideoAction").removeClass("bg-color").addClass("layui-btn-disabled").attr("disabled", "disabled");
}
});
//禁止点击
if ($(".multuple-list li").length > 1) {
$("#chooseVideoAction").addClass("bg-color").removeClass("layui-btn-disabled").removeAttr("disabled");
}
});
},
done: function (res, index) {
// picture_arr.push(res.data);
var image_box = $(".upload-wrap[index='" + index + "']").parent().find(".upload-image-curtain");
image_box.text("50%");
image_box.show();
if (res.code >= 0) {
setTimeout(function () {
image_box.text("100%");
}, 500);
setTimeout(function () {
albumImgList(1, limit);
updateAlbumNum(album_id);
layer.close(layer_one);
}, 1000);
return delete this.files[index]; //删除文件队列已经上传成功的文件
} else {
setTimeout(function () {
image_box.text("上传失败");
}, 500);
layer.msg(res.message); //删除文件队列已经上传成功的文件
}
}
});
}
})
});
}
var search = window.location.search,
imgNum = parseInt(getSearchString('imgNum', search));
function getSearchString(key, Url) {
var str = Url;
str = str.substring(1, str.length); // 获取URL中?之后的字符(去掉第一位的问号)
// 以&分隔字符串获得类似name=xiaoli这样的元素数组
var arr = str.split("&");
var obj = new Object();
// 将每一个数组元素以=分隔并赋给obj对象
for (var i = 0; i < arr.length; i++) {
var tmp_arr = arr[i].split("=");
obj[decodeURIComponent(tmp_arr[0])] = decodeURIComponent(tmp_arr[1]);
}
return obj[key];
}
/**
* 添加分组
*/
var flag_add_group = false;
function addGrouping() {
if (flag_add_group) return;
flag_add_group = true;
$.ajax({
type: "POST",
async: true,
url: ns.url("shop/Album/getAlbumList"),
dataType: "JSON",
success: function(res) {
if (res.code == 0 && res.data) {
var add_attr = $("#addGroup").html();
laytpl(add_attr).render({list: res.data}, function(html) {
add_attr_index = layer.open({
title: '添加分组',
skin: 'layer-tips-class',
type: 1,
area: ['500px', '250px'],
content: html,
success: function () {
flag_add_group = false;
form.render();
},
error: function () {
flag_add_group = false;
}
});
});
}
}
});
}
/**
* 更新分组列表[树形结构]
*/
function updateGroupList(){
$.ajax({
type: "POST",
async: true,
url: ns.url("shop/Album/getAlbumListTree"),
dataType: "JSON",
success: function(res) {
if (res.code == 0 && res.data) {
var group_list_attr = $("#groupList").html();
laytpl(group_list_attr).render(res.data, function(html) {
$(".album-list-box .album-list .layui-tree").html(html);
});
}
}
});
}
function childSwitch(obj){
$(obj).parents('.layui-tree-checkedFirst').find('.layui-tree-child').toggle(0,'linear',function (res){
if($(obj).parents('.layui-tree-checkedFirst').hasClass('layui-tree-spread')){
$(obj).parents('.layui-tree-checkedFirst').removeClass('layui-tree-spread');
}else{
$(obj).parents('.layui-tree-checkedFirst').addClass('layui-tree-spread');
}
});
}
</script>

1220
app/shop/view/album/lists.html Executable file

File diff suppressed because it is too large Load Diff

253
app/shop/view/article/add.html Executable file
View File

@@ -0,0 +1,253 @@
<style>
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>文章标题:</label>
<div class="layui-input-inline">
<input type="text" name="article_title" lay-verify="required" maxlength="40" autocomplete="off" placeholder="文章标题最多40个字" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>文章分类:</label>
<div class="layui-input-inline">
<select name="category_id" lay-verify="required">
<option value="">请选择</option>
{foreach $category_list as $v}
<option value="{$v['category_id']}">{$v['category_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="article_abstract" class="layui-textarea len-long" maxlength="100"></textarea>
</div>
<div class="word-aux">文章摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>封面:</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<input type="hidden" name="image" />
<i class="del">x</i>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>正文:</label>
<div class="layui-input-inline">
<script id="editor" type="text/plain" class="special-length" style="height:500px;"></script>
<input type="hidden" name="article_content" id="article_content" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" checked>
<input type="radio" name="is_show_release_time" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" checked>
<input type="radio" name="is_show_read_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" checked>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" class="layui-input">
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存至草稿箱</button>
<button class="layui-btn layui-btn-primary" onclick="backArticleList()">返回</button>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
//实例化富文本
var ue = UE.getEditor('editor');
if($("#article_content").val()){
ue.ready(function() {
ue.setContent($("#article_content").val());
});
}
var form,repeat_flag,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
selectedGoodsId = [],
goods_id = [],
goods_list =[];
layui.use(['form'], function() {
form = layui.form;
repeat_flag = false;
form.render();
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
field = data.field;
field.status = 0;
formSubmit(field)
});
});
/**
* 提交
*/
function formSubmit(data){
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
data.cover_img = imageCollection.join();
if (!ue.getContent()){
layer.msg("文章内容不能为空");
return false;
}
if(data.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
data.article_content = ue.getContent();
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("shop/article/add"),
data: data,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function(index, layero){
if(data.status == 1){
location.hash = ns.hash("shop/article/lists");
}else{
location.hash = ns.hash("shop/article/drafts");
}
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
function backArticleList() {
location.hash = ns.hash("shop/article/lists");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
</script>

View File

@@ -0,0 +1,159 @@
<style>
.select-article{margin: 20px;}
.select-article .single-filter-box{padding: 0;}
.select-article .single-filter-box .layui-form{margin: inherit;}
.select-article .single-filter-box .layui-form div{margin: 0;}
</style>
<div class="select-article">
<div class="single-filter-box">
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入文章名称" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<table id="article_list" lay-filter="article_list"></table>
</div>
<script type="text/html" id="checkbox">
<input type="checkbox" data-article-id="{{d.article_id}}" name="article_checkbox" lay-skin="primary" lay-filter="article_checkbox">
<input type="hidden" data-article-id="{{d.article_id}}" name="article_json" value='{{ JSON.stringify(d) }}' />
</script>
<script>
var select_id = localStorage.getItem('article_select_id') || '', // "{$select_id}", //选中文章id
articleList ={:json_encode($article_list)},
selectList = {}, //选中文章所有数据res
articleIdArr = select_id.length ? select_id.split(',') : [], //已选中的文章id
table, form,laytpl,element;
$(function () {
for (var k in articleList) {
selectList['article_id_' + articleList[k].article_id] = {
article_id: articleList[k].article_id,
article_title: articleList[k].article_title,
cover_img: articleList[k].cover_img,
article_abstract: articleList[k].article_abstract,
read_num: articleList[k].read_num,
}
}
layui.use(['form', 'laytpl', 'element'], function () {
form = layui.form;
laytpl = layui.laytpl;
element = layui.element;
table = new Table({
elem: '#article_list',
url: '{:addon_url("shop/article/articleselect")}',
cols: [
[
{
title: '<input type="checkbox" name="article_checkbox_all" lay-skin="primary" lay-filter="article_checkbox_all">',
width: "8%",
templet: '#checkbox'
},
{
field: 'article_title',
title: '文章名称',
width: '35%'
},
{
field: 'category_name',
title: '文章分类',
width: '30%'
},
{
field: 'cover_img',
title: '封面图',
width: '20%',
templet: function (d) {
return `<img layer-src src="${ns.img(d.cover_img)}"/>`;
}
},
]
],
callback: function (res) {
// 更新复选框状态
for (var i = 0; i < articleIdArr.length; i++) {
var selected_article = $("input[name='article_checkbox'][data-article-id='" + articleIdArr[i] + "']");
if (selected_article.length) {
selected_article.prop("checked", true);
}
}
form.render();
dealWithTableSelectedNum();
}
});
form.on('submit(search)', function (data) {
formSearch();
return false;
});
//公共搜索方法
function formSearch() {
var data = {};
data.search_text = $("input[name='search_text']").val();
data.article_ids = articleIdArr.toString();
table.reload({
page: {
curr: 1
},
where: data
});
}
// 勾选文章
form.on('checkbox(article_checkbox_all)', function (data) {
var all_checked = data.elem.checked;
$("input[name='article_checkbox']").each(function () {
var checked = $(this).prop('checked');
if (all_checked != checked) {
$(this).next().click();
}
})
});
// 勾选文章
form.on('checkbox(article_checkbox)', function (data) {
var article_id = $(data.elem).attr("data-article-id");
var spuLen = $("input[name='article_checkbox'][data-article-id=" + article_id + "]:checked").length;
if (spuLen) {
var item = JSON.parse($("input[name='article_json'][data-article-id=" + article_id + "]").val());
delete item.LAY_INDEX;
delete item.LAY_TABLE_INDEX;
selectList['article_id_' + article_id] = item;
} else {
delete selectList['article_id_' + article_id];
}
dealWithTableSelectedNum();
});
});
});
function selectArticleListener(callback) {
articleIdArr = [];
for (var key in selectList){
articleIdArr.push(selectList[key].article_id);
}
if(articleIdArr.length == 0) {
layer.msg('请选择文章');
return;
}
callback({
articleIds: articleIdArr,
list: selectList
});
}
//在表格底部增加了一个容器
function dealWithTableSelectedNum() {
$(".layui-table-bottom-left-container").html('已选择 '+ Object.keys(selectList).length +' 个文章');
}
</script>

170
app/shop/view/article/drafts.html Executable file
View File

@@ -0,0 +1,170 @@
<!-- 搜索框 -->
<div class="single-filter-box">
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入文章标题" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="article_list" lay-filter="article_list"></table>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script type="text/html" id="sort">
<input name="sort" type="number" onchange="editSort({{d.article_id}},this)" value="{{d.sort}}" placeholder="请输入排序" class="layui-input edit-sort len-short">
</script>
<script>
var table, repeat_flag = false;//防重复标识;
layui.use('form', function() {
var form = layui.form;
form.render();
table = new Table({
elem: '#article_list',
url: ns.url("shop/article/drafts"),
cols: [
[ {
field: 'article_title',
title: '文章标题',
width: '30%',
unresize: 'false'
}, {
field: 'category_name',
title: '文章分类',
width: '20%',
unresize: 'false'
},{
field: 'sort',
title: '排序',
width: '15%',
sort : true,
unresize: 'false',
templet: '#sort'
}, {
field: 'create_time',
title: '创建时间',
width: '20%',
unresize: 'false',
templet: function (data) {
return ns.time_to_date(data.create_time);
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
],
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.hash = ns.hash("shop/article/edit?article_id=" + data.article_id);
break;
case 'delete': //删除
deleteArticle(data.article_id);
break;
}
});
});
/**
* 删除
*/
function deleteArticle(article_id) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该文章内容吗?',
function (index) {
layer.close(index);
$.ajax({
url: ns.url("shop/article/delete"),
data: {article_id},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
layer.close(layer.index - 1);
table.reload();
}
}
});
},
function () {
repeat_flag = false;
layer.close();
});
}
// 监听单元格编辑
function editSort(article_id, event) {
var data = $(event).val();
if (!new RegExp("^-?[1-9]\\d*$").test(data)) {
layer.msg("排序号只能是整数");
return;
}
if(data < 0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url("shop/article/modifySort"),
data: {
sort: data,
article_id: article_id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
listenerHash(); // 刷新页面
}
}
});
}
</script>

263
app/shop/view/article/edit.html Executable file
View File

@@ -0,0 +1,263 @@
<style>
.upload-img-block .upload-img-box .upload-default{position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label short-label"><span class="required">*</span>文章标题:</label>
<div class="layui-input-inline">
<input type="text" name="article_title" value="{$info.article_title}" lay-verify="required" maxlength="40" autocomplete="off" placeholder="文章标题最多40个字" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>文章分类:</label>
<div class="layui-input-inline">
<select name="category_id" lay-verify="required">
<option value="">请选择</option>
{foreach $category_list as $v}
<option value="{$v['category_id']}" {if $info.category_id == $v.category_id} selected {/if}>{$v['category_name']}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">摘要:</label>
<div class="layui-input-block">
<textarea name="article_abstract" class="layui-textarea len-long" maxlength="100">{$info.article_abstract}</textarea>
</div>
<div class="word-aux">文章摘要最多可输入100个字</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">封面</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block square simple-uploading">
<div class="upload-img-box" id="img">
<div class="upload-default">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
</div>
</div>
<div class="word-aux">推荐使用 750x420 像素的图片 最多上传1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>文章内容:</label>
<div class="layui-input-inline">
<script id="editor" type="text/plain" class="special-length" style="height:500px;"></script>
<input type="hidden" name="article_content" id="article_content" value="{$info.article_content}"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">发布时间:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_release_time" value="1" title="显示" {if $info.is_show_release_time == 1} checked {/if}>
<input type="radio" name="is_show_release_time" value="0" title="不显示" {if $info.is_show_release_time == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">阅读次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_read_num" value="1" title="显示" {if $info.is_show_read_num == 1} checked {/if}>
<input type="radio" name="is_show_read_num" value="0" title="不显示" {if $info.is_show_read_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">点赞次数:</label>
<div class="layui-input-inline">
<input type="radio" name="is_show_dianzan_num" value="1" title="显示" {if $info.is_show_dianzan_num == 1} checked {/if}>
<input type="radio" name="is_show_dianzan_num" value="0" title="不显示" {if $info.is_show_dianzan_num == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟阅读数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_read_num" value="{$info.initial_read_num}" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟点赞数:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="initial_dianzan_num" value="{$info.initial_dianzan_num}" onchange="detectionNumType(this,'integral')" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" min="0" name="sort" value="{$info.sort}" class="layui-input">
</div>
</div>
<input type="hidden" name="article_id" value="{$info.article_id}" />
<div class="form-row">
{if $info.status == 1}
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backArticleList()">返回</button>
{else /}
<button class="layui-btn" lay-submit lay-filter="saveDrafts">保存</button>
<button class="layui-btn" lay-submit lay-filter="save">立即发布</button>
<button class="layui-btn layui-btn-primary" onclick="backArticleList()">返回</button>
{/if}
</div>
</div>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
var form,upload,
IMAGE_MAX = 9, //最多可以上传多少张图片
imageCollection = [], //图片集合
selectedGoodsId = [],
goods_id=[],
repeat_flag = false,
coverImg = '{$info.cover_img}';
initImg();//初始化图片
function initImg(){
$("#img").html("<img src=" + ns.img(coverImg) + " >");
imageCollection = [coverImg];
}
//实例化富文本
var ue = UE.getEditor('editor');
if($("#article_content").val()){
ue.ready(function() {
ue.setContent($("#article_content").val());
});
}
layui.use(['form'], function() {
form = layui.form;
form.render();
// 单图上传
$("body").off("click", "#img").on("click", "#img", function () {
openAlbum(function (data) {
imageCollection = [];
imageCollection.push(data[0].pic_path);
imageCollection.splice(1, imageCollection.length);
var val = '<img src="' + ns.img(imageCollection[0]) + '" alt="">';
$("#img").html(val);
}, 1);
});
/**
* 表单提交(立即发布)
*/
form.on('submit(save)', function(data){
field = data.field;
field.status = 1;
formSubmit(field)
});
/**
* 表单提交(草稿箱)
*/
form.on('submit(saveDrafts)', function(data){
field = data.field;
field.status = 0;
formSubmit(field)
});
});
/**
* 提交
*/
function formSubmit(field)
{
if (!imageCollection.length){
layer.msg('请选择封面图!', {icon: 5, anim: 6});
return;
}
field.cover_img = imageCollection.join();
if (!ue.getContent()){
layer.msg("文章内容不能为空");
return false;
}
if(field.sort < 0){
layer.msg("排序号不能小于0");
return false;
}
field.article_content = ue.getContent();
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("shop/article/edit"),
data: field,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续编辑'],
yes: function(index, layero){
if(field.status == 1){
location.hash = ns.hash("shop/article/lists");
}else{
location.hash = ns.hash("shop/article/drafts");
}
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
}
function backArticleList() {
location.hash = ns.hash("shop/article/lists");
}
//检测数据类型
function detectionNumType(el, type) {
var value = $(el).val();
//大于零 且 不是小数
if (value < 0 && type == 'integral')
$(el).val(0);
else if (type == 'integral')
$(el).val(Math.round(value));
//大于1 且 不是小数
if (value < 1 && type == 'positiveInteger')
$(el).val(1);
else if (type == 'positiveInteger')
$(el).val(Math.round(value));
//大于零可以是小数
if (type == 'positiveNumber') {
value = parseFloat(value).toFixed(2);
if (value < 0)
$(el).val(0);
else
$(el).val(value);
}
}
</script>

188
app/shop/view/article/lists.html Executable file
View File

@@ -0,0 +1,188 @@
<!-- 搜索框 -->
<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="search_text" placeholder="请输入文章标题" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="article_list" lay-filter="article_list"></table>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="promote">推广</a>
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script type="text/html" id="sort">
<input name="sort" type="number" onchange="editSort({{d.article_id}},this)" value="{{d.sort}}" placeholder="请输入排序" class="layui-input edit-sort len-short">
</script>
<!-- 推广 -->
{include file="app/shop/view/component/promote_show.html"}
<script>
var form,laytpl,table, repeat_flag = false;//防重复标识;
layui.use(['form','laytpl'], function() {
form = layui.form;
laytpl = layui.laytpl;
form.render();
table = new Table({
elem: '#article_list',
url: ns.url("shop/article/lists"),
cols: [
[ {
field: 'article_title',
title: '文章标题',
width: '30%',
unresize: 'false'
}, {
field: 'category_name',
title: '文章分类',
width: '20%',
unresize: 'false'
},{
field: 'sort',
title: '排序',
width: '15%',
sort : true,
unresize: 'false',
templet: '#sort'
}, {
field: 'create_time',
title: '创建时间',
width: '20%',
unresize: 'false',
templet: function (data) {
return ns.time_to_date(data.create_time);
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
],
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'promote': // 推广
promote(data);
break;
case 'edit': //编辑
location.hash = ns.hash("shop/article/edit?article_id=" + data.article_id);
break;
case 'delete': //删除
deleteArticle(data.article_id);
break;
}
});
});
/**
* 删除
*/
function deleteArticle(article_id) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该文章内容吗?', function (index) {
layer.close(index);
$.ajax({
url: ns.url("shop/article/delete"),
data: {article_id},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
},
function () {
repeat_flag = false;
layer.close();
});
}
// 监听单元格编辑
function editSort(article_id, event) {
var data = $(event).val();
if (!new RegExp("^-?[1-9]\\d*$").test(data)) {
layer.msg("排序号只能是整数");
return;
}
if(data < 0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url("shop/article/modifySort"),
data: {
sort: data,
article_id: article_id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
listenerHash(); // 刷新页面
}
}
});
}
function promote(data){
new PromoteShow({
url:ns.url("shop/article/promote"),
param:{article_id:data.article_id},
})
}
function add() {
location.hash = ns.hash("shop/article/add");
}
</script>

View File

@@ -0,0 +1,311 @@
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="addCategory()">添加分类</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="category_name" placeholder="请输入文章分类" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="article_category_list" lay-filter="article_category_list"></table>
<!-- 编辑排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.category_id}}, this)" value="{{d.sort}}" class="layui-input edit-sort len-short">
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script type="text/html" id="addCategory">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="category_name" type="text" placeholder="请输入分类名称" lay-verify="required" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">排序</label>
<div class="layui-input-block">
<input name="sort" type="number" class="layui-input edit-sort len-short">
</div>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<script type="text/html" id="editCategory">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="category_name" type="text" value="{{ d.category_name }}" placeholder="请输入文章分类名称" lay-verify="required" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">排序</label>
<div class="layui-input-block">
<input name="sort" type="number" value="{{ d.sort }}" class="layui-input edit-sort len-short">
</div>
</div>
<input type="hidden" name="category_id" value="{{ d.category_id }}">
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="edit_save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<script>
var laytpl, add_category_index = -1,
form, table;
layui.use(['form', 'laytpl'], function() {
var repeat_flag = false; //防重复标识
laytpl = layui.laytpl;
form = layui.form;
form.render();
table = new Table({
elem: '#article_category_list',
url: ns.url("shop/articlecategory/lists"),
cols: [
[ {
field: 'category_name',
title: '分类名称',
unresize: 'false'
},{
field: 'article_num',
title: '文章总数',
unresize: 'false'
},{
field: 'sort',
sort : true,
unresize:'false',
title: '排序',
width: '20%',
align: 'center',
templet: '#editSort'
},{
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit':
editCategory(data);
break;
case 'delete':
deleteGroup(data.category_id);
break;
}
});
/**
* 删除
*/
function deleteGroup(category_id) {
layer.confirm('确认删除该分类吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/articlecategory/delete"),
data: {
category_id:category_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload({
page: {
curr: 1
},
});
}
}
});
});
}
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
form.on('submit(save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: '{:addon_url("shop/articlecategory/add")}',
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_category_index);
}
repeat_flag = false;
}
});
return false;
});
form.on('submit(edit_save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: '{:addon_url("shop/articlecategory/edit")}',
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_category_index);
}
repeat_flag = false;
}
});
return false;
});
/**
* 表单验证
*/
form.verify({
num: function(value) {
if (value == '') {
return;
}
if (value % 1 != 0) {
return '排序数值必须为整数';
}
if (value < 0) {
return '排序数值必须为大于0';
}
}
});
});
function addCategory() {
var add_group = $("#addCategory").html();
laytpl(add_group).render({}, function(html) {
add_category_index = layer.open({
title: '添加文章分类',
skin: 'layer-tips-class',
type: 1,
area: ['500px'],
content: html
});
});
}
function editCategory(data) {
var add_group = $("#editCategory").html();
laytpl(add_group).render(data, function(html) {
add_category_index = layer.open({
title: '编辑文章分类',
skin: 'layer-tips-class',
type: 1,
area: ['500px'],
content: html
});
});
}
function closeAttrLayer() {
layer.close(add_category_index);
}
// 监听单元格编辑
function editSort(category_id, event){
var data = $(event).val();
if (data == '') {
$(event).val(0);
data = 0;
}
if(!new RegExp("^-?[0-9]\\d*$").test(data)){
layer.msg("排序号只能是整数");
return ;
}
if(data<0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url("notes://shop/group/modifySort"),
data: {
sort: data,
category_id: category_id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if(res.code==0){
table.reload();
}
}
});
}
</script>

View File

@@ -0,0 +1,290 @@
<link rel="stylesheet" href="SHOP_CSS/order_detail.css"/>
<!-- 订单详情、订单状态 -->
<div class="order-detail layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">订单详情</span>
</div>
<div class="order-information order-information-bottom layui-card-body">
<div class="order-information-contentOne">
<div class="contentOne-content">
<div class="contentOne-content-title">交易流水号:</div>
<div class="contentOne-content-text text-num">{$order_detail['out_trade_no']}</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">订单编号:</div>
<div class="contentOne-content-text">{$order_detail['order_no']}</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">订单类型:</div>
<div class="contentOne-content-text">{$order_detail['order_type_name']}</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">订单来源:</div>
<div class="contentOne-content-text">{$order_detail.order_from_name}</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">付款方式:</div>
<div class="contentOne-content-text">{$order_detail.pay_type_name}</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">买家:</div>
<div class="contentOne-content-text">{$order_detail.nickname}</div>
</div>
</div>
<div class="order-information-contentTwo">
<div class="contentOne-content">
<div class="contentOne-content-title">收银门店:</div>
<div class="contentOne-content-text">{$order_detail['delivery_store_name']}</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">营销活动:</div>
<div class="contentOne-content-text">{$order_detail['promotion_type_name']}</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">买家留言:</div>
<div class="contentOne-content-text contentOne-content-text-die">
{if $order_detail['buyer_message'] == ""}
-
{else/}
{$order_detail['buyer_message']}
{/if}
</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">备注:</div>
<div class="contentOne-content-text">
{if $order_detail['remark'] == ""}
-
{else/}
{$order_detail['remark']}
{/if}
</div>
</div>
</div>
<div class="order-information-contentTwo"></div>
</div>
<div class="layui-card-header">
<span class="card-title">订单状态</span>
</div>
<div class="order-information-contentOne order-orderStatus-contentOne layui-card-body">
<div class="contentOne-content">
<div class="contentOne-content-title">订单状态:</div>
<div class="contentOne-content-text contentOne-content-textNew">{$order_detail.order_status_name}</div>
</div>
<div class="contentTow-operation">
<div class="contentTow-operation-content bg-color-light-9 contentTow-operation-new" onclick="orderRemark('{$order_detail.order_id}')">备注</div>
{php}
$order_json_data = json_decode($order_detail['order_status_action'], true);
$action = $order_json_data['action'];
{/php}
{foreach $action as $action_k => $action_item}
<a class="contentTow-operation-content bg-color-light-9 contentTow-operation-new" href="javascript:orderAction('{$action_item.action}', '{$order_detail.order_id}')">{$action_item.title}</a>
{/foreach}
{if addon_is_exit("printer") && $order_detail.order_status != -1}
<a class="contentTow-operation-content bg-color-light-9 contentTow-operation-new bg-color-light-9" href="javascript:printTicket('{$order_detail.order_id}');" >打印小票</a>
{/if}
</div>
<div class="orderStatus">
<div class="orderStatus-content-title">提醒:</div>
<div class="orderStatus-content-text">
<p class="text-tile">买家付款成功后,货款将直接进入您的商户号(微信、支付宝)</p>
<p class="text-tile">如遇买家未自提或货物有问题,请及时联系买家处理,友好协商</p>
</div>
</div>
</div>
{if isset($order_detail.form)}
<!-- 表单信息 -->
<div class="formFields">
<div class="layui-card-header">
<span class="card-title">表单信息</span>
</div>
<div class="order-information order-formFields layui-card-body">
{foreach name="$order_detail.form" item="vo"}
<div class="contentOne-content">
<div class="contentOne-content-title">{$vo.title}</div>
<div class="contentOne-content-text">
{if !empty($vo.controller) && $vo.controller == 'Img'}
{foreach name="$vo.img_lists" item="io"}
<div class="form-img">
<div class="form-img-wrap">
<img src="{:img($io)}" layer-src>
</div>
</div>
{/foreach}
{else/}
{if isset($vo.val)}
{$vo.val}
{/if}
{/if}
</div>
</div>
{/foreach}
</div>
</div>
{/if}
{if $order_detail['is_invoice'] == 1}
<!-- 发票信息 -->
<div class="formFields">
<div class="layui-card-header">
<span class="card-title">发票信息</span>
</div>
<div class="order-information order-formFields layui-card-body">
<div class="contentOne-content">
<div class="contentOne-content-title">发票类型:</div>
<div class="contentOne-content-text">{if $order_detail['invoice_type'] == 1}纸质{else/}电子{/if}{if $order_detail['is_tax_invoice'] == 1}专票{else/}普票{/if}</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">发票抬头:</div>
<div class="contentOne-content-text">{$order_detail['invoice_title']}</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">发票抬头类型:</div>
<div class="contentOne-content-text">{$order_detail['invoice_title_type'] == 1 ? '个人' : '企业'}</div>
</div>
{if $order_detail['invoice_title_type'] == 2}
<div class="contentOne-content">
<div class="contentOne-content-title">纳税人识别号:</div>
<div class="contentOne-content-text">{$order_detail['taxpayer_number']}</div>
</div>
{/if}
<div class="contentOne-content">
<div class="contentOne-content-title">发票内容:</div>
<div class="contentOne-content-text">{$order_detail['invoice_content']}</div>
</div>
{if $order_detail['invoice_type'] == 1}
<div class="contentOne-content">
<div class="contentOne-content-title">发票邮寄地址:</div>
<div class="contentOne-content-text">{$order_detail['invoice_full_address']}</div>
</div>
{else/}
<div class="contentOne-content">
<div class="contentOne-content-title">发票接收邮件:</div>
<div class="contentOne-content-text">{$order_detail['invoice_email']}</div>
</div>
{/if}
<div class="contentOne-content">
<div class="contentOne-content-title">发票费用:</div>
<div class="contentOne-content-text">¥{$order_detail.invoice_money}</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">发票税率:</div>
<div class="contentOne-content-text">{$order_detail.invoice_rate}%</div>
</div>
<div class="contentOne-content">
<div class="contentOne-content-title">发票邮寄费用:</div>
<div class="contentOne-content-text">¥{$order_detail.invoice_delivery_money}</div>
</div>
</div>
</div>
{/if}
</div>
<!-- 商品信息、订单操作日志 -->
<div class="shop-information layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">商品信息</span>
</div>
<div class="shop-information-table layui-card-body">
<table lay-filter="parse-table-order-product" lay-skin="line">
<thead>
<tr class="table-trOne">
<th lay-data="{field:'product_name', width:200}">商品</th>
<th lay-data="{field:'price'}">价格</th>
<th lay-data="{field:'sale_num'}">数量</th>
<th lay-data="{field:'total_money'}">小计(元)</th>
<th lay-data="{field:'refund_status'}">退款状态</th>
<th lay-data="{field:'shipping_status'}">状态</th>
</tr>
</thead>
<tbody>
{foreach $order_detail['order_goods'] as $list_k => $order_goods_item}
<tr class="table-trTow">
<td>{$order_goods_item.sku_name}</td>
<td>{$order_goods_item.price}</td>
<td>{$order_goods_item.num}</td>
<td>{$order_goods_item.goods_money}</td>
<td>
{if $order_goods_item.refund_status != 0}
<a class="text-color" href='{:href_url("shop/orderrefund/detail?order_goods_id=".$order_goods_item["order_goods_id"])}'>{$order_goods_item.refund_status_name}</a>
{/if}
</td>
<td>{$order_goods_item.delivery_status_name}</td>
</tr>
{/foreach}
</tbody>
</table>
<div class="table-trThree table-trFour">
<div>
<p>商品总额:<span>¥{$order_detail["goods_money"]}</span></p>
</div>
<div>
<p>店铺优惠卷:<span>¥{$order_detail["coupon_money"]}</span></p>
</div>
<div>
<p>店铺优惠:<span>¥{$order_detail["promotion_money"]}</span></p>
</div>
{if $order_detail["point_money"] > 0}
<div>
<p>积分抵扣:<span>¥{$order_detail["point_money"]}</span></p>
</div>
{/if}
<div>
<p>订单调价:<span>¥{$order_detail["adjust_money"]}</span></p>
</div>
<div>
<p>配送费用:<span>¥{$order_detail["delivery_money"]}</span></p>
</div>
<div>
<p>发票费用:<span>¥{$order_detail["invoice_money"]}</span></p>
</div>
<div>
<p>发票邮寄费用:<span>¥{$order_detail["invoice_delivery_money"]}</span></p>
</div>
{if $order_detail["member_card_money"] > 0}
<div>
<p>会员卡:<span>¥{$order_detail["member_card_money"]}</span></p>
</div>
{/if}
</div>
<div class="table-settlement">
订单共<span>{$order_detail["goods_num"]}</span>件商品,共计<span>¥{$order_detail["order_money"]}</span>
</div>
</div>
</div>
{notempty name="$order_detail.order_log"}
<!-- 订单操作 -->
<div class="shop-operation layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">订单操作日志</span>
</div>
<div class="shop-operation-time layui-card-body">
<ul class="layui-timeline">
{foreach name="$order_detail.order_log" item="vo"}
<li class="layui-timeline-item">
<div class="layui-time-left">
<p>{:date('Y-m-d', $vo.action_time)}</p>
<p>{:date('H:i:s', $vo.action_time)}</p>
</div>
<div class="layui-icon layui-timeline-axis">
<span class="layui-icon-center"></span>
</div>
<div class="layui-timeline-content layui-text">
<div class="layui-timeline-title">{$vo.action}</div>
</div>
</li>
{/foreach}
</ul>
</div>
</div>
{/notempty}
{include file="order/order_common_action" /}
<!-- 修改订单收货地址 -->
{include file="order/order_action" /}

View File

@@ -0,0 +1,167 @@
<style>
.marked-message{height: 48px;background: #FFF5ED;font-size: 14px;font-family: Source Han Sans SC;font-weight: 400;color: #666;line-height: 50px;padding: 0 16px;display: flex;}
.promote-flex{display: flex;margin-top: 15px;padding: 0 10px 0;}
.promote-img{background-color: #f8f8f8;display: flex;justify-content: center;align-items: center;width: 200px;height: 200px;}
.promote-img img{width: 160px;height: 160px;}
.label-width{width: 100px;}
.block-left{margin-left: 100px !important;display: flex;}
.promote-download{margin-left: 20px;}
.h5-path{margin-left: 20px;width: 300px;}
.h5-path .fuzhi{width: 1px;height: 0px;border: 0px;}
.h5-path span{display: block;margin-bottom: 10px;}
.h5-path p input{height: 30px;line-height: 30px;border: 1px solid #e6e6e5;width: 150px;padding: 0px 5px;border-radius: 5px;margin-right: 10px;}
</style>
<script type="text/html" id="promote">
<div>
<div class="marked-message">
<p>活动可分享至多个渠道推广增加曝光率提升分享打开率</p>
</div>
<div class="promote-flex">
<div class="promote-img">
<img src="{{ ns.img(d.h5.path) }}" alt="推广二维码">
</div>
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label label-width">选择渠道</label>
<div class="layui-input-block block-left">
<input type="radio" name="promote_type" value="h5" title="H5" checked lay-filter="promote_type" data-config='{{JSON.stringify(d.h5)}}'/>
{if addon_is_exit('weapp', request()->siteid()) == 1}
<input type="radio" name="promote_type" value="weapp" title="微信小程序" lay-filter="promote_type" data-config='{"type":"weapp","load":"true"}' />
{/if}
{if addon_is_exit('pc', request()->siteid()) == 1}
{{# if(d.pc && d.pc.path){ }}
<input type="radio" name="promote_type" value="pc" title="PC" lay-filter="promote_type" />
{{# } }}
{/if}
{if addon_is_exit('aliapp', request()->siteid()) == 1 }
<input type="radio" name="promote_type" value="aliapp" title="支付宝小程序" lay-filter="promote_type" data-config='{"type":"weapp","load":"true"}' />
{/if}
</div>
</div>
<div class="h5-path">
<span>推广链接</span>
<p class="tips text-color"><input type="text" value="{{d.h5.url}}" readonly /><a class="layui-btn" href="javascript:ns.copy('h5_url_{{ d.id }}');">复制</a></p>
<input type="text" id="h5_url_{{ d.id }}" value="{{d.h5.url}}" readonly class="fuzhi"/>
</div>
<div class="promote-download">
<a class="text-color" href="{{ ns.img(d.h5.path) }}" download>下载二维码</a>
</div>
</div>
</div>
</div>
</script>
<script>
function PromoteShow(param){
param = param || {};
let that = this;
that.getPromoteUrl = param.url;
that.getPromoteParam = param.param;
that.promoteData = {};
that.getQrcode('h5', ()=>{
that.open(()=>{
that.getOtherQrcode();
that.onSwitch();
})
})
}
PromoteShow.prototype.onSwitch = function (){
let that = this;
window.form.on('radio(promote_type)', function(radio){
that.switchAction(radio.value);
});
}
PromoteShow.prototype.getOtherQrcode = function (){
let that = this;
var app_type_arr = ['weapp','aliapp'];
app_type_arr.forEach((app_type)=>{
that.getQrcode(app_type,function () {
let radio_dom = $('input[name="promote_type"][value="'+app_type+'"]');
if(that.promoteData[app_type]){
radio_dom.attr('data-config',JSON.stringify(that.promoteData[app_type]))
}else{
radio_dom.attr('data-config',JSON.stringify({ type : app_type, path : '' }))
}
if(radio_dom.prop('checked')){
that.switchAction(app_type);
}
});
})
}
PromoteShow.prototype.getQrcode = function (app_type, callback){
let that = this;
let data = ns.deepclone(that.getPromoteParam);
data.app_type = app_type;
$.ajax({
type: "POST",
url: that.getPromoteUrl,
data: data,
dataType: 'JSON',
success: function (res) {
if (res.code >= 0){
if(res.data[app_type]){
that.promoteData[app_type] = res.data[app_type];
}
callback();
}else{
layer.msg(res.message);
}
}
});
}
PromoteShow.prototype.open = function (callback){
let that = this;
laytpl($("#promote").html()).render(that.promoteData, function (html) {
layer.open({
type: 1,
area: ['730px', '450px'],
offset: '155px',
title: ['推广'],
content: html,
success: function(){
form.render();
callback();
}
})
})
}
PromoteShow.prototype.switchAction = function (app_type){
var dom = $('input[name="promote_type"][value="'+app_type+'"]');
var data = $(dom).attr('data-config');
if(data) data = JSON.parse(data);
else data = {};
if(app_type == 'h5' || app_type == 'pc') {
var html = '<img src="'+ ns.img(data.path) +'"/>';
$('.promote-img').html(html);
$('.promote-download a').attr('href',ns.img(data.path)).show();
$(".h5-path").show().find('input').val(data.url);
}else {
if(data.load){
var html = '<div class="common-loading-wrap">';
html += '<i class="common-loading-layer layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>';
html += '</div>';
$('.promote-img').html(html);
$('.promote-download a').hide();
}else if(data.path){
var html = '<img src="'+ ns.img(data.path) +'"/>';
$('.promote-img').html(html);
$('.promote-download a').attr('href',ns.img(data.path)).show();
}else{
var html = '<span>小程序配置错误</span>';
$('.promote-img').html(html);
$('.promote-download a').hide();
}
$(".h5-path").hide();
}
}
</script>

View File

@@ -0,0 +1,63 @@
<div class="layui-form form-wrap">
<label class="layui-form-label"><span class="required">*</span>是否显示:</label>
<div class="layui-input-inline">
<input type="radio" title="显示" name="is_display" value="1" {if($content.is_display eq '1')}checked{/if}>
<input type="radio" title="不显示" name="is_display" value="0" {if($content.is_display eq '0')}checked{/if}>
</div>
<div class="word-aux">
<p>控制手机端、PC端商品详情页是否显示售后保障 。</p>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>协议内容:</label>
<div class="layui-input-inline">
<script id="editor" type="text/plain" class="special-length" style="height:300px;"></script>
</div>
</div>
<div class="word-aux">售后保障会在商品详情页面售后保障切换卡下方展示内容不超过1000个字符</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
<input type="hidden" name="content" id="setContent" value="{$content.content}" />
</div>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
var ue = UE.getEditor('editor');
ue.ready(function() {
ue.setContent($('#setContent').val());
});
layui.use('form', function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
// 提交
form.on('submit(save)', function(data) {
var html = '';
ue.ready(function() {
html = ue.getContent();
});
data.field.content = html;
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/config/aftersale"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
layer.msg(res.message);
}
});
});
});
</script>

89
app/shop/view/config/api.html Executable file
View File

@@ -0,0 +1,89 @@
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label">Token加密秘钥</label>
<div class="layui-input-block">
{if condition="$config.value"}
<input type="text" name="private_key" class="layui-input len-long" placeholder="请输入秘钥" value="{$config.value.private_key}">
{else/}
<input type="text" name="private_key" class="layui-input len-long" placeholder="请输入秘钥">
{/if}
</div>
<div class="word-aux">该配置关系到会员token解析请慎重设置注意设置之后对应会员要求重新登录获取token</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>token存储时长 </label>
<div class="layui-input-block">
<div class="layui-input-inline len-short">
{if condition="$config.value"}
<input type="number" name="long_time" value="{$config.value.long_time}" lay-verify="required|num" data-min="0" data-unit="小时" placeholder="登录限制时长" autocomplete="off" class="layui-input len-short">
{else/}
<input type="text" name="long_time" value="" class="layui-input len-long" placeholder="登录限制时长">
{/if}
</div>
<div class="layui-form-mid">小时</div>
</div>
<div class="word-aux">
<p>说明该存储时间为小程序端和公众号端用户从登录开始到设置时间会重新获取登录信息0为不限制</p>
</div>
</div>
<div class="form-row">
<!-- <button class="layui-btn" lay-submit lay-filter="generate">生成秘钥</button>-->
<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.verify({
num: function(value) {
if (value < 0) {
return '不能小于0';
}
},
});
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: ns.url("shop/config/api"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data){
layer.msg(data.message);
repeat_flag = false;
}
});
});
form.on('submit(generate)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: ns.url("shop/config/generateRSA"),
dataType: 'JSON',
type: 'POST',
success: function(res){
$("textarea[name='public_key']").val(res.data.public_key.replace(/(\n$)/g,""));
$("textarea[name='private_key']").val(res.data.private_key.replace(/(\n$)/g,""));
repeat_flag = false;
}
});
});
});
</script>

View File

@@ -0,0 +1,70 @@
<style>
.examples {cursor: pointer; margin-left: 15px;}
</style>
<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="shop_login" value="1" lay-skin="switch" {if condition="$config_info.shop_login == 1" }checked {/if} lay-title="启用|关闭"/>
</div>
<div class="word-aux">设置后台登录验证码是否开启<a onclick="showDemo()" class="examples text-color">查看示例</a></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">前台登录验证码:</label>
<div class="layui-input-block">
<input type="checkbox" name="shop_reception_login" value="1" lay-skin="switch" {if condition="$config_info.shop_reception_login == 1" }checked {/if} lay-title="启用|关闭"/>
</div>
<div class="word-aux">设置前台登录验证码是否开启<a onclick="showDemo2()" class="examples text-color">查看示例</a></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">前台注册验证码:</label>
<div class="layui-input-block">
<input type="checkbox" name="shop_reception_register" value="1" lay-skin="switch" {if condition="$config_info.shop_reception_register == 1" }checked {/if} lay-title="启用|关闭"/>
</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 false;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("shop/config/captcha"),
data: data.field,
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
}
});
});
});
function showDemo(){
layer.open({
title: '查看示例',
type: 1,
area: ['600px', '660px'],
content: '<img style="margin: 70px 30px;" src="SHOP_IMG/id_code1.png">'
})
}
function showDemo2(){
layer.open({
title: '查看示例',
type: 1,
area: ['600px', '660px'],
content: '<img style="margin: 20px 40px;" src="SHOP_IMG/id_code2.png">'
})
}
</script>

View File

@@ -0,0 +1,163 @@
<style type="text/css">
.no-auth{ padding: 50px 0;text-align: center; }
</style>
<div class="layui-form">
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">版权设置 </span>
</div>
<div class="layui-card-body">
{if $is_auth}
<div class="layui-form-item">
<label class="layui-form-label">版权logo</label>
<div class="layui-input-block">
<div class="upload-img-block icon">
<div class="upload-img-box {if condition="!empty($copyright_config.logo)"} hover {/if}" >
<div class="upload-default" id="webLogoUpload">
{if condition="!empty($copyright_config.logo)"}
<div id="preview_webLogoUpload" class="preview_img">
<img layer-src src="{:img($copyright_config.logo)}" class="img_prev"/>
</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" 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" name="logo" value="{$copyright_config.logo ?? ''}" />
</div>
<!-- <p id="webLogoUpload" class="{if condition="$copyright_config.logo"} replace {else/} no-replace{/if}">替换</p>
<i class="del {if condition="!empty($copyright_config.logo)"}show{/if}">x</i> -->
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">公司名称:</label>
<div class="layui-input-block">
<input type="text" name="company_name" value="{$copyright_config.company_name ?? ''}" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">版权链接:</label>
<div class="layui-input-block">
<input type="text" name="copyright_link" value="{$copyright_config.copyright_link ?? ''}" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">版权信息:</label>
<div class="layui-input-block">
<textarea name="copyright_desc" class="layui-textarea len-long" maxlength="150">{$copyright_config.copyright_desc ?? ''}</textarea>
</div>
</div>
{else/}
<div class="no-auth">授权之后才可修改版权信息,<a href="https://www.niushop.com" class="text-color" target="_blank">去授权</a></div>
{/if}
</div>
</div>
<div class="layui-card card-common card-brief">
<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">网站ICP备案号</label>
<div class="layui-input-block">
<input type="text" name="icp" value="{$copyright_config.icp}" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站公安备案:</label>
<div class="layui-input-block">
<input type="text" name="gov_record" value="{$copyright_config.gov_record}" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站公安链接:</label>
<div class="layui-input-block">
<input type="text" name="gov_url" value="{$copyright_config.gov_url}" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">市场监督管理局链接:</label>
<div class="layui-input-block">
<input type="text" name="market_supervision_url" value="{$copyright_config.market_supervision_url ?? ''}" autocomplete="off" class="layui-input len-long" style="display: inline-block;">
</div>
</div>
</div>
</div>
<div class="layui-card card-common card-brief">
<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="text" name="business_show_link" value="{$copyright_config.business_show_link ?? ''}" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="word-aux">亮照链接获取请前往<a class="text-color" href="https://zzlz.gsxt.gov.cn/businessShow" target="_blank">电子营业执照照亮系统</a>设置后在PC和H5前台网站底部会显示亮照图标点击可以查看营业执照信息。</div>
</div>
</div>
<div class="single-filter-box">
<div class="form-row">
<button type="button" class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
</div>
<script>
layui.use(['form',], function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
var upload = new Upload({
elem: '#webLogoUpload'
});
//保存配置
form.on('submit(save)', function(data) {
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/config/copyright"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
}
});
});
});
function showDemo(){
layer.open({
title: '查看示例',
type: 1,
area: ['600px', '660px'],
content: '<img style="margin:100px 30px;" src="SHOP_IMG/copyright.png">'
})
}
</script>

View File

@@ -0,0 +1,254 @@
<style>
.layui-form-item {
margin: 5px 0 10px 0;
}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label">默认商品图片:</label>
<div class="layui-input-inline">
<div class="upload-img-block">
<div class="upload-img-box {if !empty($default_img.goods)}hover{/if}">
<div class="upload-default" id="imgUploadGoods">
{if empty($default_img.goods)}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{else/}
<div id="preview_imgUploadGoods" class="preview_img">
<img layer-src src="{:img($default_img.goods)}" alt="" class="img_prev">
</div>
{/if}
</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" name="goods" {if $default_img} value="{$default_img.goods}" {/if}>
</div>
<!-- <p id="imgUploadGoods" class=" {if condition="$default_img.goods"} replace {else/} no-replace{/if}">替换</p>
<i class="del {if !empty($default_img.goods)}show{/if}">x</i> -->
</div>
</div>
</div>
<div class="word-aux">
<p>说明:默认商品图针对默认商品数据的商品图片。</p>
</div>
<div class="layui-form-item">
<label class="layui-form-label">默认会员头像:</label>
<div class="layui-input-inline">
<div class="upload-img-block">
<div class="upload-img-box {if !empty($default_img.head)}hover{/if}">
<div class="upload-default" id="imgUploadMember">
{if empty($default_img.head)}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{else/}
<div id="preview_imgUploadMember" class="preview_img">
<img layer-src src="{:img($default_img.head)}" alt="" class="img_prev">
</div>
{/if}
</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" name="head" {if $default_img} value="{$default_img.head}" {/if}>
</div>
</div>
</div>
</div>
<div class="word-aux">
<p>说明:前后端没有上传头像的会员会展示该默认图。</p>
</div>
<div class="layui-form-item">
<label class="layui-form-label">默认门店图片:</label>
<div class="layui-input-inline">
<div class="upload-img-block">
<div class="upload-img-box {if !empty($default_img.store)}hover{/if}">
<div class="upload-default" id="imgUploadStore">
{if empty($default_img.store)}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{else/}
<div id="preview_imgUploadStore" class="preview_img">
<img layer-src src="{:img($default_img.store)}" alt="" class="img_prev">
</div>
{/if}
</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" name="store" {if $default_img} value="{$default_img.store}" {/if}>
</div>
</div>
</div>
</div>
<div class="word-aux">
<p>说明如果门店未上传门店logo那么前后端都默认展示该图片。</p>
</div>
<div class="layui-form-item">
<label class="layui-form-label">默认文章图片:</label>
<div class="layui-input-inline">
<div class="upload-img-block">
<div class="upload-img-box {if !empty($default_img.article)}hover{/if}">
<div class="upload-default" id="imgUploadArticle">
{if empty($default_img.article)}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{else/}
<div id="preview_imgUploadArticle" class="preview_img">
<img layer-src src="{:img($default_img.article)}" alt="" class="img_prev">
</div>
{/if}
</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" name="article" {if $default_img} value="{$default_img.article}" {/if}>
</div>
</div>
</div>
</div>
<div class="word-aux">
<p>说明:文章封面图没有或者错误时展示该默认图。</p>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<a id="defaultGoodsImgId"></a>
<a id="defaultHeadimgId"></a>
<a id="defaultStoreimgId"></a>
<a id="defaultArticleimgId"></a>
</div>
</div>
<script>
var saveData = null;
var totalUploadNum = 0;
var completeUploadNum = 0;
var store_upload;
var goods_upload;
var member_upload;
var article_upload;
layui.use(['form'], function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
goods_upload = new Upload({
elem: '#imgUploadGoods',
auto:false,
bindAction:'#defaultGoodsImgId',
callback: function(res) {
uploadComplete('goods', res.data.pic_path);
}
});
member_upload = new Upload({
elem: '#imgUploadMember',
auto:false,
bindAction:'#defaultHeadimgId',
callback: function(res) {
uploadComplete('head', res.data.pic_path);
}
});
store_upload = new Upload({
elem: '#imgUploadStore',
auto:false,
bindAction:'#defaultStoreimgId',
callback: function(res) {
uploadComplete('store', res.data.pic_path);
}
});
article_upload = new Upload({
elem: '#imgUploadArticle',
auto:false,
bindAction:'#defaultArticleimgId',
callback: function(res) {
uploadComplete('article', res.data.pic_path);
}
});
function uploadComplete(field, pic_path) {
saveData.field[field] = pic_path;
completeUploadNum += 1;
if(completeUploadNum == totalUploadNum){
saveFunc();
}
}
function saveFunc(){
var data = saveData;
$.ajax({
type: "POST",
url: ns.url("shop/config/defaultpicture"),
data: data.field,
dataType: 'JSON',
success: function(res) {
repeat_flag = false;
layer.msg(res.message);
}
});
}
form.on('submit(save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
// 删除图片
if (!data.field.goods && goods_upload.path != 'public/static/img/default_img/square.png') goods_upload.delete();
if (!data.field.head && member_upload.path != 'public/static/img/default_img/head.png') member_upload.delete();
if (!data.field.store && store_upload.path != 'public/static/img/default_img/square.png') store_upload.delete();
if (!data.field.article && article_upload.path != 'public/static/img/default_img/article.png') article_upload.delete();
saveData = data;
var obj = $("img.img_prev[data-prev='1']");
totalUploadNum = obj.length;
if(totalUploadNum > 0){
obj.each(function(){
var actionId = $(this).attr('data-action-id');
$(actionId).click();
})
}else{
saveFunc();
}
});
});
</script>

66
app/shop/view/config/map.html Executable file
View File

@@ -0,0 +1,66 @@
<style type="text/css">
.inline-block{display: inline-block;}
</style>
<div class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label">腾讯地图KEY</label>
<div class="layui-input-block">
<input type="text" name="tencent_map_key" autocomplete="off" value="{$info.tencent_map_key ?? ''}" class="layui-input len-long inline-block">
<a href="https://lbs.qq.com/dev/console/key/manage" class="text-color" target="_blank" style="margin-left:5px;">获取密钥</a>
</div>
<div class="word-aux">
<p>平台腾讯定位地图应用KEY</p>
<p>使用场景:手机端收货地址选择、查询距离最近的门店,管理端店铺联系地址,管理端-门店地图选择</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">手机端定位:</label>
<div class="layui-input-block">
<input type="checkbox" name="wap_is_open" value="1" lay-skin="switch" {if condition="$info.wap_is_open == 1" }checked {/if} lay-title="启用|关闭"/>
</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="number" class="layui-input len-short" name="wap_valid_time" value="{$info.wap_valid_time}" />
</div>
<span class="layui-form-mid">分钟</span>
</div>
<div class="word-aux">过期后将重新获取定位信息0为不过期</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 false;
repeat_flag = true;
$.ajax({
url: ns.url("shop/config/map"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data){
layer.msg(data.message);
repeat_flag = false;
}
});
});
});
</script>

63
app/shop/view/config/pay.html Executable file
View File

@@ -0,0 +1,63 @@
<!-- 列表 -->
<table id="pay_list" lay-filter="pay_list"></table>
<!-- 支付方式 -->
<script type="text/html" id="payment">
<div class="table-title">
<div class="title-pic">
<img layer-src src="{{ns.img(d.logo.split(',')[0])}}"/>
</div>
<div class="title-content">
{{d.pay_type_name}}
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit" href="{{ns.href(d.shop_url)}}">配置</a>
</div>
</script>
<script>
var table = new Table({
elem: '#pay_list',
url: ns.url("shop/config/pay"),
page: false,
parseData: function(data) { //res 即为原始返回的数据
return {
"code": data.code,
"msg": data.message,
"data": data.data,
};
},
cols: [
[{
field: 'pay_type_name',
title: '支付方式名称',
width: '30%',
unresize: 'false',
templet: '#payment'
}, {
field: 'desc',
title: '支付方式描述',
width: '45%',
unresize: 'false'
},{
field: 'status',
title: '支付状态',
width: '15%',
unresize: 'false',
templet: function (data){
return data.pay_status == 1 ? '开启' : '关闭';
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
});
</script>

View File

@@ -0,0 +1,304 @@
<style>
.layui-layout-admin .layui-body .body-content{background-color: transparent;padding: 0;}
.input-text span{margin-right: 15px;}
.form-wrap {margin-top: 0; position: relative;background: none;padding: 0}
.form-wrap .top{background: #f5f5f5;margin-top: 10px}
.layui-form-item.top .layui-form-label{text-align: left;font-weight: bold;padding-left: 15px;}
.layui-form-label + .layui-input-block{margin-left: 94px ;}
.layui-unselect.layui-form-radio.layui-form-radioed.layui-radio-disbaled i:after{background:#eee !important;}
.shop-information{width: 100%;background: white;padding: 20px;box-sizing: border-box;margin-bottom: 20px;}
.shop-information .layui-input-block{margin-left: 0 !important;}
.shop-information .main-title{display: flex;align-items: center;justify-content: space-between;margin-bottom: 18px;}
.shop-information .title{color:#333333;margin-bottom: 0;width: 50%;height: 16px;line-height: 16px;padding-left: 10px;border-left: 3px solid var(--base-color);box-sizing: border-box;font-size: 17px;}
.shop-information .main-title span{cursor: pointer;}
.word-aux{margin-left: 100px}
.all-box-left{margin-left: 100px;}
.card-common{margin-top: 0;}
.layui-layout-admin .form-wrap{padding-top: 0;}
.input-text span{margin-right: 15px;}
.layui-form-item.top .layui-form-label{text-align: left;font-weight: bold;padding-left: 15px;}
.layui-unselect.layui-form-radio.layui-form-radioed.layui-radio-disbaled i:after{background:#eee !important;}
.service-box .box .layui-form-label{width: 158px !important;height: 38px;line-height: 38px;}
.service-popup-box .layui-form-label{width: 140px;}
.service-popup-box .layui-form-label + .layui-input-block {margin-left: 140px}
.service-popup-box .word-aux{margin-left: 140px;}
.service-popup-box .all-box-left{margin-left: 140px;}
.service-box .box .top {margin-bottom: 0;}
.service-box{padding-bottom: 40px; width: calc(100% / 3);}
.card-common .layui-card-body{padding: 20px 0 0;}
</style>
<div class="layui-form form-wrap card-common">
<div class="layui-card card-common card-brief shop-information service-box">
<div class="layui-card-header main-title">
<span class="card-title">客服设置</span>
<span class="text-color" onclick="editService()">编辑</span>
</div>
<div class="layui-card-body box">
<div class="layui-form-item">
<label class="layui-form-label">H5/微信公众号端:</label>
<div class="layui-input-block">
{switch name="$config.h5.type"}
{case value="none"}未启用{/case}
{case value="niushop"}Niushop客服{/case}
{case value="wxwork"}企业微信客服{/case}
{case value="third"}第三方客服{/case}
{/switch}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">微信小程序端:</label>
<div class="layui-input-block">
{switch name="$config.weapp.type"}
{case value="none"}未启用{/case}
{case value="niushop"}Niushop客服{/case}
{case value="wxwork"}企业微信客服{/case}
{case value="weapp"}小程序客服{/case}
{/switch}
</div>
</div>
{if addon_is_exit('pc', request()->siteid()) == 1}
<div class="layui-form-item">
<label class="layui-form-label">PC端</label>
<div class="layui-input-block">
{switch name="$config.pc.type"}
{case value="none"}未启用{/case}
{case value="third"}第三方客服{/case}
{/switch}
</div>
</div>
{/if}
{if addon_is_exit('aliapp', request()->siteid()) == 1 }
<div class="layui-form-item">
<label class="layui-form-label">支付宝小程序:</label>
<div class="layui-input-block">
{switch name="$config.aliapp.type"}
{case value="none"}未启用{/case}
{case value="niushop"}Niushop客服{/case}
{case value="aliapp"}蚂蚁智能客服{/case}
{/switch}
</div>
</div>
{/if}
</div>
</div>
</div>
<script type="text/html" id="contentService">
<div class="layui-form form-wrap service-popup-box layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">H5/微信公众号端</span>
</div>
<div class="layui-form-item">
<label class="layui-form-label">客服类型</label>
<div class="layui-input-block">
<input type="radio" name="h5[type]" lay-filter="serviceType" lay-type="h5" value="none" title="不启用" {if condition="$config.h5.type == 'none'"} checked {/if}>
{if addon_is_exit('servicer')}<input type="radio" name="h5[type]" lay-filter="serviceType" lay-type="h5" value="niushop" title="Niushop客服" {if condition="$config.h5.type == 'niushop'"} checked {/if}>{/if}
<input type="radio" name="h5[type]" lay-filter="serviceType" lay-type="h5" value="wxwork" title="企业微信客服" {if condition="$config.h5.type == 'wxwork'"} checked {/if}>
<input type="radio" name="h5[type]" lay-filter="serviceType" lay-type="h5" value="third" title="第三方客服" {if condition="$config.h5.type == 'third'"} checked {/if}>
</div>
</div>
<div class="h5-wrap wxwork" {if $config.h5.type != 'wxwork'} style="display: none" {/if}>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<input type="text" class="layui-input len-mid" name="h5[wxwork_url]" value="{$config.h5.wxwork_url ?? ''}" lay-verify="h5WxworkUrl">
</div>
</div>
<div class="word-aux">H5中如何接入企业微信客服请查看<a href="https://work.weixin.qq.com/nl/act/p/3f8820e724cb44c5" target="_blank" class="text-color">在微信内网页中接入</a></div>
</div>
<div class="h5-wrap third" {if $config.h5.type != 'third'} style="display: none" {/if}>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<input type="text" class="layui-input len-mid" name="h5[third_url]" value="{$config.h5.third_url ?? ''}" lay-verify="h5ThirdUrl">
</div>
</div>
<div class="word-aux">请填写客服链接聊天时跳转至第三方聊天窗口例如<a href="https://meiqia.com/zt/livechat?utm_source=tian&amp;utm_medium=baidu&amp;utm_term=pinzhuan" target="_blank" class="text-color">美洽客服</a></div>
</div>
<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">
<input type="radio" name="weapp[type]" lay-filter="serviceType" lay-type="weapp" value="none" title="不启用" {if condition="$config.weapp.type == 'none'"} checked {/if}>
{if addon_is_exit('servicer')}<input type="radio" name="weapp[type]" lay-filter="serviceType" lay-type="weapp" value="niushop" title="Niushop客服" {if condition="$config.weapp.type == 'niushop'"} checked {/if}>{/if}
<input type="radio" name="weapp[type]" lay-filter="serviceType" lay-type="weapp" value="weapp" title="小程序客服" {if condition="$config.weapp.type == 'weapp'"} checked {/if}>
<input type="radio" name="weapp[type]" lay-filter="serviceType" lay-type="weapp" value="wxwork" title="企业微信客服" {if condition="$config.weapp.type == 'wxwork'"} checked {/if}>
</div>
</div>
<div class="weapp-wrap wxwork" {if $config.weapp.type != 'wxwork'} style="display: none" {/if}>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>ID</label>
<div class="layui-input-block">
<input type="text" class="layui-input len-mid" name="weapp[corpid]" value="{$config.weapp.corpid ?? ''}" lay-verify="weappCorpid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<input type="text" class="layui-input len-mid" name="weapp[wxwork_url]" value="{$config.weapp.wxwork_url ?? ''}" lay-verify="weappWxworkUrl">
</div>
</div>
<div class="word-aux">小程序中如何接入企业微信客服请查看<a href="https://work.weixin.qq.com/nl/act/p/a733314375294bdd" target="_blank" class="text-color">在小程序中接入</a></div>
</div>
{if addon_is_exit('pc', request()->siteid()) == 1}
<div class="layui-card-header">
<span class="card-title">PC端</span>
</div>
<div class="layui-form-item">
<label class="layui-form-label">客服类型</label>
<div class="layui-input-block">
<input type="radio" name="pc[type]" lay-filter="serviceType" lay-type="pc" value="none" title="不启用" {if condition="$config.pc.type == 'none'"} checked {/if}>
<input type="radio" name="pc[type]" lay-filter="serviceType" lay-type="pc" value="third" title="第三方客服" {if condition="$config.pc.type == 'third'"} checked {/if}>
</div>
</div>
<div class="pc-wrap third" {if $config.pc.type != 'third'} style="display: none" {/if}>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<input type="text" class="layui-input len-mid" name="pc[third_url]" value="{$config.pc.third_url ?? ''}" lay-verify="pcThirdUrl">
</div>
</div>
<div class="word-aux">请填写客服链接聊天时跳转至第三方聊天窗口例如<a href="https://meiqia.com/zt/livechat?utm_source=tian&amp;utm_medium=baidu&amp;utm_term=pinzhuan" target="_blank" class="text-color">美洽客服</a></div>
</div>
{/if}
{if addon_is_exit('aliapp', request()->siteid()) == 1 }
<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">
<input type="radio" name="aliapp[type]" lay-filter="serviceType" lay-type="aliapp" value="none" title="不启用" {if condition="$config.aliapp.type == 'none'"} checked {/if}>
{if addon_is_exit('servicer')}<input type="radio" name="aliapp[type]" lay-filter="serviceType" lay-type="aliapp" value="niushop" title="Niushop客服" {if condition="$config.aliapp.type == 'niushop'"} checked {/if}>{/if}
<input type="radio" name="aliapp[type]" lay-filter="serviceType" lay-type="aliapp" value="aliapp" title="蚂蚁智能客服" {if condition="$config.aliapp.type == 'aliapp'"} checked {/if}>
</div>
</div>
<div class="aliapp-wrap aliapp" {if $config.aliapp.type != 'aliapp'} style="display: none" {/if}>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>ID</label>
<div class="layui-input-block">
<input type="text" class="layui-input len-mid" name="aliapp[instid]" value="{$config.aliapp.instid ?? ''}" lay-verify="aliappInstid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>ID</label>
<div class="layui-input-block">
<input type="text" class="layui-input len-mid" name="aliapp[scene]" value="{$config.aliapp.scene ?? ''}" lay-verify="aliappScene">
</div>
</div>
<div class="word-aux">小程序中如何接入蚂蚁智能客服请查看<a href="https://opendocs.alipay.com/b/03al9b" target="_blank" class="text-color">在小程序中接入</a></div>
</div>
{/if}
<div class="form-row all-box-left">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
</script>
<script>
var repeat_flag = false; //防重复标识
var form,serviceOpen;
layui.use(['form'], function() {
form = layui.form;
form.render();
form.verify({
h5WxworkUrl: function(value){
if ($('[name="h5[type]"]:checked').val() == 'wxwork' && !/[\S]+/.test(value)) {
return '请输入客服链接';
}
},
h5ThirdUrl: function(value){
if ($('[name="h5[type]"]:checked').val() == 'third' && !/[\S]+/.test(value)) {
return '请输入客服链接';
}
},
weappCorpid: function(value){
if ($('[name="weapp[type]"]:checked').val() == 'wxwork' && !/[\S]+/.test(value)) {
return '请输入企业ID';
}
},
weappWxworkUrl: function(value){
if ($('[name="weapp[type]"]:checked').val() == 'wxwork' && !/[\S]+/.test(value)) {
return '请输入客服链接';
}
},
pcThirdUrl: function(value){
if ($('[name="pc[type]"]:checked').val() == 'third' && !/[\S]+/.test(value)) {
return '请输入客服链接';
}
},
aliappInstid: function(value){
if ($('[name="aliapp[type]"]:checked').val() == 'aliapp' && !/[\S]+/.test(value)) {
return '租户ID';
}
},
aliappScene: function(value){
if ($('[name="aliapp[type]"]:checked').val() == 'aliapp' && !/[\S]+/.test(value)) {
return '聊天窗ID';
}
}
})
form.on('radio(serviceType)',function(data){
var type = $(data.elem).attr('lay-type'), value = data.value;
$('.' + type + '-wrap').hide();
$('.' + type + '-wrap.' + value).show();
})
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: ns.url("shop/config/servicer"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
if (res.code == 0) {
layer.msg('编辑成功');
listenerHash(); // 刷新页面
layer.closeAll();
}else{
repeat_flag = false;
layer.msg(res.message);
}
}
});
});
});
function showDemo(){
layer.open({
title: '查看示例',
type: 1,
area: ['700px', '660px'],
content: '<img style="margin:15px;" src="SHOP_IMG/chat1.png"><img style="margin:15px;" src="SHOP_IMG/chat2.png">'
})
}
function editService(){
serviceOpen= layer.open({
title:'客服设置',
type:1,
area: 'auto',
fixed:true,
maxWidth:1000,
maxHeight:800,
content:$("#contentService").html(),
success:function(layero,index){
form.render();
}
})
}
</script>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,401 @@
<style>
.layui-layout-admin .layui-body .body-content {padding-bottom: 150px;}
.layui-form-switch{margin-top: 0;}
.layui-card-body{display: flex;justify-content: space-between;align-items: center;}
.layui-card-body p{color: #666666;}
.btn-box{flex-shrink: 0;margin-left: 20px;}
.btn-box a{cursor: pointer;}
.card-common:first-child{margin-top: 0;}
.card-common{border: 1px solid #f1f1f1;}
.single-filter-box {display: block; position: relative;}
.deliver-type .layui-card{user-select:none}
.layui-card-header .table_move.iconfont.icontuodong{flex: 1; cursor: move;}
.layui-card-header .card-title{flex: 60}
.layui-card-header .card-icon,.layui-card-header .ziti-icon,.layui-card-header .waimai-icon{margin-left: 10px;cursor:pointer;}
.kuaidi-list {display: none;min-width: 150px;height: 25px;line-height: 30px;padding-left: 6px;}
.card-list {display: flex;align-items:center;position: absolute;left: 45px;}
.layui-layout-admin .tips-wrap{margin-bottom: 15px;}
.card-common .layui-card-header{height: 42px;line-height: 42px;padding: 0 15px;}
.card-common .layui-card-body{padding: 10px 15px;}
</style>
<div class="single-filter-box">
<div class="layui-form deliver-type">
{foreach name="deliver_type" item="vo"}
{if $vo eq 'express'}
<div class="layui-card card-common" data-type="express">
<div class="layui-card-header">
<div class="table_move iconfont icontuodong"></div>
<!-- <span class="card-title">快递发货</span> -->
<div class="card-list">
{if count($express_config.value) && $express_config.value.express_name != ''}
<input type="text" name="kuaidi-text" class="kuaidi-list" value="{$express_config.value.express_name}" />
<span id="card-title-one" class="card-title kuaidi">{$express_config.value.express_name}</span>
{else}
<input type="text" name="kuaidi-text" class="kuaidi-list" value="快递发货" />
<span class="card-title kuaidi">快递发货</span>
{/if}
<div class="card-icon">
<!-- <img src="SHOP_IMG/express_delivery.png" style="width: 18px;height: 14px;" /> -->
<i class="layui-icon text-color" style="font-size: 16px; !important"></i>
</div>
</div>
<span class="tips">
<input class="control" type="checkbox" name="" id="express" value="1" lay-skin="switch" {if $express_config.is_use == 1} checked {/if} lay-filter="logistics" />
</span>
</div>
<div class="layui-card-body">
<p>启用物流配送后,买家下单可以选择快递发货,在微信视频号中仅支持物流配送。</p>
<div class="btn-box">
<a class="default text-color" href="{:href_url('shop/express/expresscompany')}">物流公司</a>
<a class="default text-color" href="{:href_url('shop/express/template')}">运费模板</a>
<a class="default text-color" href="{:href_url('shop/express/trace')}">物流跟踪</a>
</div>
</div>
</div>
{/if}
{if $vo eq 'store'}
<div class="layui-card card-common" data-type="store">
<div class="layui-card-header">
<div class="table_move iconfont icontuodong"></div>
<!-- <span class="card-title">门店自提</span> -->
<div class="card-list inputTrigger">
{if count($store_config.value) && $store_config.value.store_name != ''}
<input type="text" name="ziti-text" class="kuaidi-list" value="{$store_config.value.store_name}" />
<span id="card-title-tow" class="card-title ziti">{$store_config.value.store_name}</span>
{else}
<input type="text" name="ziti-text" class="kuaidi-list" value="门店自提" />
<span class="card-title ziti">门店自提</span>
{/if}
<div class="ziti-icon">
<i class="layui-icon text-color" style="font-size: 16px; !important"></i>
</div>
</div>
<span class="tips">
<input class="control" type="checkbox" name="" id="store" value="1" lay-skin="switch" {if $store_config.is_use == 1} checked {/if} lay-filter="SelfMention" />
</span>
</div>
<div class="layui-card-body">
<p>启用上门自提后,买家可以就近选择商品自提门店,买家下单后,您需要确保买家指定的自提门店商品库存充足。</p>
<div class="btn-box">
{if addon_is_exit('store') == 1}
<a class="default text-color" href="{:href_url('store://shop/store/lists')}">自提门店</a>
{else /}
<a class="default text-color" href="{:href_url('shop/store/lists')}">自提门店</a>
{/if}
</div>
</div>
</div>
{/if}
{if $vo eq 'local'}
<div class="layui-card card-common" data-type="local">
<div class="layui-card-header">
<div class="table_move iconfont icontuodong"></div>
<!-- <span class="card-title">外卖配送</span> -->
<div class="card-list">
{if count($local_delivery_config.value) && $local_delivery_config.value.local_name != ''}
<input type="text" name="waimai-text" class="kuaidi-list" value="{$local_delivery_config.value.local_name}"/>
<span id="card-title-three" class="card-title waimai">{$local_delivery_config.value.local_name}</span>
{else}
<input type="text" name="waimai-text" class="kuaidi-list" value="同城配送" />
<span class="card-title waimai">同城配送</span>
{/if}
<div class="waimai-icon">
<i class="layui-icon text-color" style="font-size: 16px; !important"></i>
</div>
</div>
<span class="tips">
<input class="control" type="checkbox" name="local_switch" id="local" value="1" lay-skin="switch" {if $local_delivery_config.is_use == 1} checked {/if} lay-filter="cityDistribution"/>
</span>
</div>
<div class="layui-card-body">
<p>启用同城配送后,在配送范围内的买家可以选择同城配送,您可以接入第三方配送,也可以自己配送。</p>
<div class="btn-box" >
{if addon_is_exit('store') == 1}
<a class="default text-color" href="{:href_url('store://shop/store/lists')}">配送门店</a>
{else /}
<a class="default text-color" href="{:href_url('shop/local/deliverlists')}">配送员</a>
<a class="default text-color" href="{:href_url('shop/local/local')}">配送设置</a>
{/if}
</div>
</div>
</div>
{/if}
{/foreach}
</div>
</div>
<script type="text/javascript" src="__STATIC__/ext/drag-arrange.js"></script>
<script>
var expless = {$express_config.is_use};
var store = {$store_config.is_use};
var local = {$local_delivery_config.is_use};
function choice(){
var expressOne =$('#express').prop('checked');
var storeTow=$('#store').prop('checked');
var localThree=$('#local').prop('checked');
$('#express').removeAttr('disabled');
$('#store').removeAttr('disabled');
$('#local').removeAttr('disabled');
if(!expressOne && !storeTow){
$('#local').attr('disabled','disabled')
}else if(!expressOne && !localThree){
$('#store').attr('disabled','disabled')
}else if(!storeTow && !localThree){
$('#express').attr('disabled','disabled')
}
}
choice();
if ($('input[name="kuaidi-text"]').val() != '快递发货' ) {
$('.type-type1').html('{$express_config.value.express_name}');
}
if ($('input[name="ziti-text"]').val() != '快递发货' ) {
$('.type-type2').html('{$store_config.value.store_name}');
}
if ($('input[name="waimai-text"]').val() != '快递发货' ) {
$('.type-type3').html('{$local_delivery_config.value.local_name}');
}
$('.card-icon').click(function(){
$('.kuaidi').css("display","none");
$('input[name="kuaidi-text"]').css("display","block");
$('.card-list').find('input[name="kuaidi-text"]').focus();
$('.card-icon').css("display","none");
});
$('input[name="kuaidi-text"]').blur(function(){
$('.kuaidi').css("display","flex");
$('input[name="kuaidi-text"]').css("display","none");
$('.card-icon').css("display","block");
let value = $('input[name="kuaidi-text"]').val();
if(value != ''){
$.ajax({
dataType: "JSON",
type: "POST",
data:{express_name: value, is_use : expless},
url: ns.url("shop/delivery/modifyExpressStatus"),
success: function(res){
layer.msg(res.message);
$('#card-title-one').html(value);
listenerHash(); // 刷新页面
layer.closeAll();
}
})
}
});
$('.ziti-icon').click(function(){
$('.ziti').css("display","none");
$('input[name="ziti-text"]').css("display","block");
$('.card-list').find('input[name="ziti-text"]').focus();
$('.ziti-icon').css("display","none");
});
$('input[name="ziti-text"]').blur(function(){
$('.ziti').css("display","flex");
$('input[name="ziti-text"]').css("display","none");
$('.ziti-icon').css("display","block");
let value = $('input[name="ziti-text"]').val();
if(value != ''){
$.ajax({
dataType: "JSON",
type: "POST",
data:{store_name: value, is_use : store},
url: ns.url("shop/delivery/modifyStoreStatus"),
success: function(res){
layer.msg(res.message);
$('#card-title-tow').html(value);
listenerHash(); // 刷新页面
}
})
}
});
$('.waimai-icon').click(function(){
$('.waimai').css("display","none");
$('input[name="waimai-text"]').css("display","block");
$('.card-list').find('input[name="waimai-text"]').focus();
$('.waimai-icon').css("display","none");
});
$('input[name="waimai-text"]').blur(function(){
$('.waimai').css("display","flex");
$('input[name="waimai-text"]').css("display","none");
$('.waimai-icon').css("display","block");
let value = $('input[name="waimai-text"]').val();
if(value != ''){
$.ajax({
dataType: "JSON",
type: "POST",
data:{local_name: value, "is_use" : local},
url: ns.url("shop/delivery/modifyLocalStatus"),
success: function(res){
layer.msg(res.message);
$('#card-title-three').html(value);
listenerHash(); // 刷新页面
}
})
}
});
layui.use('form', function() {
var form = layui.form;
form.render();
//物流配置开关
form.on('switch(logistics)', function(data){
choice();
data.value = data.elem.checked ? data.value : 0;
var express_name = $("input[name='kuaidi-text']").val();
$.ajax({
dataType: "JSON",
type: "POST",
data:{"is_use": data.value, "express_name" : express_name},
url: ns.url("shop/delivery/modifyExpressStatus"),
success: function(res){
layer.msg(res.message);
if (res.code < 0) {
$('#store').prop('checked', false);
form.render();
}
}
})
});
//门店自提开关
form.on('switch(SelfMention)', function(data){
data.value = data.elem.checked ? data.value : 0;
var store_name = $("input[name='ziti-text']").val();
choice();
$.ajax({
dataType: "JSON",
type: "POST",
data:{"is_use": data.value, "store_name" : store_name},
url: ns.url("shop/delivery/modifyStoreStatus"),
success: function(res) {
layer.msg(res.message);
if (res.code < 0) {
$('#store').prop('checked', false);
form.render();
}
}
})
});
//外卖配送开关
form.on('switch(cityDistribution)', function(data){
var local = data.elem.checked ? data.value : 0;
data.value = data.elem.checked ? data.value : 0;
var local_name = $("input[name='waimai-text']").val();
choice();
$.ajax({
dataType: "JSON",
type: "POST",
data:{"is_use": data.value, "local_name" : local_name},
url: ns.url("shop/delivery/modifyLocalStatus"),
success: function(res){
layer.msg(res.message);
if (res.code < 0) {
$('#local').prop('checked', false);
form.render();
}
}
})
});
$('.layui-card.card-common').arrangeable({
dragSelector: '.table_move',
callback:function(e){
var deliverType = [];
$('.deliver-type .layui-card').each(function(){
deliverType.push($(this).attr('data-type'));
});
setTimeout(function(){
$.ajax({
dataType: "JSON",
type: "POST",
data:{"deliver_type": deliverType.toString()},
url: ns.url("shop/delivery/delivertypesort"),
success: function(res){
}
})
},100);
}
});
$('.tips').on('click',function(){
var expressOne = $('#express').attr('disabled');
var storeTow = $('#store').attr('disabled');
var localThree = $('#local').attr('disabled');
var name=$(this).children().attr('id');
var disabledName;
switch ('disabled') {
case expressOne:
disabledName = 'express';
break;
case storeTow:
disabledName = 'store';
break;
case localThree:
disabledName = 'local';
break;
}
if(name == disabledName){
layer.msg('最少保留一个配送方式');
}
})
});
function showDemo(){
layer.open({
title: '查看示例',
type: 1,
area: ['700px', '660px'],
content: '<img style="margin:20px 50px;" src="SHOP_IMG/delivery.png">'
})
}
document.onkeydown = function (e) {
var theEvent = window.event || e;
var code = theEvent.keyCode || theEvent.which || theEvent.charCode;
var name = $('.kuaidi-list:focus').attr("name");
var val = $('.kuaidi-list:focus').val();
if (code == 13) {
if(name == "kuaidi-text"){
var data = {
"express_name" : val,
"is_use" : expless
};
var url = ns.url("shop/delivery/modifyExpressStatus");
}else if(name == "ziti-text"){
var data = {
"store_name" : val,
"is_use" : store
};
var url = ns.url("shop/delivery/modifyStoreStatus");
}else if(name == "waimai-text"){
var data = {
"local_name" : val,
"is_use" : local
};
var url = ns.url("shop/delivery/modifyLocalStatus");
}
if(val != ''){
$.ajax({
dataType: "JSON",
type: "POST",
data: data,
url: url,
success: function(res){
layer.msg(res.message);
listenerHash(); // 刷新页面
}
})
}
}
}
</script>

492
app/shop/view/delivery/lists.html Executable file
View File

@@ -0,0 +1,492 @@
<link rel="stylesheet" href="SHOP_CSS/delivery_lists.css"/>
<style>
.table-tab .layui-tab-content {padding-top: 0;}
.layui-layer-content {line-height: 30px;}
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
.layui-layout-admin .layui-table-cell{height: 32px;line-height: 32px;}
.screen.layui-collapse{margin-bottom: 0;}
.table-tab{margin-top: 0;}
.order-operation{padding-top: 15px;}
</style>
<!-- 筛选 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show" lay-filter="order_list">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">搜索方式</label>
<div class="layui-input-inline">
<select name="order_label" >
{foreach $order_label_list as $k => $label_val}
<option value="{$k}">{$label_val}</option>
{/foreach}
</select>
</div>
<div class="layui-input-inline">
<input type="text" name="search" autocomplete="off" class="layui-input" />
</div>
</div>
</div>
<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-form-mid">-</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" onclick="datePick(7, this);return false;">近7天</button>
<button class="layui-btn layui-btn-primary date-picker-btn" onclick="datePick(30, this);return false;">近30天</button>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">订单来源</label>
<div class="layui-input-inline">
<select name="order_from">
<option value="">全部</option>
{foreach $order_from_list as $order_from_k => $order_from_v}
<option value="{$order_from_k}">{$order_from_v['name']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" id="btn_search" lay-submit lay-filter="btn_search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="order_tab">
<div class="layui-tab-content">
<div class="order-operation" style="display: none">
<div class="layui-form order-operation-btn all-selected-checkbox">
<div class="order-operation-all-btn">
<input type="checkbox" name="" lay-skin="primary" lay-filter="allCheckbox">
<input type="hidden" name="allOrderId">
</div>
<div class="btn-box">
<span class="btn-deliver">批量发货</span>
<span class="btn-dispatch-bill">打印发货单</span>
{if addon_is_exit('electronicsheet',$user_info.site_id) == 1}
<span class="btn-express-sheet">打印电子面单</span>
{/if}
</div>
</div>
</div>
<!-- 列表 -->
<div id="delivery_list"></div>
</div>
</div>
<div class="order-operation" style="display: none">
<div class="layui-form order-operation-btn all-selected-checkbox">
<div class="order-operation-all-btn">
<input type="checkbox" name="" lay-skin="primary" lay-filter="allCheckbox">
<input type="hidden" name="allOrderId">
</div>
<div class="btn-box">
<span class="btn-deliver">批量发货</span>
<span class="btn-dispatch-bill">打印发货单</span>
{if addon_is_exit('electronicsheet',$user_info.site_id) == 1}
<span class="btn-express-sheet">打印电子面单</span>
{/if}
</div>
</div>
<div id="delivery_page"></div>
</div>
<div id="order_operation"></div>
<script src="SHOP_JS/deliver_lists.js"></script>
<script src="SHOP_JS/lodop_funcs.js"></script>
{include file="order/order_common_action" /}
<!-- 修改订单收货地址 -->
{include file="order/order_action" /}
<!-- 发货 -->
{include file="order/order_delivery_action" /}
<!-- 外卖发货 -->
{include file="localorder/local_order_delivery_action" /}
<!--打印相关-->
{include file="electronicsheet/print_html" /}
<script>
var laypage,element, form;
var is_refresh = false;
var orderDataAll = [];
// 通过hash获取页数
function getHashPage(){
var page = 1;
var hash_arr = getHashArr();
$.each(hash_arr,function(index, itemobj){
var item_arr = itemobj.split("=");
if(item_arr.length == 2){
if(item_arr[0].indexOf("page") != "-1"){
page = item_arr[1];
}
}
});
return page;
}
//从hash中获取数据
function getHashData(){
var hash_arr = getHashArr();
var form_json = {
"end_time" : "",
"order_from" : "",
"order_label" : $("select[name=order_label]").val(),
"order_name" : "",
"order_status" : "",
"pay_type" : "",
"search" : "",
"start_time" : "",
"order_type" : 'all',
"page_size":'',
"page" : "",
};
if(hash_arr.length > 0){
$.each(hash_arr,function(index, itemobj){
var item_arr = itemobj.split("=");
if(item_arr.length == 2){
$.each(form_json,function(key, form_val){
if(item_arr[0].indexOf(key) != "-1"){
form_json[key] = item_arr[1];
}
})
}
})
}
resetOrderStatus(form_json.order_type, 2);
form.val("order_list", form_json);
setOrderStatusTab(form_json.order_status);
return form_json;
}
/**
* 获取哈希值order_type
*/
function getHashOrderType(){
var hash_arr = getHashArr();
var order_type = "all";
if(hash_arr.length > 0){
$.each(hash_arr,function(index, itemobj){
var item_arr = itemobj.split("=");
if(item_arr.length == 2){
if(item_arr[0].indexOf("order_type") != "-1") {
order_type = item_arr[1];
}
}
})
}
return order_type;
}
layui.use(['laypage','laydate','form', 'element'], function(){
form = layui.form;
laypage = layui.laypage;
element = layui.element;
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(btn_search)', function(data){
is_refresh = true;
data.field.page = 1;
resetOrderStatus(data.field.order_type, 2);
setHashOrderList(data.field);
return false;
});
//批量导出
form.on('submit(batch_export)', function(data){
data.field.order_type = 1;
data.field.order_status = 1;
location.href = ns.url("shop/order/exportOrderGoods?request_mode=download",data.field);
return false;
});
//订单类型
form.on('select(order_type)', function(data){
resetOrderStatus(data.value, 1);
return false;
});
//监听Tab切换以改变地址hash值
element.on('tab(order_tab)', function(){
var status = this.getAttribute('lay-id');
form.val("delivery_list", {"order_status":status});
var hash_data = getHashList();
hash_data.order_status = status;
hash_data.page = 1;
setHashOrderList(hash_data);
});
getHashData();
getOrderList();//筛选
});
function setOrderStatusTab(order_status){
$(".layui-tab-title li").removeClass("layui-this");
$(".layui-tab-title li").each(function(){
var status = $(this).attr("lay-id");
if(status == order_status){
$(this).addClass("layui-this")
}
});
}
//重置状态tab 选项卡
function resetOrderStatus(order_type, is_tab){
var hash_order_type = getHashOrderType();
if(hash_order_type != order_type || is_refresh == false){
if(is_tab != 1 || is_refresh == false) {
$(".layui-tab-title li").not(':first').remove();
$(".layui-tab-title li").find(":first").addClass("layui-this");
}
if(is_tab != 2 || is_refresh == false){
$("select[name=order_status] option").not(':first').remove();
}
var status_item = [];
$.each(status_item,function(index, itemobj){
if(is_tab != 1 || is_refresh == false) {
$(".layui-tab-title").append('<li lay-id="' + index + '">' + itemobj + '</li>');
}
if(is_tab != 2 || is_refresh == false) {
$("select[name=order_status]").append('<option value="' + index + '">' + itemobj + '</option>');
}
});
form.render('select');
}
}
//哈希值 订单数据
function setHashOrderList(data){
localStorage.setItem('formSubmit','search'); // 表单搜索标识,防止页面重新加载
var hash = ['url=shop/delivery/lists'];
for (let key in data) {
if (data[key] != '' && data[key] != 'all') {
hash.push(`${key}=${data[key]}`)
}
}
location.hash = hash.join('&');
getOrderList();
}
function getHashList(){
var hash_arr = getHashArr();
var form_json = {
"end_time" : "",
"order_from" : "",
"order_label" : $("select[name=order_label]").val(),
"order_name" : "",
"order_status" : "",
"pay_type" : "",
"search" : "",
"start_time" : "",
"order_type" : 'all',
'page_size':'',
"page" : "",
};
if(hash_arr.length > 0){
$.each(hash_arr,function(index, itemobj){
var item_arr = itemobj.split("=");
if(item_arr.length == 2){
$.each(form_json,function(key, form_val){
if(item_arr[0].indexOf(key) != "-1"){
form_json[key] = item_arr[1];
}
})
}
})
}
return form_json;
}
var laypage_util;
var delivery = new Delivery();
function getOrderList(){
var url = ns.url("shop/delivery/lists", getHashArr().join('&'));
$.ajax({
type : 'get',
dataType: 'json',
url :url,
success : function(res){
if(res.code == 0){
setOrderInfo(res.data.list);
delivery.setData(res.data);
$("#delivery_list").html(delivery.fetch());
form.render();
$(".order-operation").show();
//批量选择
form.on('checkbox(allCheckbox)', function(data){
$(".sub-selected-checkbox input").prop("checked",data.elem.checked);
$(".all-selected-checkbox input").prop("checked",data.elem.checked);
form.render("checkbox");
getOrderId();
});
//全选选择
form.on('checkbox(subCheckbox)', function(data){
var subLen = $(".sub-selected-checkbox input:checked").length;
$(".all-selected-checkbox input").prop("checked",false);
if (subLen == 10){
$(".all-selected-checkbox input").prop("checked",true);
}
form.render("checkbox");
getOrderId();
});
//获取选中的id
function getOrderId(){
var subLen = $(".sub-selected-checkbox input:checked").length,
lists = $(".sub-selected-checkbox input:checked");
orderDataAll = [];
lists.each(function(index,item){
orderDataAll.push(JSON.parse($(item).parents(".sub-selected-checkbox").attr("data-json")));
});
}
laypage_util = new Page({
elem: 'delivery_page',
count: res.data.count,
curr: getHashPage(),
limit:getHashData()['page_size'] || 10,
callback: function(obj){
var hash_data = getHashData();
hash_data.page = obj.curr;
hash_data.page_size = obj.limit;
setHashOrderList(hash_data);
}
});
}else{
layer.msg(res.message);
}
}
});
}
/**
* 七天时间
*/
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 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);
}
//批量发货
$("body").off("click",".order-operation .btn-deliver").on("click",".order-operation .btn-deliver", function () {
var subLen = $(".sub-selected-checkbox input:checked").length;
if (subLen <=0 ) {
layer.msg("请选择订单");
return false;
}
orderBatchDelivery(orderDataAll);
});
/**
* 批量打印发货单
*/
var LODOP; //声明为全局变量
function PrintOneURL(url){
LODOP=getLodop();
if(LODOP) {
LODOP.PRINT_INIT("发货单打印");
LODOP.ADD_PRINT_TBURL(5, 10, "770", "95%", url);
LODOP.SET_PRINT_STYLEA(0, "HOrient", 3);
LODOP.SET_PRINT_STYLEA(0, "VOrient", 3);
LODOP.ADD_PRINT_TEXT(590, 680, 130, 22, "页号:第#页/共&页");
LODOP.SET_PRINT_STYLEA(0, "ItemType", 2);
LODOP.SET_PRINT_STYLEA(0, "Horient", 1);
LODOP.SET_PRINT_STYLEA(0, "Vorient", 1);
LODOP.SET_SHOW_MODE("MESSAGE_GETING_URL", ""); //该语句隐藏进度条或修改提示信息
// LODOP.SET_SHOW_MODE("MESSAGE_PARSING_URL","");//该语句隐藏进度条或修改提示信息
}
}
function dispatchBill(url) {
PrintOneURL(url);
// LODOP.PREVIEW(); //预览
LODOP.PRINT(); //直接打印
}
$("body").off("click",".order-operation .btn-dispatch-bill").on("click",".order-operation .btn-dispatch-bill", function () {
var subLen = $(".sub-selected-checkbox input:checked").length;
if (subLen <=0 ) {
layer.msg("请选择订单");
return false;
}
for (var i = 0; i < orderDataAll.length; i++){
var url = ns.url("shop/printer/batchprintorder",{request_mode: 'download',order_id: orderDataAll[i].order_id});
dispatchBill(url)
}
});
$("body").off("click",".order-operation .btn-express-sheet").on("click",".order-operation .btn-express-sheet", function () {
var subLen = $(".sub-selected-checkbox input:checked").length;
if (subLen <=0 ) {
layer.msg("请选择订单");
return false;
}
var order_id_list = [];
for (var i = 0; i < orderDataAll.length; i++){
order_id_list.push(orderDataAll[i].order_id);
}
printElectronicsheetAction(order_id_list);
});
</script>

View File

@@ -0,0 +1,57 @@
<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="STATIC_EXT/diyview/css/bottom_nav_design.css" />
<div id="bottomNav" class="layui-form">
<div class="preview">
<div class="preview-head">
<span>底部导航</span>
</div>
<div class="preview-block">
<ul v-show="data.list.length>0" :style="{ backgroundColor : data.backgroundColor }">
<li v-for="(item,index) in data.list" @mouseover="mouseOver(index)" @mouseout="mouseOut()" :key="item.id">
<div v-show="data.type == 1 || data.type == 2">
<template v-if="selected == index">
<img v-if="item.selected_icon_type == 'img'" :src="(selected == index ? (item.selectedIconPath? changeImgUrl(item.selectedIconPath) : changeImgUrl('public/static/img/default_img/square.png')) : (item.iconPath? changeImgUrl(item.iconPath) : changeImgUrl('public/static/img/default_img/square.png')) )"/>
<iconfont v-else :icon="selected == index ? item.selectedIconPath : item.iconPath" :value="selected == index ? (item.selected_style ? item.selected_style : null) :(item.style ? item.style : null)"></iconfont>
</template>
<template v-else>
<img v-if="item.icon_type == 'img'" :src="(selected == index ? (item.selectedIconPath? changeImgUrl(item.selectedIconPath) : changeImgUrl('public/static/img/default_img/square.png')) : (item.iconPath? changeImgUrl(item.iconPath) : changeImgUrl('public/static/img/default_img/square.png')) )"/>
<iconfont v-else :icon="selected == index ? item.selectedIconPath : item.iconPath" :value="selected == index ? (item.selected_style ? item.selected_style : null) :(item.style ? item.style : null)"></iconfont>
</template>
</div>
<span :style="{ fontSize : ( data.fontSize + 'px'), color : (selected == index ? data.textHoverColor : data.textColor ) }" v-show="data.type == 1 || data.type == 3">{{ item.text }}</span>
</li>
</ul>
</div>
<div class="custom-save">
<button class="layui-btn save">保存</button>
</div>
</div>
<div class="edit-attribute">
<bottom-menu></bottom-menu>
</div>
</div>
{if condition="$bottom_nav_info"}
<input type="hidden" id="info" value='{:json_encode($bottom_nav_info)}' />
{/if}
<script>
{if condition="$bottom_nav_info"}
var bottomNavInfo = JSON.parse($("#info").val().toString());
{else/}
var bottomNavInfo = null;
{/if}
</script>
<script src="STATIC_JS/vue.js"></script>
{include file="diy/iconfont_component"/}
<script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
<script src="STATIC_EXT/diyview/js/ddsort.js"></script>
<script src="STATIC_EXT/diyview/js/components.js"></script>
<script src="STATIC_EXT/diyview/js/shop_bottom_nav.js?time=20241119"></script>

160
app/shop/view/diy/edit.html Executable file
View File

@@ -0,0 +1,160 @@
<link rel="stylesheet" href="STATIC_EXT/colorPicker/css/colorpicker.css" />
<link rel="stylesheet" href="STATIC_EXT/diyview/css/diyview.css?time=20240316" />
<div class="custom-save js-top-custom-save layui-hide">
<span></span>
<div class="button-group">
<button class="layui-btn save-button save">保存</button>
{notempty name="$diy_view_info"}
<button class="layui-btn" onclick="preview()">预览</button>
{/notempty}
<button class="layui-btn layui-btn-primary cancel-btn">取消</button>
</div>
</div>
<div id="diyView">
<!-- 组件列表 -->
<div class="component-list">
<div class="tab">
<span class="selected">内置组件</span>
<span data-type="EXTEND">第三方组件</span>
</div>
<nav>
{foreach name="$diy_view_utils" item="vo" key="k"}
<h3 data-index="{$k}" data-type="{$vo.type}" {if $vo['type'] == 'EXTEND'}style="display:none;"{/if}><img src="__STATIC__/ext/diyview/img/component_down.png" />{$vo.type_name}</h3>
<ul data-index="{$k}" data-type="{$vo.type}" {if $vo['type'] == 'EXTEND'}style="display:none;"{/if}>
{if $vo['type'] == 'SYSTEM'}
<li title="弹窗广告" @click='changeCurrentIndex(-98)'>
<i class="iconfont icondanchuangguanggao"></i>
<span>弹窗广告</span>
</li>
{/if}
{foreach name="$vo.list" item="li" key="li_k"}
<li title="{$li.title}" data-name="{$li.name}" data-max-count="{$li.max_count}" data-value='{$li.value}' data-is-delete="{$li.is_delete}" data-addon-name="{$li.addon_name}"
{if condition="$li.value"} @click='addComponent({$li.value},{ name : "{$li.name}", title : "{$li.title}", max_count : {$li.max_count}, addon_name : "{$li.addon_name}", is_delete : "{$li.is_delete}" })'
:class="{ 'disabled' : !checkComponentIsAdd('{$li.name}') }"
{else/}class="disabled"{/if}>
<i class="{$li.icon}"></i>
<span>{$li.title}</span>
</li>
{/foreach}
</ul>
{/foreach}
</nav>
</div>
<div class="preview-wrap">
<div class="loading-layer">
<div class="loading-anim">
<div class="box item"><div class="border out item"></div></div>
</div>
</div>
<div class="preview-restore-wrap">
<div class="div-wrap">
<button class="layui-btn layui-btn-primary position-page-btn" @click="changeCurrentIndex(-99)">页面设置</button>
<!-- 快捷操作 -->
<ul class="quick-action">
<!-- <li>-->
<!-- <i class="icondiy icon-system-eye-line"></i>-->
<!-- <span>隐藏</span>-->
<!-- </li>-->
<li @click="moveUpComponent()" :class="{ disabled : ((currentIndex - 1) < 0) }">
<i class="icondiy icon-system-jiantoushang"></i>
<span>上移</span>
</li>
<li @click="moveDownComponent()" :class="{ disabled : ( currentIndex < 0 || data.length === 0 || (currentIndex + 1) === data.length) }">
<i class="icondiy icon-system-jiantouxia"></i>
<span>下移</span>
</li>
<li @click="copyComponent()" :class="{ disabled : ( currentIndex < 0) }">
<i class="icondiy icon-system-file-copy-line"></i>
<span>复制</span>
</li>
<li @click="delComponent(currentIndex)" :class="{ disabled : currentIndex < -1 }">
<i class="icondiy icon-system-delete-bin-6-line"></i>
<span>删除</span>
</li>
<li @click="resetComponent()" :class="{ disabled : ( currentIndex < 0) }">
<i class="icondiy icon-system-loader-4-line"></i>
<span>重置</span>
</li>
</ul>
<div class='diy-view-wrap layui-form' :style="{ backgroundColor : global.pageBgColor,backgroundImage : 'url('+changeImgUrl(global.bgUrl)+')' }">
<div class="preview-head" @click="changeCurrentIndex(-99)">
<!-- 顶部tabbar风格 -->
<tabbar :current-index="currentIndex" :global="global"></tabbar>
<!-- 页面设置 -->
<div class="page-set-wrap" :class="{ selected : currentIndex == -99 }" :data-sort="-99" v-show="data.length == 0 || currentIndex == -99">
<page-set :current-index="currentIndex" :global="global" :global-lazy-load="globalLazyLoad"></page-set>
</div>
</div>
<!-- 弹窗广告 -->
<pop-window :current-index="currentIndex" :global="global" :global-lazy-load="globalLazyLoad"></pop-window>
<div class="preview-block">
<div v-for="(nc,index) in data" :key="nc.id" :data-index="index" :data-id="nc.id" :class="{ 'draggable-element' : true,selected : currentIndex == index }" :data-sort="index">
{foreach name="$diy_view_utils" item="vo"}
{foreach name="$vo.list" item="li"}
<template v-if="nc.componentName == '{$li.name}'">
{:event('DiyViewUtils',[ 'name' => $li['name'], 'addon_name' => $li['addon_name'] ],true)}
</template>
{/foreach}
{/foreach}
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 预览 -->
<template slot="preview"></template>
<div class="custom-save js-bottom-custom-save">
<button class="layui-btn save">保存</button>
{notempty name="$diy_view_info"}
<button class="layui-btn" onclick="preview()">预览</button>
{/notempty}
<button class="layui-btn full-screen-btn">全屏</button>
</div>
</div>
{if condition="!empty($diy_view_info)"}
<input type="hidden" id="id" value="{$diy_view_info.id}">
<input type="hidden" id="info" value='' />
{/if}
<input type="hidden" id="name" value="{$name}" />
<input type="hidden" id="title" value="{$title}" />
<input type="hidden" id="template_id" value="{$template_id}" />
<input type="hidden" id="page_type" value="{$page_type ?? ''}" />
<script>
var requestUrl = '{$request_url}';
var storeIsExit = '{$store_is_exit}';
//直接在隐藏域中写入,有些单引号和双引号会无法解析,导致字符串被截断
$("#info").val(JSON.stringify({php}echo $diy_view_info['value'] ?? '';{/php}));
</script>
<script src="STATIC_JS/vue.js"></script>
<script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
<script src="STATIC_EXT/diyview/js/async_load_css.js"></script>
<script src="STATIC_EXT/diyview/js/ddsort.js"></script>
<script src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"> </script>
<script src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script src="STATIC_EXT/diyview/js/components.js?time=20250312"></script>
<script src="STATIC_EXT/diyview/js/custom_template.js?time=20250312"></script>
{include file="app/shop/view/diy/iconfont_component.html"/}

765
app/shop/view/diy/heat_map.html Executable file
View File

@@ -0,0 +1,765 @@
<style>
.content-box {
position: relative;
width: 600px;
height: 600px;
background-color: rgb(242, 244, 244);
border: 1px dashed #333;
background-size: 100% 100%;
box-sizing: border-box;
}
.box {
width: 100px;
height: 100px;
background-color: rgba(255, 255, 255, 0.7);
border: 1px solid #ccc;
position: absolute;
left: 0px;
top: 0px;
}
.box1, .box2, .box3, .box4 {
width: 10px;
height: 10px;
background-color: #fff;
position: absolute;
border-radius: 50%;
border: 1px solid #333;
}
.box1 {
top: -5px;
left: -5px;
cursor: nw-resize;
}
.box2 {
top: -5px;
right: -5px;
cursor: ne-resize;
}
.box3 {
left: -5px;
bottom: -5px;
cursor: sw-resize;
}
.box4 {
bottom: -5px;
right: -5px;
cursor: se-resize;
}
.heat-map-wrap {
display: flex;
align-items: flex-start;
width: 900px;
margin: 0 auto;
padding: 30px;
}
.heat-map-wrap .area-box {
width: 100px;
height: 100px;
position: absolute;
top: 0;
left: 0;
user-select: none;
cursor: move;
border: 1px solid #ccc;
padding: 5px;
box-sizing: border-box;
}
.heat-map-wrap .manage-wrap {
padding-left: 20px;
}
.heat-map-wrap .manage-wrap h3 {
margin-bottom: 10px;
font-size: 16px;
}
.heat-map-wrap .manage-wrap button {
margin-bottom: 10px;
}
.heat-map-wrap .manage-wrap .list-wrap {
overflow-y: auto;
height: 500px;
}
.heat-map-wrap .manage-wrap .list-wrap .item {
margin-bottom: 16px;
display: flex;
}
.heat-map-wrap .manage-wrap .list-wrap .item label {
width: 80px;
padding-right: 10px;
text-align: right;
}
.heat-map-wrap .manage-wrap .list-wrap .item div span {
cursor: pointer;
}
.heat-map-wrap .manage-wrap .list-wrap .item div i {
cursor: pointer;
margin: 0 10px;
}
</style>
<div class="layui-form heat-map-wrap">
<div class="content-box" id="content_box"><!-- 热区列表 --></div>
<div class="manage-wrap">
<h3>热区管理</h3>
<button class="layui-btn" id="addArea">添加热区</button>
<div class="list-wrap"><!-- 热区列表 --></div>
</div>
</div>
<script type="text/html" id="dragBoxHtml">
{{# for(let i=0;i<d.length;i++){ }}
<div id="box_{{ i }}" class="area-box" style="left:{{ d[i].left }}{{ d[i].unit }};top:{{ d[i].top }}{{ d[i].unit }};width:{{ d[i].width }}{{ d[i].unit }};height:{{ d[i].height }}{{ d[i].unit }}" onmousedown="mouseDown(event,{{ i }})">
<span>{{ i + 1 }}</span>
{{# if(d[i].link.title){ }}
<span class="p-[4px]">|</span>
<span>{{ d[i].link.title }}</span>
{{# } }}
<span class="box1" onmousedown="resizeMouseDown(event,{{ i }})"></span>
<span class="box2" onmousedown="resizeMouseDown(event,{{ i }})"></span>
<span class="box3" onmousedown="resizeMouseDown(event,{{ i }})"></span>
<span class="box4" onmousedown="resizeMouseDown(event,{{ i }})"></span>
</div>
{{# } }}
</script>
<script type="text/html" id="manageHotAreaHtml">
{{# for(let i=0;i<d.length;i++){ }}
<div class="item">
<label>热区{{ i+1 }}</label>
<div>
{{# if(d[i].link.title){ }}
<span data-index="{{i}}" class="text-color">{{ d[i].link.title }}</span>
{{# }else{ }}
<span data-index="{{i}}">选择跳转链接</span>
{{# } }}
<i class="icondiy icon-system-delete-bin-6-line" onclick="deleteHotArea({{i}})"></i>
</div>
</div>
{{# } }}
</script>
<script>
// 热区设置数据
var imageData = JSON.parse(sessionStorage.getItem('imageData'));
var dragBoxArr = [];
var contentBoxWidth = 600;
var contentBoxHeight = 600;
var num = 6;// 每行显示的数量
var laytpl,form,layer;
layui.use(['form','layer','laytpl'], function() {
layer = layui.layer;
laytpl = layui.laytpl;
form = layui.form;
form.render();
if (imageData == null) return;
if (Object.keys(imageData.heatMapData).length) {
dragBoxArr.splice(0, dragBoxArr.length, ...imageData.heatMapData);
} else {
dragBoxArr.splice(0, dragBoxArr.length);
$("#addArea").click();
}
$("#content_box").css({
backgroundImage: "url(" + ns.img(imageData.imageUrl) + ")",
width: contentBoxWidth + 'px',
height: contentBoxHeight + 'px'
});
renderDragBox();
});
// 增加热区
$("#addArea").click(function() {
let left = dragBoxArr.length % num * 100;
let top = Math.floor(dragBoxArr.length / num) * 100;
if (top >= contentBoxWidth) {
top = 0;
left = 0;
}
dragBoxArr.push({
left: left,
top: top,
width: 100,
height: 100,
unit: 'px',
link: {
name: ''
}
});
renderDragBox();
});
// 渲染热区
function renderDragBox() {
laytpl($('#dragBoxHtml').html()).render(dragBoxArr,function(html){
$('#content_box').html(html);
});
laytpl($('#manageHotAreaHtml').html()).render(dragBoxArr,function(html){
$('.heat-map-wrap .manage-wrap .list-wrap').html(html);
});
}
// 选择跳转链接
$('body').off('click','.heat-map-wrap .manage-wrap .list-wrap .item div span').on('click','.heat-map-wrap .manage-wrap .list-wrap .item div span',function () {
let index = $(this).attr('data-index');
dragBoxArr[index].link = dragBoxArr[index].link || {};
ns.select_link(dragBoxArr[index].link, function (data) {
dragBoxArr[index].link = data;
renderDragBox();
});
});
// 删除热区
function deleteHotArea(index) {
dragBoxArr.splice(index,1);
renderDragBox();
}
// 移动事件
function mouseDown(e, index) {
let box = document.getElementById('box_' + index);
let disX = e.clientX - box.offsetLeft;
let disY = e.clientY - box.offsetTop;
//鼠标移动时
document.onmousemove = function (e) {
box.style.left = e.clientX - disX + 'px';
box.style.top = e.clientY - disY + 'px';
//边界判断
if (e.clientX - disX < 0) {
box.style.left = 0;
}
if (e.clientX - disX > contentBoxWidth - box.offsetWidth) {
box.style.left = contentBoxWidth - box.offsetWidth + 'px';
}
if (e.clientY - disY < 0) {
box.style.top = 0;
}
if (e.clientY - disY > contentBoxHeight - box.offsetHeight) {
box.style.top = contentBoxHeight - box.offsetHeight + 'px';
}
dragBoxArr[index].left = box.offsetLeft;
dragBoxArr[index].top = box.offsetTop;
dragBoxArr[index].width = box.offsetWidth;
dragBoxArr[index].height = box.offsetHeight;
dragBoxArr[index].unit = 'px';
};
//鼠标抬起时
document.onmouseup = function (e) {
document.onmousemove = null;
}
}
// 拖拽大小事件
function resizeMouseDown(e,index) {
var oEv = e;
oEv.stopPropagation();
let box = document.getElementById('box_' + index);
let className = e.target.className;
// 获取移动前盒子的宽高,
var oldWidth = box.offsetWidth;
var oldHeight = box.offsetHeight;
// 获取鼠标距离屏幕的left和top值
var oldX = oEv.clientX;
var oldY = oEv.clientY;
// 元素相对于最近的父级定位
var oldLeft = box.offsetLeft;
var oldTop = box.offsetTop;
// 设置最小的宽度
var minWidth = 50;
var minHeight = 50;
document.onmousemove = function (e) {
var oEv = e;
// console.log('move', "width" + oldWidth,
// 'oldLeft: ' + oldLeft, 'oldTop: ' + oldTop,
// 'oldXclientX-- ' + oldX + '' + oEv.clientX,
// 'oldYclientY-- ' + oldY + '' + oEv.clientY,
// )
// 左上角
if (className == "box1") {
let width = oldWidth - (oEv.clientX - oldX);
let maxWidth = contentBoxWidth;
let height = oldHeight - (oEv.clientY - oldY);
let maxHeight = contentBoxHeight - oldTop;
let left = oldLeft + (oEv.clientX - oldX);
let top = oldTop + (oEv.clientY - oldY);
if (width < minWidth) {
width = minWidth
}
if (width > maxWidth) {
width = maxWidth
}
if (height < minHeight) {
height = minHeight
}
if (height > maxHeight) {
height = maxHeight
}
if (oldLeft == 0 && oldTop == 0) {
// 坐标left = 0top = 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值left = 最小宽度top = 最小高度
left = minWidth;
top = minHeight
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值left = 最小宽度top = 不予处理
left = minWidth;
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值left = 不予处理top = 最小高度
top = minHeight
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值left = 不予处理top = 不予处理
}
} else if (oldLeft == 0 && oldTop > 0) {
// 坐标left = 0top > 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值left = 最小宽度top = 元素上偏移位置
left = minWidth;
top = box.offsetTop
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值left = 最小宽度top = 元素上偏移位置
left = minWidth;
top = box.offsetTop;
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值left = 不予处理top = 元素上偏移位置
top = box.offsetTop;
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值left = 不予处理top = 不予处理
}
} else if (oldLeft > 0 && oldTop == 0) {
// 坐标left > 0top = 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值left = 元素左偏移位置top = 元素上偏移位置
left = box.offsetLeft;
top = box.offsetTop;
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值left = 元素左偏移位置top = 0
left = box.offsetLeft;
top = 0;
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值left = 不予处理top = 元素上偏移位置
top = box.offsetTop;
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值left = 不予处理top = 不予处理
}
} else if (oldLeft > 0 && oldTop > 0) {
// 坐标left > 0top > 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值left = 元素左偏移位置top = 元素上偏移位置
left = box.offsetLeft;
top = box.offsetTop
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值left = 元素左偏移位置top = 元素上偏移位置
left = box.offsetLeft;
top = box.offsetTop;
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值left = 不予处理top = 元素上偏移位置
top = box.offsetTop;
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值left = 不予处理top = 不予处理
}
}
//左上 宽
if (left < 0) {
left = 0;
width = oldWidth - (oEv.clientX - oldX) + (oldLeft + (oEv.clientX - oldX));
}
//左上 高
if (top < 0) {
top = 0;
height = oldTop + (oEv.clientY - oldY) + (oldHeight - (oEv.clientY - oldY));
}
box.style.width = width + 'px';
box.style.height = height + 'px';
box.style.left = left + 'px';
box.style.top = top + 'px';
} else if (className == "box2") {
// 右上角
let width = oldWidth + (oEv.clientX - oldX);
let maxWidth = contentBoxWidth - oldLeft;
let height = oldHeight - (oEv.clientY - oldY);
let maxHeight = contentBoxHeight - oldTop;
let top = oldTop + (oEv.clientY - oldY);
if (width < minWidth) {
width = minWidth
}
if (width > maxWidth) {
width = maxWidth
}
if (height < minHeight) {
height = minHeight
}
if (height > maxHeight) {
height = maxHeight
}
if (oldLeft == 0 && oldTop == 0) {
// 坐标left = 0top = 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值top = 最小高度
top = minHeight
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值,不予处理
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值top = 最小高度
top = minHeight
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值,不予处理
}
} else if (oldLeft == 0 && oldTop > 0) {
// 坐标left = 0top > 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值top = 元素上偏移位置
top = box.offsetTop
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值top = 元素上偏移位置
top = box.offsetTop
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值top = 元素上偏移位置
top = box.offsetTop
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值,不予处理
}
} else if (oldLeft > 0 && oldTop == 0) {
// 坐标left = 0top = 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值top = 元素上偏移位置
top = box.offsetTop
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值top = 0
top = 0
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值top = 元素上偏移位置
top = box.offsetTop
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值,不予处理
}
} else if (oldLeft > 0 && oldTop > 0) {
// 坐标left > 0top > 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值top = 元素上偏移位置
top = box.offsetTop
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值top = 元素上偏移位置
top = box.offsetTop
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值top = 元素上偏移位置
top = box.offsetTop
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值,不予处理
}
}
//右上 高
if (top < 0) {
top = 0;
height = oldTop + (oEv.clientY - oldY) + (oldHeight - (oEv.clientY - oldY))
}
box.style.width = width + 'px';
box.style.height = height + 'px';
box.style.top = top + 'px';
} else if (className == "box3") {
// 左下角
let width = oldWidth - (oEv.clientX - oldX);
let maxWidth = contentBoxWidth;
let height = oldHeight + (oEv.clientY - oldY);
let maxHeight = contentBoxHeight - oldTop;
let left = oldLeft + (oEv.clientX - oldX);
if (width < minWidth) {
width = minWidth
}
if (width > maxWidth) {
width = maxWidth
}
if (height < minHeight) {
height = minHeight
}
if (height > maxHeight) {
height = maxHeight
}
if (oldLeft == 0 && oldTop == 0) {
// 坐标left = 0top = 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值left = 最小宽度
left = minWidth;
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值left = 最小宽度
left = minWidth;
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值,不予处理
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值,不予处理
}
} else if (oldLeft == 0 && oldTop > 0) {
// 坐标left = 0top > 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值left = 最小宽度
left = minWidth;
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值left = 最小宽度
left = minWidth;
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值,不予处理
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值,不予处理
}
} else if (oldLeft > 0 && oldTop == 0) {
// 坐标left > 0top = 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值left = 元素左偏移位置
left = box.offsetLeft;
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值left = 元素左偏移位置
left = box.offsetLeft;
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值,不予处理
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值,不予处理
}
} else if (oldLeft > 0 && oldTop > 0) {
// 坐标left > 0top > 0
if (width == minWidth && height == minHeight) {
// 宽高 = 最小值left = 元素左偏移位置
left = box.offsetLeft;
} else if (width == minWidth && height > minHeight) {
// 宽 = 最小值,高 > 最小值left = 元素左偏移位置
left = box.offsetLeft;
} else if (width > minWidth && height == minHeight) {
// 宽 > 最小值,高 = 最小值,不予处理
} else if (width > minWidth && height > minHeight) {
// 宽 > 最小值,高 > 最小值,不予处理
}
}
if (left < 0) {
left = 0;
width = oldWidth - (oEv.clientX - oldX) + (oldLeft + (oEv.clientX - oldX));
}
box.style.width = width + 'px';
box.style.height = height + 'px';
box.style.left = left + 'px';
} else if (className == "box4") {
// 右下角
let width = oldWidth + (oEv.clientX - oldX);
let maxWidth = contentBoxWidth - oldLeft;
let height = oldHeight + (oEv.clientY - oldY);
let maxHeight = contentBoxHeight - oldTop;
if (width < minWidth) {
width = minWidth
}
if (width > maxWidth) {
width = maxWidth
}
if (height < minHeight) {
height = minHeight
}
if (height > maxHeight) {
height = maxHeight
}
box.style.width = width + 'px';
box.style.height = height + 'px';
}
dragBoxArr[index].left = box.offsetLeft;
dragBoxArr[index].top = box.offsetTop;
dragBoxArr[index].width = box.offsetWidth;
dragBoxArr[index].height = box.offsetHeight;
dragBoxArr[index].unit = 'px';
};
// 鼠标抬起时
document.onmouseup = function () {
document.onmousemove = null;
document.onmouseup = null;
}
}
//获取操作结果
function heatMapListener(callback){
var isOk = true;
for (let i = 0; i < dragBoxArr.length; i++) {
if (!dragBoxArr[i].link.title) {
layer.msg('请选择热区'+ (i + 1) + '的链接地址');
isOk = false;
break;
}
}
if (!isOk) return;
dragBoxArr.forEach((item, index) => {
var box = document.getElementById('box_' + index);
item.width = parseFloat(box.offsetWidth / contentBoxWidth * 100).toFixed(2);
item.height = parseFloat(box.offsetHeight / contentBoxHeight * 100).toFixed(2);
item.left = parseFloat(box.offsetLeft / contentBoxWidth * 100).toFixed(2);
item.top = parseFloat(box.offsetTop / contentBoxHeight * 100).toFixed(2);
item.unit = '%';
});
imageData.heatMapData = dragBoxArr;
if(typeof callback == 'function'){
callback(imageData);
}
}
</script>

View File

@@ -0,0 +1,47 @@
<style>
.icon-img-box{
width: 48px;
height: 48px;
margin: 0 auto;
box-sizing: border-box;
overflow: hidden;
}
.icon-img-box img{
width: 40px;
max-height: 40px;
}
</style>
<div id="{$id}">
<div class="icon-img-box" v-if="myData.iconType == 'img'">
<img :src="changeImgUrl(myData.imageUrl) || changeImgUrl('public/static/img/default_img/square.png')" alt="">
</div>
<div class="icon-img-box" v-if="myData.iconType == 'icon'" style="font-size: 36px">
<iconfont v-if="myData.icon" :icon="myData.icon" :value="(myData.style ? myData.style : null)"></iconfont>
</div>
</div>
<script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
<script src="STATIC_JS/vue.js"></script>
{include file="diy/iconfont_component"/}
<script>
var vue,data;
data = {:json_encode($data)};
data = JSON.parse(data);
vue = new Vue({
el: "#{$id}",
data: {
myData:{}
},
created(){
this.myData = data;
},
methods: {
changeImgUrl: function (url) {
if (url == null || url === "") return '';
if (url.indexOf("static/img/") > -1) return ns.img(ns_url.staticImg + "/" + url.replace("public/static/img/", ""));
else return ns.img(url);
},
}
})
</script>

342
app/shop/view/diy/icon_style.html Executable file
View File

@@ -0,0 +1,342 @@
<style>
.layui-form {
padding: 15px;
}
.icon-block {
width: 60px;
height: 60px;
font-size: 60px;
border: 1px dashed #eee;
}
.main-icon {
width: 100px;
height: 100px;
font-size: 100px;
}
.icon-block .icon {
width: inherit;
height: inherit;
font-size: 100%;
color: #000;
display: flex;
align-items: center;
justify-content: center;
}
.icon-block .js-icon {
font-size: 50%;
line-height:1;
}
.icon-block .js-icon.gradient {
-webkit-background-clip:text!important;
-webkit-text-fill-color:transparent;
}
.icon-style {
display: flex;
flex-wrap: wrap;
}
.icon-style .icon-block {
margin: 0 10px 10px 0;
cursor: pointer;
}
.icon-style .no-style .icon {
color: #eee;
}
.icon-style .active, .icon-style .icon-block:hover {
border-color: var(--base-color);
}
.title {
font-weight: bold;
margin-bottom: 10px;
padding-left: 10px;
border-left: 2px solid var(--base-color);
line-height: 1;
margin-left: 10px;
}
.slide-wrap {
display: flex;
align-items: center;
padding-left: 10px;
}
.slide-wrap > div {
flex: 1;
}
.icon-color {
display: flex;
}
.icon-color .color-item {
border: 2px solid #d7d7d7;
width: 20px;
height: 20px;
border-radius: 50%;
margin-right: 10px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.icon-color .color-item .js-icon {
font-size: 12px;
color: #aaa;
}
.icon-color .color-item.disabled {
cursor: not-allowed;
}
.icon-color .color-item.disabled .js-icon {
color: #eee;
border-color: #eee;
}
.flexbox-fix-btn .btn {
margin: 0px;
line-height: 18px;
font-size: 12px;
}
</style>
<div id="app" class="layui-form icon-style-set">
<div class="layui-form-item">
<label class="layui-form-label">图标:</label>
<div class="layui-input-block icon-block main-icon">
<div class="icon" :style="iconBgStyle">
<i class="js-icon {$icon}" :class="{gradient: style.iconColor.length > 1}" :style="iconStyle"></i>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图标风格:</label>
<div class="layui-input-block icon-style">
<div class="icon-block no-style" :class="{active: styleIndex == -1}" title="无风格" @click="selectStyle(-1)">
<div class="icon">
<i class="iconfont iconzhuanliwuxiao"></i>
</div>
</div>
<div class="icon-block" :class="{active: styleIndex == index}" v-for="(item, index) in styleList" :key="index" @click="selectStyle(index)">
<iconfont icon="{$icon}" :value="item"></iconfont>
</div>
</div>
</div>
<div class="title">图标设置</div>
<div class="layui-form-item">
<label class="layui-form-label">背景颜色</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="icon-color">
<div class="color-item" :id="'iconBgColor' + index" v-show="style.iconBgColor[index]" :style="{background: style.iconBgColor[index] ?? '#fff'}" v-for="(item, index) in 6" :key="index"></div>
<div class="color-item" :class="{disabled: style.iconBgColor.length >= 6}" @click="addColor('iconBgColor')">
<i class="iconfont iconjia"></i>
</div>
</div>
</div>
</div>
<div class="layui-form-item" v-show="style.iconBgColor.length > 1">
<label class="layui-form-label">渐变角度</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="icon-bgcolor-deg"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">圆角大小</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="bg-radius"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图标大小</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="font-size"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图标颜色</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="icon-color">
<div class="color-item" :id="'iconColor' + index" v-show="style.iconColor[index]" :style="{background: style.iconColor[index] ?? '#fff'}" v-for="(item, index) in 6" :key="index"></div>
<div class="color-item" :class="{disabled: style.iconColor.length >= 6}" @click="addColor('iconColor')">
<i class="iconfont iconjia"></i>
</div>
</div>
</div>
</div>
<div class="layui-form-item" v-show="style.iconColor.length > 1">
<label class="layui-form-label">渐变角度</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="icon-color-deg"></div>
</div>
</div>
</div>
<script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
<script src="STATIC_JS/vue.js"></script>
{include file="diy/iconfont_component"/}
<script>
var form,slider,colorpicker,vue,_colorPicker = {};
layui.use(['form', 'slider', 'colorpicker'], function() {
form = layui.form;
slider = layui.slider;
colorpicker = layui.colorpicker;
vue = new Vue({
el: "#app",
data: {
style: {
fontSize: 50,
iconBgColor: [],
iconBgColorDeg: 0,
iconBgImg: '',
bgRadius: 0,
iconColor: ['#000'],
iconColorDeg: 0,
},
styleIndex: -1,
styleList:{:json_encode($icon_style)}
},
methods: {
addColor(key) {
if (this.style[key].length >= 6) return;
this.style[key].push('#fff');
},
colorRender(id, color, callback){
if (_colorPicker[id]) {
_colorPicker[id].setColorByInput(color);
return;
}
_colorPicker[id] = Colorpicker.create({
el: id,
color: color,
change: function (elem, hex) {
callback(hex, elem)
}
});
},
updateArray(key){
this.style[key].push('')
this.style[key].pop()
},
selectStyle(index){
this.styleIndex = index;
if (index == -1) {
this.style = {
fontSize: 50,
iconBgColor: [],
iconBgColorDeg: 0,
iconBgImg: '',
bgRadius: 0,
iconColor: ['#000'],
iconColorDeg: 0,
}
} else {
this.style = ns.deepclone(this.styleList[index]);
}
var self = this;
setTimeout(function () {
self.style.iconBgColor.forEach(function (item, index) {
self.colorRender('iconBgColor' + index, self.style.iconBgColor[index])
})
self.style.iconColor.forEach(function (item, index) {
self.colorRender('iconColor' + index, self.style.iconColor[index])
})
})
},
img(src){
return ns.img(src);
}
},
mounted(){
if (localStorage.getItem('iconStyle')) this.style = JSON.parse(localStorage.getItem('iconStyle'));
var self = this;
slider.render({
elem: '.icon-style-set .font-size',
input: true,
value: self.style.fontSize,
min: 10,
max: 100,
change: function (value) {
self.style.fontSize = value;
}
});
slider.render({
elem: '.icon-style-set .icon-color-deg',
input: true,
max: 360,
value: self.style.iconColorDeg,
change: function (value) {
self.style.iconColorDeg = value;
}
});
slider.render({
elem: '.icon-style-set .icon-bgcolor-deg',
input: true,
max: 360,
value: self.style.iconBgColorDeg,
change: function (value) {
self.style.iconBgColorDeg = value;
}
});
slider.render({
elem: '.icon-style-set .bg-radius',
input: true,
value: self.style.bgRadius,
max: 50,
change: function (value) {
self.style.bgRadius = value;
}
});
setTimeout(function () {
for (var index = 0; index < 6; index++) {
self.colorRender('iconBgColor' + index, self.style.iconBgColor[index] ? self.style.iconBgColor[index] : '', function (color, elem) {
var _index = $(elem).index();
self.style.iconBgColor[_index] = color;
self.updateArray('iconBgColor')
})
self.colorRender('iconColor' + index, self.style.iconColor[index] ? self.style.iconColor[index] : '', function (color, elem) {
var _index = $(elem).index();
self.style.iconColor[_index] = color;
self.updateArray('iconColor')
})
}
})
},
computed: {
iconBgStyle(){
var style = {
'border-radius': this.style.bgRadius + '%',
'background': ''
};
if (this.style.iconBgImg) style['background'] += 'url('+ this.img(this.style.iconBgImg) +') no-repeat bottom / contain'
if (this.style.iconBgColor.length) {
if (style.background) style.background += ',';
if (this.style.iconBgColor.length == 1) {
style.background += this.style.iconBgColor[0];
} else {
style['background'] += 'linear-gradient('+ this.style.iconBgColorDeg +'deg, '+ this.style.iconBgColor.join(',') +')';
}
}
return style;
},
iconStyle(){
var style = {
fontSize: this.style.fontSize + '%'
}
if (this.style.iconColor.length == 1) {
style.color = this.style.iconColor[0];
} else {
style['background'] = 'linear-gradient('+ this.style.iconColorDeg +'deg, '+ this.style.iconColor.join(',') +')';
}
return style;
}
}
})
})
function iconStyleListener(callback) {
var data = ns.deepclone(vue._data.style);
callback(data);
}
</script>

128
app/shop/view/diy/iconfont.html Executable file
View File

@@ -0,0 +1,128 @@
<style>
.iconfont-wrap{display: flex;margin-top: 10px;border-bottom: 1px solid #f1f1f1;}
.iconfont-wrap .iconfont-left{padding: 10px 15px;width: 155px;height:429px; box-sizing: border-box;overflow-y: auto;}
.iconfont-wrap .iconfont-left::-webkit-scrollbar{width: 4px;}
.iconfont-wrap .iconfont-left::-webkit-scrollbar-track{background: rgb(179, 177, 177);border-radius: 10px;}
.iconfont-wrap .iconfont-left::-webkit-scrollbar-thumb{background: rgb(136, 136, 136);border-radius: 10px;}
.iconfont-wrap .iconfont-left::-webkit-scrollbar-thumb:hover{background: rgb(100, 100, 100);border-radius: 10px;}
.iconfont-wrap .iconfont-left::-webkit-scrollbar-thumb:active{background: rgb(68, 68, 68);border-radius: 10px;}
.iconfont-wrap .iconfont-left li{height: 32px;line-height: 32px;padding: 0 10px;margin-bottom: 9px;box-sizing: border-box;border: 1px solid #f1f1f1;border-radius: 3px;cursor: pointer;}
.iconfont-wrap .iconfont-left li.active{color: var(--base-color);border-color: var(--base-color);}
.iconfont-wrap .iconfont-left li:last-child{margin-bottom: 0;}
.iconfont-wrap .iconfont-right{flex: 1;border-left: 1px solid #f1f1f1;}
.iconfont-wrap .iconfont-right ul{padding: 0 10px;display: flex;flex-wrap: wrap;align-content: baseline;box-sizing: border-box;}
.iconfont-wrap .iconfont-right li{margin: 6px 12px;display: flex;justify-content: center;align-items: center;width: 60px;height: 60px;border: 1px solid #f1f1f1;border-radius: 5px;cursor: pointer;}
.iconfont-wrap .iconfont-right li span{font-size: 30px;}
.iconfont-wrap .iconfont-right li .icon{width: 40px;height: 40px;vertical-align: -0.15em;fill: currentColor;overflow: hidden;}
.iconfont-wrap .iconfont-right li:hover, .iconfont-wrap .iconfont-right li.active{color: var(--base-color);border-color: var(--base-color);}
.iconfont-wrap .iconfont-right .empty{text-align: center;padding: 20px;}
#iconPage{padding-right: 30px;text-align: right;}
</style>
<div class="iconfont-wrap">
<ul class="iconfont-left">
<li data-value="">全部</li>
{foreach name="$icon_type" item="vo" key="k"}
<li data-value="{$k}" {if $k == 'icon-system'}class="active"{/if}>{$vo}</li>
{/foreach}
</ul>
<div class="iconfont-right">
<div class="list-wrap"></div>
<div id="iconPage"></div>
</div>
</div>
<script id="iconTemplate" type="text/html">
{{# if(d.list.length){ }}
<ul>
{{# layui.each(d.list, function(index, item){ }}
<li data-icon="{{item}}" class="{{item == '{$icon}' && 'active'}}">
<span class="{{item}}"></span>
</li>
{{# }); }}
</ul>
{{# }else{ }}
<div class="empty">无数据</div>
{{# } }}
</script>
<!--<script src="https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.js"></script>-->
<script>
window.Page2 = {
limit: 45
}
var laypage, laytpl, currPage = 1, iconData = [],currIcon="";
layui.use(['laypage','laytpl'], function(){
laypage = layui.laypage;
laytpl = layui.laytpl;
getIconData('icon-system'); //默认查询系统
});
// 获取iconfont数据
function getIconData(type) {
$.ajax({
type: 'post',
url: ns.url("shop/diy/iconfont"),
data: {type: type, site_id: ns_url.siteId, app_module: ns_url.appModule},
dataType: 'JSON',
success: function (res) {
if (res.code >= 0) {
iconData = res.data;
currPage = 1;
renderTemplate(iconData);
if(iconData.length>0) {
$("#iconPage").show();
laypage.render({
elem: 'iconPage',
count: iconData.length, //数据总数,从服务端得到
limit: window.Page2.limit,
jump: function (obj, first) {
//obj包含了当前分页的所有参数比如
currPage = obj.curr;
//首次不执行
if (!first) {
renderTemplate(iconData);
}
}
});
}else{
$("#iconPage").hide();
}
}
}
});
}
// 渲染模版
function renderTemplate(data){
var iconPagingData = data.filter((item,index) => {
if((currPage-1)*window.Page2.limit < (index+1) && (index+1) <= currPage*window.Page2.limit){
return item;
}
});
var getTpl = $("#iconTemplate").html();
laytpl(getTpl).render({list: iconPagingData}, function(html){
$(".iconfont-wrap .iconfont-right .list-wrap").html(html);
});
}
// 图标分类
$('.iconfont-left li').click(function () {
$(this).addClass('active').siblings().removeClass('active');
var type = $(this).attr('data-value');
getIconData(type);
});
$("body").off("click",".iconfont-wrap .iconfont-right li").on("click",".iconfont-wrap .iconfont-right li",function(){
$(this).addClass("active").siblings().removeClass("active");
currIcon = $(this).attr("data-icon");
window.currIcon = currIcon;
});
function selectIconListener(callback) {
if (typeof callback == "function") callback(currIcon);
}
</script>

View File

@@ -0,0 +1,82 @@
<template id="iconfont">
<div class="icon-wrap" :style="iconBgStyle">
<i class="js-icon" :class="iconClass" :style="iconStyle"></i>
</div>
</template>
<style>
.icon-wrap {
width: inherit;
height: inherit;
font-size: 100%;
color: #000;
display: flex;
align-items: center;
justify-content: center;
}
.icon-wrap .js-icon {
font-size: 50%;
line-height:1;
}
.icon-wrap .js-icon.gradient {
-webkit-background-clip:text!important;
-webkit-text-fill-color:transparent;
}
</style>
<script>
Vue.component('iconfont', {
props: {
icon: {
type: String,
default: ''
},
value: {
type: Object,
default: function () {
return null;
}
}
},
computed: {
iconClass(){
var _class = ' ' + this.icon;
if (this.value && this.value.iconColor.length > 1) _class += ' gradient';
return _class;
},
iconBgStyle(){
if (!this.value) return {};
var style = {
'border-radius': this.value.bgRadius + '%',
'background': ''
};
if (this.value.iconBgImg) style['background'] += 'url('+ ns.img(this.value.iconBgImg) +') no-repeat bottom / contain'
if (this.value.iconBgColor.length) {
if (style.background) style.background += ',';
if (this.value.iconBgColor.length == 1) {
style.background += this.value.iconBgColor[0];
} else {
style['background'] += 'linear-gradient('+ this.value.iconBgColorDeg +'deg, '+ this.value.iconBgColor.join(',') +')';
}
}
return style;
},
iconStyle(){
if (!this.value) return {};
var style = {
fontSize: this.value.fontSize + '%'
}
if (this.value.iconColor.length == 1) {
style.color = this.value.iconColor[0];
} else {
style['background'] = 'linear-gradient('+ this.value.iconColorDeg +'deg, '+ this.value.iconColor.join(',') +')';
}
return style;
}
},
template: '#iconfont'
})
</script>

311
app/shop/view/diy/link.html Executable file
View File

@@ -0,0 +1,311 @@
<style>
.link-box{font-size:12px;margin-top: 10px;}
.link-box .link-center{display:flex;height:480px}
.link-box .link-left{overflow-y:auto;width:138px;height:100%;border-right:1px solid #f2f2f2}
.link-box .link-left::-webkit-scrollbar{display: none;}
.link-box .link-left dt{position:relative;padding-left:15px;height:32px;line-height:32px;cursor:pointer;transition:all .3s}
.link-box .link-left dt.triangle:after{content:'';position:absolute;left:0;top:51%;transform:translateY(-50%);border:4px solid transparent;border-right-color:#333;border-bottom-color:#333;cursor:pointer}
.link-box .link-left dt.active:after{transform:translateY(-50%) rotate(-45deg)}
.link-box .link-left dd{margin-right:25px;padding-left:25px;height:32px;line-height:32px;color:#666;cursor:pointer}
.link-box .link-left dd:hover{background-color:#f2f2f2}
.link-box .link-right{overflow-y:auto;height:100%;flex:1;padding-left:20px;display: none;}
.link-box .link-right dl{overflow:hidden;display: none;}
.link-box .link-right dt{height:40px;line-height:40px}
.link-box .link-right dd{float:left;margin:5px 5px 5px 0;padding:0 16px;border:1px solid #ededed;border-radius:3px;line-height:30px;color:#666;cursor:pointer}
.link-btn{position: relative;top: 10px;padding-top: 10px;margin-top:20px;padding-right:10px;height:45px;line-height:45px;text-align:right;border-top:1px solid #f2f2f2}
.goods-category-list .layui-table td {border-left: 0;border-right: 0;}
.goods-category-list .layui-table .switch {font-size: 16px;cursor: pointer;width: 12px;line-height: 1;display: inline-block;text-align: center;vertical-align: middle;}
.goods-category-list .layui-table img {width: 40px;}
.layui-layer-page .layui-layer-btn{padding: 0;}
</style>
<div class="link-box">
<div class="link-center">
<div class="link-left">
{foreach $list as $k => $link}
<dl>
<dt data-name="{$link.name}" {notempty name='$link.child_list'}class="triangle"{/notempty}>{$link.title}</dt>
{foreach $link.child_list as $child_k => $child_link}
<dd data-name="{$child_link.name}" {if !empty($select_link) && !empty($select_link.parent) && $select_link.parent == $child_link.name }class="text-color"{/if}>{$child_link.title}</dd>
{/foreach}
</dl>
{/foreach}
</div>
<div class="link-right js-system">
{foreach $list as $k => $link}
{foreach $link.child_list as $second_k => $second_link}
{notempty name="$second_link.child_list"}
{foreach $second_link.child_list as $third_k => $third_link}
<dl data-parent="{$third_link.parent}">
<dt>{$third_link.title}</dt>
{notempty name="$third_link.child_list"}
{foreach $third_link.child_list as $four_k => $four_link}
<dd data-name="{$four_link.name}" data-wap-url="{$four_link.wap_url}" {if !empty($select_link) && isset($select_link.name) && $select_link.name == $four_link.name }class="border-color text-color"{/if}>{$four_link.title}</dd>
{/foreach}
{/notempty}
</dl>
{/foreach}
{/notempty}
{/foreach}
{/foreach}
</div>
<div class="link-right js-extend"></div>
</div>
<div class="link-btn">
<button class="layui-btn link-save">确定</button>
<button class="layui-btn link-eliminate layui-btn-primary">清空</button>
<button class="layui-btn link-cancel layui-btn-primary">取消</button>
</div>
</div>
<!-- 商品分类 -->
<script type="text/html" id="goodsCategoryHtml">
<div class="goods-category-list layui-form">
<table class="layui-table">
<colgroup>
<col width="5%">
<col width="3%">
<col width="34%">
<col width="33%">
<col width="25%">
</colgroup>
<thead>
<tr>
<th></th>
<th></th>
<th>分类名称</th>
<th>简称</th>
<th>图片</th>
</tr>
</thead>
<tbody>
{if condition="$category_list"}
{foreach name="$category_list" item="vo"}
<tr class='category-line'>
<td><input type="checkbox" name="category_id" lay-skin="primary" data-category-name="{$vo['category_name']}" value="{$vo['category_id']}" lay-filter="category_id" {if !empty($select_link.category_id) && $select_link.category_id == $vo['category_id']}checked{/if}></td>
<td>
{notempty name="$vo['child_list']"}
<span class="switch text-color js-switch" data-category-id="{$vo['category_id']}" data-operation="off">+</span>
{/notempty}
</td>
<td>{$vo['category_name']}</td>
<td>{$vo['short_name']}</td>
<td>
{notempty name="$vo['image']"}
<div class="img-box">
<img layer-src src="{:img($vo['image'])}"/>
</div>
{/notempty}
</td>
</tr>
{notempty name="$vo['child_list']"}
{foreach name="$vo['child_list']" item="second"}
<tr class='category-line' data-pid="{$second['pid']}" style="display:none;">
<td><input type="checkbox" name="category_id" lay-skin="primary" data-category-name="{$second['category_name']}" lay-filter="category_id" value='{$second['category_id']}' {if !empty($select_link.category_id) && $select_link.category_id == $second['category_id']}checked{/if}></td>
<td></td>
<td style="padding-left: 30px;">
{notempty name="$second['child_list']"}
<span class="switch text-color js-switch" data-category-id="{$second['category_id']}" data-operation="off" style="padding-right: 20px;">+</span>
{/notempty}
<span>{$second['category_name']}</span>
</td>
<td>{$second['short_name']}</td>
<td>
{notempty name="$second['image']"}
<div class="img-box">
<img layer-src src="{:img($second['image'])}"/>
</div>
{/notempty}
</td>
</tr>
{notempty name="$second['child_list']"}
{foreach name="$second['child_list']" item="third"}
<tr class='category-line' data-pid="{$third['pid']}" style="display:none;">
<td><input type="checkbox" name="category_id" lay-skin="primary" data-category-name="{$third['category_name']}" lay-filter="category_id" value='{$third['category_id']}' {if !empty($select_link.category_id) && $select_link.category_id == $third['category_id']}checked{/if}></td>
<td></td>
<td style="padding-left: 80px;">
<span>{$third['category_name']}</span>
</td>
<td>{$third['short_name']}</td>
<td>
{notempty name="$third['image']"}
<div class="img-box">
<img layer-src src="{:img($third['image'])}"/>
</div>
{/notempty}
</td>
</tr>
{/foreach}
{/notempty}
{/foreach}
{/notempty}
{/foreach}
{else/}
<tr>
<td colspan="5" style="text-align: center">无数据</td>
</tr>
{/if}
</tbody>
</table>
</div>
</script>
<script type="text/html" id="goodsCategoryPageHtml">
<div class="goods-category-list layui-form">
<table class="layui-table">
<colgroup>
<col width="5%">
<col width="34%">
<col width="33%">
<col width="25%">
</colgroup>
<thead>
<tr>
<th></th>
<th>分类名称</th>
<th>简称</th>
<th>图片</th>
</tr>
</thead>
<tbody>
{if condition="$category_list"}
{foreach name="$category_list" item="vo"}
<tr class='category-line'>
<td><input type="checkbox" name="category_id" lay-skin="primary" data-category-name="{$vo['category_name']}" value="{$vo['category_id']}" lay-filter="category_id" {if !empty($select_link.category_id) && $select_link.category_id == $vo['category_id']}checked{/if}></td>
<td>{$vo['category_name']}</td>
<td>{$vo['short_name']}</td>
<td>
{notempty name="$vo['image']"}
<div class="img-box">
<img layer-src src="{:img($vo['image'])}"/>
</div>
{/notempty}
</td>
</tr>
{/foreach}
{else/}
<tr>
<td colspan="5" style="text-align: center">无数据</td>
</tr>
{/if}
</tbody>
</table>
</div>
</script>
{if(addon_is_exit('cardservice'))}
<!-- 服务分类 -->
<script type="text/html" id="serviceCategoryHtml">
<div class="goods-category-list layui-form">
<table class="layui-table">
<colgroup>
<col width="8%">
<col width="46%">
<col width="46%">
</colgroup>
<thead>
<tr>
<th></th>
<th>分类名称</th>
<th>图片</th>
</tr>
</thead>
<tbody>
{if condition="$service_category_list"}
{foreach name="$service_category_list" item="vo"}
<tr class='category-line'>
<td><input type="checkbox" name="service_category_id" lay-skin="primary" data-category-name="{$vo['category_name']}" value="{$vo['category_id']}" lay-filter="service_category_id" {if !empty($select_link.service_category_id) && $select_link.service_category_id == $vo['category_id']}checked{/if}></td>
<td>{$vo['category_name']}</td>
<td>
{notempty name="$vo['image']"}
<div class="img-box">
<img layer-src src="{:img($vo['image'])}"/>
</div>
{/notempty}
</td>
</tr>
{/foreach}
{else/}
<tr>
<td colspan="3" style="text-align: center">无数据</td>
</tr>
{/if}
</tbody>
</table>
</div>
</script>
{/if}
<script type="text/html" id="goods_info">
<div class="table-title">
<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" title="{{d.goods_name}}">{{d.goods_name}}</a>
</div>
</div>
</script>
<!--自定义链接-->
<script type="text/html" id="customHtml">
<div class="layui-form custom-link">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-inline">
<input type="text" name="title" value="{{ d.title ? d.title : '' }}" placeholder="请输入链接名称" class="layui-input len-mid" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input type="text" name="wap_url" value="{{ d.wap_url ? d.wap_url : '' }}" placeholder="请输入跳转路径" class="layui-input len-mid" autocomplete="off">
</div>
<div class="word-aux mid">路径必须以/开头/pages/index/index</div>
<div class="word-aux mid">跳转外部链接/开头https://baidu.com</div>
</div>
</div>
</script>
<!--跳转小程序-->
<script type="text/html" id="appletHtml">
<div class="layui-form other-applet">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span>AppID</label>
<div class="layui-input-inline">
<input type="text" name="appid" value="{{ d.appid ? d.appid : '' }}" class="layui-input len-mid" placeholder="请输入要打开的小程序的appid" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">小程序路径</label>
<div class="layui-input-block">
<input type="text" name="page" value="{{ d.page ? d.page : '' }}" class="layui-input len-mid" placeholder="请输入要打开的小程序路径" autocomplete="off">
</div>
<div class="word-aux mid">仅支持小程序之间的跳转不支持从其他渠道跳转小程序</div>
<div class="word-aux mid">小程序路径如果为空则跳转到小程序首页</div>
<div class="word-aux mid">小程序路径格式如page/index/index</div>
</div>
</div>
</script>
<!--拨打手机号-->
<script type="text/html" id="mobileHtml">
<div class="layui-form call-mobile">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-inline">
<input type="text" name="mobile" value="{{ d.mobile ? d.mobile : '' }}" class="layui-input len-mid" placeholder="请输入电话号码">
</div>
</div>
<div class="word-aux mid">电话号码支持手机号码和固定电话</div>
</div>
</script>
<script>
var selectLink = {:json_encode($select_link)};
</script>
<script src="STATIC_EXT/diyview/js/link.js?v=1.1"></script>

481
app/shop/view/diy/lists.html Executable file
View File

@@ -0,0 +1,481 @@
<style>
.layui-table-view td:last-child>div{overflow: inherit;}
.operation-wrap{position: relative;}
.layui-table-box{overflow: inherit;}
.layui-table-body{overflow: inherit;}
.set-home{display:inline-block;margin-left: 5px;padding: 3px;font-size: 12px;line-height: 1;color: #fff;}
.popup-qrcode-wrap{text-align: center;background: #fff;border-radius: 2px;box-shadow: 0 2px 8px 0 rgba(200,201,204,.5);padding: 10px;position: absolute;z-index: 1;top: -73px;left: -180px;display: none;width: 170px;height: 230px;}
.popup-qrcode-wrap:before, .popup-qrcode-wrap:after {left: 100%;top: 50%;border: solid transparent;content: " ";height: 0;width: 0;position: absolute;pointer-events: none;}
.popup-qrcode-wrap:before {border-color: transparent;border-left-color: #e5e5e5;border-width: 8px;margin-top: -29px;}
.popup-qrcode-wrap:after {border-color: transparent;border-left-color: #ffffff;border-width: 7px;margin-top: -31px;}
.popup-qrcode-wrap img{width: 150px;height: 150px;max-width: initial;}
.popup-qrcode-wrap p{font-size: 12px;margin: 5px 0;line-height: 1.8!important;}
.popup-qrcode-wrap a{font-size: 12px;}
.popup-qrcode-wrap input{opacity: 0;position: absolute;}
.popup-qrcode-wrap .popup-qrcode-loadimg {width: 16px!important; height: 16px!important; margin-top: 107px;}
.edit-sort.len-short{width: 100px !important;}
.use{
display: inline-block;
line-height: 20px;
}
.unused{
display: inline-block;
line-height: 20px;
}
.custom-tag{
display: inline-block;
line-height: 20px;
}
.select-page{
display: flex;
flex-wrap: nowrap;
justify-content: center;
text-align: center;
}
.select-page .item {position: relative;margin-right: 30px;padding: 10px;width: 200px;height: 390px;cursor: pointer;overflow: hidden;box-sizing: border-box;border: 1px solid #e9edef;}
.select-page .item:last-child{margin-right: 0;}
.select-page .item .checked {position: absolute;bottom: -1px;right: -1px;z-index: 101;font-size: 30px;display: none;}
.select-page .item .mask{position: absolute;background: -webkit-gradient(linear, left top, left bottom, color-stop(52.65%, rgba(255,255,255,0)), color-stop(83.57%, #fff));background: linear-gradient(180deg, rgba(255,255,255,0) 52.65%, #fff 83.57%);height: 100%;width: 100%;z-index: 99;left:0;}
.select-page .item img{width: 180px;}
.select-page .item .info{position: absolute;bottom: 12px;z-index: 100;background-color: #ffffff;display: flex;flex-direction: column;width: 100%;text-align: center;color: #333;left: 0;}
.select-page .item .info i {margin-bottom: 10px;font-size: 24px;color: #333;}
.select-page .item .info span{font-size: 16px;font-weight: bold;}
.select-page .item.selected .checked{display: block;}
.select-btn{padding-top: 10px;margin-top:20px;padding-right:10px;height:40px;line-height:40px;text-align:right;border-top:1px solid #e9edef;}
.table-tab{margin: 0;}
</style>
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="createPage()">新建页面</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入页面名称" autocomplete="off" class="layui-input">
<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="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">-->
<!-- <select name="template_id" lay-filter="template_id">-->
<!-- {foreach name="$template_goods_list" item="vo"}-->
<!-- <option value="{$vo.goods_id}">{$vo.title}</option>-->
<!-- {/foreach}-->
<!-- </select>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="layui-inline">-->
<!-- <label class="layui-form-label">页面类型</label>-->
<!-- <div class="layui-input-inline">-->
<!-- <select name="type" lay-filter="type">-->
<!-- <option value="">全部</option>-->
<!-- <option value="DIY_PAGE">自定义页面</option>-->
<!-- {foreach name="$template_list" item="vo"}-->
<!-- <option value="{$vo.name}">{$vo.title}</option>-->
<!-- {/foreach}-->
<!-- </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>-->
<div class="layui-tab table-tab" lay-filter="diy_list_tab">
<ul class="layui-tab-title js-diy-tab">
{foreach name="$template_list" item="vo"}
<li {if $vo.name==$type }class="layui-this"{/if} lay-id="{$vo.name}">{$vo.title}({$vo.count})</li>
{/foreach}
</ul>
<div class="layui-tab-content">
<table id="diy_list" lay-filter="diy_list"></table>
</div>
</div>
<script type="text/html" id="action">
<div class="operation-wrap" data-id="{{d.id}}">
<div class="table-btn">
<div class="popup-qrcode-wrap"><img class="popup-qrcode-loadimg" src="__STATIC__/loading/loading.gif" /></div>
{{# if(d.type != 'DIY_PAGE' && d.is_default == 0){ }}
<a class="layui-btn" lay-event="setUse">使用</a>
{{# } }}
<a class="layui-btn text-color" lay-event="promote">推广</a>
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="copy">复制页面</a>
{{# if(d.type == 'DIY_PAGE' || d.is_default == 0){ }}
<a class="layui-btn" lay-event="delete">删除</a>
{{# } }}
</div>
</div>
</script>
<!-- 编辑排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.id}}, this)" value="{{d.sort}}" class="layui-input edit-sort len-short">
</script>
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
</script>
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
</script>
<script type="text/html" id="createPageHtml">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label sm"><span class="required">*</span></label>
<div class="layui-input-inline len-mid">
<select name="template_id" lay-filter="template_id" lay-verify="required">
{foreach name="$template_goods_list" item="vo"}
<option value="{$vo.goods_id}">{$vo.title}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label sm"><span class="required">*</span></label>
<div class="layui-input-inline len-mid">
<input type="text" name="title" placeholder="请输入页面名称" lay-verify="required" autocomplete="off" maxlength="15" class="layui-input">
</div>
</div>
<div class="form-row sm">
<button class="layui-btn" lay-submit lay-filter="createPage">确定</button>
<button class="layui-btn layui-btn-primary" onclick="layer.close(createPageIndex)">取消</button>
</div>
</div>
</script>
<script type="text/html" id="selectPageHtml">
<div class="layui-form select-page">
{foreach name="$page_type_list" item="vo" key="k"}
<div class="item{if $k==0} selected border-color{/if}" data-page-type="{$vo.name}">
<i class="iconfont iconxuanzhong text-color checked"></i>
<div class="mask"></div>
<img src="{:img($vo.preview)}" alt="">
<div class="info">
<i class="{$vo.icon}{if $k==0} text-color{/if}"></i>
<span {if $k==0}class="text-color"{/if}>{$vo.title}</span>
</div>
</div>
{/foreach}
</div>
<div class="select-btn">
<button class="layui-btn select-save" onclick="selectPage()">确定</button>
<button class="layui-btn select-cancel layui-btn-primary" onclick="layer.close(createPageIndex)">取消</button>
</div>
</script>
<script>
var form,laytpl,element,table,createPageIndex;
layui.use([ 'laytpl', 'form','element'], function () {
laytpl = layui.laytpl;
form = layui.form;
element = layui.element;
table = new Table({
id: 'diy_list',
elem: '#diy_list',
url: ns.url("shop/diy/lists"),
cols: [[{
type: 'checkbox',
width: '3%'
}, {
width: '20%',
title: '页面名称',
templet: function (res) {
var html = '';
html += `<span>${res.title}</span>`;
return html;
}
}, {
field: 'type_name',
width: '16%',
title: '页面类型',
}, {
width: '16%',
title: '状态',
templet: function (res) {
var html = '';
if (res.type == 'DIY_PAGE'){
html = '<span class="custom-tag">-</span>';
}else{
if(res.is_default == 1) html = `<span class="use text-color">使用中</span>`;
else html = `<span class="unused">未使用</span>`;
}
return html;
}
},
// {
// field: 'click_num',
// width: '13%',
// title: '浏览量',
// sort: true
// },
{
width: '20%',
title: '创建时间',
templet: function (d) {
return ns.time_to_date(d.create_time);
}
},
// {
// field: 'sort',
// width: '12%',
// title: '排序',
// templet: '#editSort',
// sort: true
// },
{
title: '操作',
toolbar: '#action',
width: '25%',
align: 'right'
}]],
where: {
template_id: $("select[name='template_id']").val()
},
toolbar: '#toolbarOperation',
bottomToolbar: "#batchOperation"
});
//监听工具条
table.tool(function (obj) {
var data = obj.data;
if (obj.event === 'promote') {
// 推广
window.open(ns.url('index/index/h5preview', {id: data.id, type: 'page'}));
} else if (obj.event === 'edit') {
window.open(ns.href("shop/diy/edit", {id: data.id}));
} else if (obj.event === "delete") {
deleteSiteDiyView(data.id);
} else if (obj.event === "copy") {
layer.confirm('确定要复制该页面吗?', function (index) {
$.ajax({
type: "post",
url: ns.url("shop/diy/copySiteDiyView"),
data: {'id': data.id},
dataType: "JSON",
success: function (res) {
layer.msg(res.message);
if (res.code >= 0) {
table.reload();
getPageCount();
}
}
});
layer.close(index);
});
}else if(obj.event === 'setUse') {
$.ajax({
type: "post",
url: ns.url("shop/diy/setUse"),
data: {id: data.id, name: data.name},
dataType: "JSON",
success: function (res) {
layer.msg(res.message);
if (res.code >= 0) {
table.reload();
}
}
});
}
});
//批量操作
table.bottomToolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "delete":
var id_array = [];
for (var i in obj.data) id_array.push(obj.data[i].id);
deleteSiteDiyView(id_array.toString());
break;
}
});
//批量操作
table.toolbar(function (obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "delete":
var id_array = [];
for (var i in obj.data) id_array.push(obj.data[i].id);
deleteSiteDiyView(id_array.toString());
break;
}
});
// 搜索功能
form.on('submit(search)', function (data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
form.on('submit(createPage)', function (data) {
location.hash = ns.hash('shop/diy/edit',data.field);
});
element.on('tab(diy_list_tab)', function () {
var type = this.getAttribute('lay-id');
table.reload({
page: {
curr: 1
},
where: {
search_text : $('input[name="search_text"]').val(),
type : type
}
});
});
});
// 监听单元格编辑
function editSort(id, event){
var data = $(event).val();
if (data == '') {
$(event).val(0);
data = 0;
}
let reg = ns.getRegexp('>=0num');
if (!reg.test(data)) {
layer.msg("排序号必须是大于或等于0的整数");
return;
}
$.ajax({
type: 'POST',
url: ns.url("shop/diy/modifySort"),
data: {
id: id,
sort: data
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if(res.code==0){
table.reload();
}
}
});
}
function createPage() {
createPageIndex = layer.open({
type: 1,
title: '选择页面类型',
content: $('#selectPageHtml').html(),
offset: 'auto',
area: ['auto','auto'],
success: function (layero, index) {
form.render();
$('.select-page .item').click(function () {
$(this).addClass('selected border-color').siblings().removeClass('selected border-color');
$('.select-page .item').find('.info>*').removeClass('text-color');
$(this).find('.info>*').addClass('text-color');
});
}
});
}
function selectPage() {
layer.close(createPageIndex)
var selected = $('.select-page .item.selected');
var params = {};
// 排除自定义页面类型
if (selected.attr('data-page-type') !== 'DIY_PAGE') {
params.page_type = selected.attr('data-page-type');
}
setTimeout(function () {
location.hash = ns.hash('shop/diy/edit', params);
},150);
}
// 删除店铺微页面
function deleteSiteDiyView(id_array) {
layer.confirm('确定要删除这些微页面模板吗', function (index) {
layer.close(index);
$.ajax({
url: ns.url("shop/diy/deleteSiteDiyView"),
data: {'id': id_array},
dataType: "JSON",
success: function (res) {
layer.msg(res.message);
if (res.code == 0) {
getPageCount();
table.reload();
}
}
});
});
}
// 查询页面数量
function getPageCount() {
$.ajax({
type: "post",
url: ns.url("shop/diy/getPageCount"),
data: {},
dataType: "JSON",
success: function (res) {
if (res.code >= 0) {
var str = '';
for (var i = 0; i < res.data.length; i++) {
var item = res.data[i];
var type = $('.js-diy-tab li.layui-this').attr('lay-id');
str += `<li`;
if(item.name == type){
str += ` class="layui-this"`;
}
str += ` lay-id="${item.name}">`;
str += `${item.title}(${item.count})</li>`;
}
$('.js-diy-tab').html(str);
}
}
});
}
</script>

235
app/shop/view/diy/management.html Executable file
View File

@@ -0,0 +1,235 @@
<style type="text/css">
.management-info{
display: flex;
margin-bottom: 50px;
}
.management-info .management{
margin-left: 10px;
}
.management-info .phone-wrap{
min-width: 340px;
width: 340px;
height: 667px;
}
.management-info .phone-wrap .iframe-wrap{
width: 340px;
height: 100%;
border: 1px solid #eee;
}
.management-info .phone-wrap .iframe-wrap #iframe-management{
width: 340px;
height: 100%;
}
.management-info-left{
margin-left: 40px;
max-width: 680px;
width:100%;
}
.management-info-left-box{
position: relative;
padding: 20px;
border: 1px solid #eee;
}
.management-info-left-box::after{
position: absolute;
content: '';
width: 26px;
height: 26px;
background-color: #fff;
transform:rotate(-45deg);
left:-13px;
top:26px;
border: 1px solid #eee;
border-right: 0;
border-bottom: 0;
}
.management-info .management-info-left .management-info-top{
border-bottom: 1px solid #eee;
padding-bottom: 20px;
}
.management-info .management-info-title{
font-size: 18px;
font-weight: 800;
display: flex;
align-items: center;
}
.management-info .management-info-left .management-info-top .word-aux{
margin: 10px 0 0 0;
}
.management-info .management-info-box{
margin-top: 20px;
background-color: #F7F8FA;
padding: 20px;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.management-info .management-info-box-img{
width: 100px;
min-height: 100px;
}
.management-info .management-info-box-img img{
width: 100%;
height: 100%;
}
.management-info .management-info-box-img .tips {
text-align: center;
font-size: 12px;
color: #999;
border: 1px dashed #ddd;
display: flex;
align-items: center;
justify-content: center;
width: 100px;
height: 100px;
cursor: pointer;
box-sizing: border-box;
}
.management-info .management-info-box-title-bottom{
color: #999;
}
.management-info .management-empty {
text-align: center;
}
.management-info .management-empty img{
width: 190px;
display: block;
margin:80px auto 40px;
}
.blockflex{
margin-top: 10px;
text-align: center;
cursor:pointer;
}
</style>
<div class="main-wrap-margin">
<div class="management-info">
<div class="phone-wrap">
<div class="iframe-wrap">
{if !empty($qrcode_info) && $qrcode_info['url']}
<iframe id="iframe-management" src="{$qrcode_info['url']}" frameborder="0"></iframe>
{else/}
<div class="management-empty">
<img src="__STATIC__/img/wap_not_found.png" />
<p>当前手机页面无法访问</p>
<a href="https://www.kancloud.cn/niucloud/niushop_b2c_v4/1842146" class="text-color" target="_blank">请检查手机端域名配置以及伪静态</a>
</div>
{/if}
</div>
</div>
<div class="management-info-left">
<div class="management-info-left-box">
<div class="management-info-top">
<div class="management-info-title">
<button type="button" class="layui-btn" onclick="toIndex()">装修</button>
</div>
{if $store_business == 'store'}
<p class="word-aux text-color">当前系统为连锁门店运营模式,首页按照门店页面装修</p>
{/if}
</div>
<div class="management-info-content">
<div class="management-info-box">
<div>
<div class="management-info-box-title">H5</div>
<div class="management-info-box-title-bottom">扫描右侧二维码查看</div>
</div>
<div class="management-info-box-img">
{notempty name="$qrcode_info"}
<img layer-src src="{:img($qrcode_info['img'])}" />
<div class="blockflex">
<a class="text-color" href="{:url('index/index/h5preview')}" target="_blank">访问店铺</a>
</div>
{/notempty}
</div>
</div>
{notempty name="$wechat_config"}
<div class="management-info-box">
<div>
<div class="management-info-box-title">微信公众号</div>
<div class="management-info-box-title-bottom">扫描右侧二维码查看</div>
</div>
<div class="management-info-box-img">
{notempty name="$wechat_config['qrcode']"}
<img layer-src src="{:img($wechat_config['qrcode'])}" onerror="this.src = 'STATIC_IMG/default_img/square.png'"/>
{else/}
<p class="tips" onclick="window.open('{:href_url(\'wechat://shop/wechat/config\')}')">请上传<br>公众号二维码</p>
{/notempty}
</div>
</div>
{else/}
<div class="management-info-box">
<div>
<div class="management-info-box-title">微信公众号</div>
<div class="management-info-box-title-bottom">需要配置已认证的微信公众号,才能使用该功能哦!</div>
</div>
<button type="button" class="layui-btn jump-type" onclick="window.open('{:href_url(\'wechat://shop/wechat/config\')}')">立即配置</button>
</div>
{/notempty}
{notempty name="$weapp_config"}
<div class="management-info-box">
<div>
<div class="management-info-box-title">微信小程序</div>
<div class="management-info-box-title-bottom">扫描右侧二维码查看</div>
</div>
<div class="management-info-box-img">
{notempty name="$weapp_config['qrcode']"}
<img layer-src src="{:img($weapp_config['qrcode'])}" onerror="this.src = 'STATIC_IMG/default_img/square.png'"/>
{else/}
<p class="tips" onclick="window.open('{:href_url(\'weapp://shop/weapp/config\')}')">请上传<br>小程序二维码</p>
{/notempty}
</div>
</div>
{else/}
<div class="management-info-box">
<div>
<div class="management-info-box-title">微信小程序</div>
<div class="management-info-box-title-bottom">需要配置已认证的微信小程序,才能使用该功能哦!</div>
</div>
<button type="button" class="layui-btn jump-type" onclick="window.open('{:href_url(\'weapp://shop/weapp/config\')}')">立即配置</button>
</div>
{/notempty}
{if isset($aliapp_config) }
{notempty name="$aliapp_config"}
<div class="management-info-box">
<div>
<div class="management-info-box-title">支付宝小程序</div>
<div class="management-info-box-title-bottom">扫描右侧二维码查看</div>
</div>
<div class="management-info-box-img">
{notempty name="$aliapp_config['qrcode']"}
<img layer-src src="{:img($aliapp_config['qrcode'])}" onerror="this.src = 'STATIC_IMG/default_img/square.png'"/>
{else/}
<p class="tips" onclick="window.open('{:href_url(\'aliapp://shop/aliapp/config\')}')">请上传<br>小程序二维码</p>
{/notempty}
</div>
</div>
{else/}
<div class="management-info-box">
<div>
<div class="management-info-box-title">支付宝小程序</div>
<div class="management-info-box-title-bottom">需要配置支付宝小程序,才能使用该功能哦!</div>
</div>
<button type="button" class="layui-btn jump-type" onclick="window.open('{:href_url(\'aliapp://shop/aliapp/config\')}')">立即配置</button>
</div>
{/notempty}
{/if}
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var storeBusiness = '{$store_business}'; // 店铺运营模式
function toIndex(){
if(storeBusiness == 'shop') location.hash = ns.hash('shop/diy/index');
else if(storeBusiness == 'store') location.hash = ns.hash('store://shop/store/diy');
}
</script>

141
app/shop/view/diy/route.html Executable file
View File

@@ -0,0 +1,141 @@
<style>
.table-tab .layui-tab-title{margin-bottom: 20px;}
.layui-table-box{overflow: inherit;}
.layui-table-body{overflow: inherit;}
.layui-table-view td>div{overflow: inherit;}
.route-wrap{display: flex;align-items: center;}
.route-wrap a{margin: 0 10px;}
.route-wrap .iconfont{font-size: 24px;vertical-align:bottom;cursor: pointer;}
.promote-wrap{position: relative;}
.qrcode-wrap {display: none;font-size: 14px;line-height: 20px;background-color: #fff;box-shadow: 0 2px 8px 0 rgba(200, 201, 204, .5);position: absolute;z-index: 2000;border-radius: 2px;top: 40px;right: 5px;transform: translateX(10px);width: 200px;margin-bottom: 20px;}
.qrcode-wrap:before {right: 7px;top: -14px;border: solid transparent;content: "";height: 0;width: 0;position: absolute;pointer-events: none;border-color: transparent;border-bottom-color: #fff;border-width: 8px;}
.qrcode-wrap h4{text-align: center;border-bottom: 2px solid;line-height: 40px;}
.qrcode-wrap img{display: block;width: 130px;height: 130px;max-width: 100%;margin: 10px auto;}
.qrcode-wrap span{display: block;text-align: center;margin-bottom: 10px;cursor: pointer;}
</style>
<!-- 搜索框 -->
<div class="single-filter-box">
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入页面名称" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<table id="route_list" lay-filter="route_list"></table>
<script type="text/html" id="h5_route">
<div class="route-wrap">
<span>{$h5_domain}{{d.wap_url}}</span>
<a class="text-color" href="javascript:ns.copy('h5_route_{{d.id}}');">复制</a>
<div class="promote-wrap">
<span class="text-color iconfont iconerweima" data-event="qrcode" data-name="{{d.name}}" data-path="{{d.wap_url}}" onclick="showQrcode(this,'h5')"></span>
<div class="qrcode-wrap" data-event="qrcode">
<h4 class="border-color" data-event="qrcode">二维码</h4>
<img src="" data-event="qrcode">
<span class="text-color" onclick="ns.copy('h5_route_{{d.id}}')" data-event="qrcode">复制链接</span>
</div>
</div>
<input type="hidden" id="h5_route_{{d.id}}" value="{$h5_domain}{{d.wap_url}}">
</div>
</script>
<script type="text/html" id="weapp_route">
<div class="route-wrap">
<span>{{d.wap_url}}</span>
<a class="text-color" href="javascript:ns.copy('weapp_route_{{d.id}}');">复制</a>
<div class="promote-wrap">
<span class="text-color iconfont iconerweima" data-event="qrcode" data-name="{{d.name}}" data-path="{{d.wap_url}}" onclick="showQrcode(this,'weapp')"></span>
<div class="qrcode-wrap" data-event="qrcode">
<h4 class="border-color" data-event="qrcode">二维码</h4>
<img src="" data-event="qrcode">
<span class="text-color" onclick="ns.copy('weapp_route_{{d.id}}')" data-event="qrcode">复制链接</span>
</div>
</div>
<input type="hidden" id="weapp_route_{{d.id}}" value="{{d.wap_url}}">
</div>
</script>
<script>
var form,laytpl,table,element;
layui.use([ 'laytpl', 'form','element'], function () {
laytpl = layui.laytpl;
element = layui.element;
form = layui.form;
table = new Table({
elem: '#route_list',
url: ns.url("shop/diy/route"),
cols: [[{
type: 'checkbox',
width: '3%'
}, {
width: '10%',
title: '页面名称',
templet: function (res) {
var html = '';
html += `<span>${res.title}</span>`;
return html;
}
}, {
width: '45%',
title: 'H5链接',
templet: '#h5_route',
}, {
width: '30%',
title: '小程序链接',
templet: '#weapp_route',
}]],
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data){
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
function showQrcode(event,type) {
$('.qrcode-wrap').hide();
promote({name: $(event).attr('data-name'), path: $(event).attr('data-path'), app_type: type}, function (data) {
if(data[type].status == 1) {
var qrcode = $(event).next();
qrcode.find('img').attr('src', ns.img(data[type].img));
qrcode.show();
}else{
layer.msg(data[type].message);
}
});
}
$(document).click(function(event) {
if ($(event.target).attr('data-event') !='qrcode' && $('.qrcode-wrap').not(':hidden').length) {
$('.qrcode-wrap').css('display', 'none');
}
});
// 推广链接
function promote(data,callback) {
$.ajax({
type: "POST",
url: ns.url("shop/diy/promoteRoute"),
data: data,
dataType: 'JSON',
success: function (res) {
if (res.code == 0) {
if(callback) callback(res.data.path);
}
}
});
}
</script>

View File

@@ -0,0 +1,85 @@
<style>
html,body {
width: 100%;
height: 100%;
background: #fff;
}
.icon-style-wrap {
padding: 15px;
box-sizing: border-box;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
.icon-style-wrap .title {
margin-bottom: 10px;
}
.icon-style-wrap .icon-list {
flex: 1;
height: 0;
display: flex;
overflow-y: scroll;
flex-wrap: wrap;
}
.icon-style-wrap .icon-list::-webkit-scrollbar {
display: none;
}
.icon-style-wrap .icon-list .icon-block {
width: 56px;
height: 56px;
font-size: 60px;
border: 1px dashed #eee;
margin: 0 5px 5px 0;
cursor: pointer;
}
.icon-style-wrap .icon-list .icon-block:nth-child(5n+5) {
margin-right: 0;
}
.icon-style-wrap .icon-list .icon-block:hover {
border-color: var(--base-color);
}
.icon-style-wrap .icon-list .custom {
font-size: 12px;
display: flex;
align-items: center;
justify-content: center;
}
</style>
<div class="icon-style-wrap" id="app">
<div class="title">图标风格</div>
<div class="icon-list">
<div class="icon-block" v-for="(item, index) in styleList" :key="index" @click="selectStyle(index)">
<iconfont icon="{$icon}" :value="item"></iconfont>
</div>
<div class="icon-block custom" @click="custom">
<p>自定义</p>
</div>
</div>
</div>
<script src="STATIC_JS/vue.js"></script>
{include file="diy/iconfont_component"/}
<script>
vue = new Vue({
el: "#app",
data: {
styleList: {:json_encode($icon_style)}
},
methods: {
selectStyle(index){
window.parent.postMessage({
event: 'selectIconStyle',
data: this.styleList[index],
}, location.origin);
},
custom(){
window.parent.postMessage({
event: 'selectIconStyle',
data: null,
}, location.origin);
}
}
})
</script>

View File

@@ -0,0 +1,140 @@
<link rel="stylesheet" href="STATIC_EXT/colorPicker/css/colorpicker.css" />
<link rel="stylesheet" href="STATIC_EXT/diyview/css/diyview.css?time=20240316" />
<style>
.icon-style-set{
padding: 15px 30px;
display: none;
}
</style>
<div id="app" class="layui-form icon-style-set" >
<div class="layui-form-item tag-wrap" >
<label class="layui-form-label sm">标签</label>
<div class="layui-input-block">
<div @click="labelData.control = true" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : labelData.control}">
<i class="layui-anim layui-icon">{{ labelData.control ? "&#xe643;" : "&#xe63f;" }}</i>
<div>开启</div>
</div>
<div @click="labelData.control = false" :class="{ 'layui-unselect layui-form-radio' : true,'layui-form-radioed' : !labelData.control}">
<i class="layui-anim layui-icon">{{ !labelData.control ? "&#xe643;" : "&#xe63f;" }}</i>
<div>关闭</div>
</div>
</div>
</div>
<div v-show="labelData.control">
<div class="layui-form-item" >
<label class="layui-form-label sm">标签内容</label>
<div class="layui-input-block">
<input type="text" name='text' v-model="labelData.text" maxlength="3" class="layui-input len-short" autocomplete="off" />
</div>
</div>
<div class="layui-form-item flex">
<div class="flex_left">
<label class="layui-form-label sm">标签文字</label>
<slot></slot>
<div class="curr-color">
<span>{{ labelData.textColor ? labelData.textColor : "透明" }}</span>
</div>
<slot name="right"></slot>
</div>
<div class="layui-input-block flex_fill">
<div id="graphgic_nav_tag_color" class="picker colorSelector"><div :style="{ background : labelData.textColor }"></div></div>
<span class="color-selector-reset text-color" @click="reset('textColor')">重置</span>
</div>
</div>
<div class="layui-form-item flex">
<div class="flex_left">
<label class="layui-form-label sm">背景</label>
<slot></slot>
<div class="curr-color">
<span>{{ labelData.bgColorStart ? labelData.bgColorStart : "透明" }}</span>
<span>{{ labelData.bgColorEnd ? labelData.bgColorEnd : "透明" }}</span>
</div>
<slot name="right"></slot>
</div>
<div class="layui-input-block flex_fill">
<div id="bgColorStart" class="picker colorSelector"><div :style="{ background : labelData.bgColorStart }"></div></div>
<div id="bgColorEnd" class="picker colorSelector"><div :style="{ background : labelData.bgColorEnd }"></div></div>
<span class="color-selector-reset text-color" @click="reset('bgColorStart,bgColorEnd')">重置</span>
</div>
</div>
</div>
</div>
<script src="STATIC_JS/vue.js"></script>
<script src="STATIC_EXT/diyview/js/components.js"></script>
<script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
<script>
var form,slider,colorpicker,vue, data;
data = {:json_encode($data)};
layui.use(['form', 'slider', 'colorpicker'], function() {
form = layui.form;
slider = layui.slider;
colorpicker = layui.colorpicker;
vue = new Vue({
el: "#app",
data: {
labelData: {},
defaultColor:{
'text' : '热门',
'textColor' : '#FFFFFF',
'bgColorStart' : '#F83288',
'bgColorEnd' : '#FE3523',
},
lazyLoad:false,
},
created: function (){
this.labelData = data;
this.labelData.control = this.labelData.control == 'true' ? true : false;
},
methods: {
reset: function (field) {
let self = this;
let field_arr = field.split(',');
for (let i in field_arr) {
self.labelData[field_arr[i]] = this.defaultColor[field_arr[i]];
}
},
colorRender(id, color, callback){
Colorpicker.create({
el: id,
color: color,
change: function (elem, hex) {
callback(hex)
}
});
}
},
mounted(){
var self = this;
self.colorRender('graphgic_nav_tag_color', self.labelData.textColor, function (color) {
self.labelData.textColor = color;
})
self.colorRender('bgColorStart', self.labelData.bgColorStart, function (color) {
self.labelData.bgColorStart = color;
})
self.colorRender('bgColorEnd', self.labelData.bgColorEnd, function (color) {
self.labelData.bgColorEnd = color;
})
setTimeout(function () {
self.lazyLoad = true;
$('.icon-style-set').show()
}, 100)
},
computed: {
}
})
})
function selectLabelListener(callback) {
var data = ns.deepclone(vue._data.labelData);
callback(data);
}
</script>

75
app/shop/view/diy/style.html Executable file
View File

@@ -0,0 +1,75 @@
<style>
.exchange-type{display: inline-block;min-width: 140px;height: 60px;line-height: 60px;border: 1px solid #ededed;border-radius: 4px;margin-right: 10px;position: relative;cursor: pointer;margin-bottom: 15px;}
.style{display: flex;-webkit-box-align: center;align-items: center;-webkit-box-pack: center;justify-content: center;padding: 0 10px;}
.style div{width: 50px;height: 16px;}
.style p{margin-left: 10px;font-size: 12px;color: #333;}
.preview-style img{margin-right: 64px; margin-bottom: 50px; height: 595px;width: 275px;-webkit-box-shadow: 5px 5px 20px #f5f5f5;box-shadow: 5px 5px 20px #f5f5f5;}
</style>
{notempty name="$theme_list"}
<div class="layui-form form-wrap">
<div class="layui-form-item">
<div class="layui-input-block">
{foreach $theme_list as $k=>$v}
<div class="exchange-type" data-id="{$v['id']}" data-title="{$v['title']}" data-name="{$v['name']}" data-main-color="{$v['main_color']}" data-aux-color="{$v['aux_color']}">
<div class="style">
<div style="background: url('{:img($v['color_img'])}') no-repeat;"></div>
<p>{$v['title']}</p>
</div>
</div>
{/foreach}
</div>
</div>
<div class="layui-input-block">
<div class="preview-style">
{foreach $theme_list as $k=>$v}
{foreach $v['preview'] as $ck=>$cv}
<img src="{:img($cv)}" data-name="{$v['name']}" {if $k!=0}style="display:none;"{/if}>
{/foreach}
{/foreach}
</div>
</div>
<div class="form-row">
<input type="hidden" name="style_theme" value="{$style|json_encode}">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
{/notempty}
<script>
var theme = JSON.parse($("input[name='style_theme']").val());
$(".exchange-type").click(function() {
$(this).addClass("border-color").siblings("div").removeClass("border-color");
var obj = {
id: $(this).attr('data-id'),
title: $(this).attr('data-title'),
name: $(this).attr('data-name'),
main_color: $(this).attr('data-main-color'),
aux_color: $(this).attr('data-aux-color'),
};
$("input[name='style_theme']").val(JSON.stringify(obj));
$('.preview-style img').hide();
$('.preview-style img[data-name="' + obj.name + '"]').show();
});
$('.exchange-type[data-name="' + theme.name + '"]').click();
layui.use('form', function() {
var form = layui.form, repeat_flag = false; //防重复标识
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
data.field = JSON.parse(data.field.style_theme);
$.ajax({
url: ns.url("shop/diy/style"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
layer.msg(res.message);
}
});
});
});
</script>

108
app/shop/view/diy/template.html Executable file
View File

@@ -0,0 +1,108 @@
<style>
.tips {margin: 20px 0;border: 1px dashed;padding: 5px 10px;width: 90%;}
.theme-item{display: inline-block;min-width: 140px;height: 60px;line-height: 60px;border: 1px solid #ededed;border-radius: 4px;margin-right: 10px;position: relative;cursor: pointer;margin-bottom: 15px;}
.style{display: flex;-webkit-box-align: center;align-items: center;-webkit-box-pack: center;justify-content: center;padding: 0 10px;}
.style div{width: 50px;height: 16px;}
.style p{margin-left: 10px;font-size: 12px;color: #333;}
.template-list{display: flex;flex-wrap: wrap;}
.template-list li{overflow: hidden;position: relative;padding: 10px;margin-right: 30px;margin-bottom: 30px;width: 270px;height: 410px;border: 1px solid #e9e9e9;border-radius: 4px;box-sizing: border-box;}
.template-list li .item-img{overflow: hidden;width: 200px;height: 300px;margin: 0 auto;}
.template-list li .item-img img{max-width: 100%;}
.template-list li .item-hide{display: none;position: absolute;left: 0;right: 0;top: 0;bottom: 0;background-color: rgba(0,0,0,.6);text-align: center;}
.template-list li .item-name{display: block;padding-top: 7px;line-height: 22px;font-size: 14px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;}
.template-list li .item-desc{display: block;padding-top: 7px;line-height: 22px;font-size: 12px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 1;-webkit-box-orient: vertical;color:#999;}
.template-list li .item-hide .item-btn-box{position: absolute;top: 50%;left: 50%;display: flex;flex-wrap: wrap;justify-content: center;align-items: center;transform: translate(-50%, -50%);}
.template-list li .item-hide button{border: 1px solid #fff;display: flex;justify-content: center;align-items: center;height: 33px;width: 100px;color: #fff;background: none;border-radius: 4px;cursor: pointer;}
.template-list li:hover .item-hide{display: block;}
.template-list li .item-hide button ~ button{margin-top: 15px;}
.template-list li .is-default{padding: 6px;font-size: 12px;color:#fff;border-radius: 4px;display: inline-block;margin-top: 5px;line-height: 1;}
</style>
<div class="theme-wrap">
{foreach $theme_list as $k=>$v}
<div class="theme-item {if $style['name']==$v['name']}border-color{/if}" data-id="{$v['id']}" data-title="{$v['title']}" data-name="{$v['name']}" data-main-color="{$v['main_color']}" data-aux-color="{$v['aux_color']}">
<div class="style">
<div style="background: url('{:img($v['color_img'])}') no-repeat;"></div>
<p>{$v['title']}</p>
</div>
</div>
{/foreach}
</div>
<ul class="template-list">
{foreach name="$template" item="vo"}
<li data-name="{$vo.name}" data-title="{$vo.title}" data-preview="{$vo.preview}" data-desc="{$vo.desc}">
<div class="item-img">
<img src="{:img($vo.cover)}" alt="">
</div>
<span class="item-name">{$vo.title}</span>
<span class="item-desc">{$vo.desc}</span>
{if isset($vo.is_default) && $vo.is_default == 1}
<span class="is-default bg-color">使用中</span>
{/if}
<div class="item-hide">
<div class="item-btn-box">
<button class="use" onclick="createTemplate('{$vo.goods_id}','{$vo.name}')">立即使用</button>
<button class="preview" onclick="$('#{$vo.name}').click()">预览</button>
</div>
</div>
<img id="{$vo.name}" class="layui-hide" src="{:img($vo.preview)}" layer-src>
</li>
{/foreach}
</ul>
<script>
layui.use('form', function() {
var repeat_flag = false; //防重复标识
$(".theme-item").click(function () {
$(this).addClass("border-color").siblings("div").removeClass("border-color");
var obj = {
id: $(this).attr('data-id'),
title: $(this).attr('data-title'),
name: $(this).attr('data-name'),
main_color: $(this).attr('data-main-color'),
aux_color: $(this).attr('data-aux-color'),
};
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/diy/style"),
data: obj,
dataType: 'JSON',
type: 'POST',
success: function (res) {
repeat_flag = false;
layer.msg(res.message);
}
});
});
});
// 使用模板
function createTemplate(goods_id,name) {
$.ajax({
type: 'post',
url: ns.url("shop/diy/create"),
data: {
goods_id: goods_id,
name: name
},
dataType: 'JSON',
success: function(res) {
if (res.code >= 0){
location.hash = ns.hash("shop/diy/index");
}else{
layer.msg(res.message);
}
}
});
// var tips = `切换模版后需要重新<a href="{:href_url('shop/config/sitedeploy')}" target="_blank" class="text-color">部署</a>H5、小程序`;
// layer.confirm(tips, {
// title: '操作提示',
// btn: ['确定', '取消'],
// yes: function () {
// }
// });
}
</script>

View File

@@ -0,0 +1,163 @@
<script type="text/html" id="express_sheet_html">
<div class="layui-form express-sheet">
<div class="layui-form-item express-mode">
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block len-mid">
<select name="template_id" lay-search lay-filter="express_company" lay-verify="required">
<option value="">请选择面单模版</option>
{{# layui.each(d, function(index, item){ }}
<option value="{{ item.id }}" {{# if(item.is_default === 1){ }} selected {{# } }} >{{ item.template_name }}</option>
{{# }); }}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否发货</label>
<div class="layui-input-block">
<input type="checkbox" name="is_delivery" lay-skin="switch" value="1">
</div>
</div>
<div class="form-row">
<button type="button" class="layui-btn" lay-submit lay-filter="express_sheet_save">点击确定</button>
</div>
</div>
</script>
<script type="text/html" id="again_express_sheet_html">
<div class="layui-form express-sheet">
<div class="layui-form-item express-mode">
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block len-mid">
<select name="template_id" lay-search lay-filter="express_company" lay-verify="required">
<option value="">请选择面单模版</option>
{{# layui.each(d, function(index, item){ }}
<option value="{{ item.id }}" {{# if(item.is_default === 1){ }} selected {{# } }} >{{ item.template_name }}</option>
{{# }); }}
</select>
</div>
</div>
<div class="form-row">
<button type="button" class="layui-btn" lay-submit lay-filter="express_sheet_save">点击确定</button>
</div>
</div>
</script>
<script>
var expresselectronicsheetlist = [];
//获取物流公司
$.ajax({
type: "post",
url: ns.url("shop/delivery/getexpresselectronicsheetlist"),
dataType: 'json',
success: function (res) {
if (res.code == 0) {
expresselectronicsheetlist = res.data;
}
}
});
//打印电子面单
function printElectronicsheetAction(order_id_list){
var getTpl = $("#express_sheet_html").html();
laytpl(getTpl).render(expresselectronicsheetlist, function(html) {
layer.open({
type: 1,
shadeClose: true,
shade: 0.3,
fixed: false,
scrollbar: false,
title: "打印电子面单",
area: '550px',
content: html,
success: function (layero, index) {
form.render();
form.on('submit(express_sheet_save)', function (data) {
$.each(order_id_list, function(index, value) {
data.field.order_id = value;
$.ajax({
type: 'post',
url: ns.url("shop/delivery/printElectronicsheet"),
dataType: 'JSON',
data: data.field,
success: function (res) {
layer.msg(res.message);
if (res.code >= 0) {
expressSheet(res.data.PrintTemplate);
listenerHash(); // 刷新页面
layer.closeAll();
}
}
});
});
});
}
});
})
}
/**
* 批量打印电子面单
*/
function CreateTwoFormPage(html){
LODOP=getLodop();
if(LODOP) {
LODOP.PRINT_INIT("打印电子面单");
LODOP.ADD_PRINT_HTM(0, 10, "95%", "100%", html);
}
}
function expressSheet(html) {
CreateTwoFormPage(html);
// LODOP.PREVIEW(); //预览
LODOP.PRINT(); //直接打印
}
function orderPrintElectronicsheet(order_id){
printElectronicsheetAction([order_id]);
}
// 重新打印电子面单
function printElectronicsheet(order_id)
{
var getTpl = $("#again_express_sheet_html").html();
laytpl(getTpl).render(expresselectronicsheetlist, function(html) {
layer.open({
type: 1,
shadeClose: true,
shade: 0.3,
fixed: false,
scrollbar: false,
title: "打印电子面单",
area: '550px',
content: html,
success: function (layero, index) {
form.render();
form.on('submit(express_sheet_save)', function (data) {
data.field.order_id = order_id;
$.ajax({
type: 'post',
url: ns.url("shop/delivery/printElectronicsheet"),
dataType: 'JSON',
data: data.field,
success: function (res) {
layer.msg(res.message);
if (res.code >= 0) {
expressSheet(res.data.PrintTemplate);
listenerHash(); // 刷新页面
layer.closeAll();
}
}
});
});
}
});
})
}
</script>

14
app/shop/view/error/error.html Executable file
View File

@@ -0,0 +1,14 @@
<title>您访问的页面无法访问</title>
<div>
<div style="margin-top:10% ">
<div style="text-align:center;margin: auto;">
<img src="SHOP_IMG/404.png" alt="">
</div>
<div style="text-align:center;margin: auto;margin-top: 10px">
<p><span style="font-size:36px ">很抱歉,</span>&nbsp&nbsp&nbsp&nbsp<span style="font-size:24px ">您访问的页面无法访问...</span></p>
</div>
<div style="text-align:center;margin: auto;margin-top: 10px">
<button style="font-size:18px;width:154px;height:44px;border-radius:2px; border:var(--base-color) 1px solid; background-color: #ffffff ;color:var(--base-color);cursor: pointer;margin-top: 30px" onClick="javascript :history.go(-1);">返回上一页</button>
</div>
</div>
</div>

266
app/shop/view/export/lists.html Executable file
View File

@@ -0,0 +1,266 @@
<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 {if count($from_type_list) <= 1}layui-hide{/if}">
<label class="layui-form-label">导出类型</label>
<div class="layui-input-inline">
<select name="from_type">
{foreach $from_type_list as $val}
<option value="{$val.id}">{$val.name}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">导出状态</label>
<div class="layui-input-inline">
<select name="status">
<option value="all">请选择</option>
{foreach $status_list as $val}
<option value="{$val.id}">{$val.name}</option>
{/foreach}
</select>
</div>
</div>
<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-form-mid">-</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>
<div class="form-row">
<button class="layui-btn" lay-submit="" id="search" lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<table id="table_list" lay-filter="table_list"></table>
<!-- 操作 -->
<script type="text/html" id="action">
<div class="table-btn">
<a class="layui-btn" lay-event="download">下载</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
</script>
<script>
var form, laydate;
layui.use(['laydate','form', 'element'], function(){
form = layui.form;
laydate = layui.laydate;
form.on('submit(search)', function(data) {
if ($('#start_time').val() != '' && $('#end_time').val() != '' && (new Date($('#end_time').val()).getTime() <= new Date($('#start_time').val()).getTime() )) {
layer.msg('结束时间不能小于开始时间');
return false;
}
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
laydate.render({
elem: '#start_time',
type: 'datetime',
max: 0,
change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
laydate.render({
elem: '#end_time',
type: 'datetime',
max: 0,
change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
table = new Table({
elem: '#table_list',
url: ns.url('{$lists_url}'),
where: {
from_type:"{:join(',', array_column($from_type_list, 'id'))}"
},
cols: [
[{
type: 'checkbox',
unresize: 'false',
width: '3%'
},{
field:'from_type_name',
title: '导出类型',
width: '12%',
unresize: 'false',
},{
field:'status_name',
title: '导出状态',
width: '12%',
unresize: 'false',
},{
field:'condition',
title: '筛选条件',
width: '25%',
unresize: 'false',
templet: function(data) {
let html = '';
let condition = JSON.parse(data.condition);
if(condition.length > 0){
condition.forEach((item)=>{
html += '<div class="text"><span style="display:inline-block;min-width: 60px;">'+ item.name + '</span>' + item.value +'</div>';
})
}else{
html += '全部';
}
return html;
}
},{
field:'data_num',
title: '数据总数',
width: '20%',
unresize: 'false',
}, {
field: 'create_time',
title: '导出时间',
width: '16%',
unresize: 'false',
templet: function(data) {
return ns.time_to_date(data.create_time);
}
}, {
title: '操作',
toolbar: '#action',
align:'right',
unresize: 'false'
}]
],
toolbar: '#toolbarOperation',
bottomToolbar: "#toolbarOperation",
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'download':
window.open(ns.img(data.path));
break;
case 'delete':
deleteExport(data.export_id);
break;
}
});
// 批量操作
table.bottomToolbar(function (obj) {
batchAction(obj);
});
table.toolbar(function(obj){
batchAction(obj);
});
function batchAction(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
var id_array = [];
for (i in obj.data) id_array.push(obj.data[i].export_id);
switch (obj.event) {
case "delete":
deleteExport(id_array.toString());
break;
}
}
})
/**
* 七天时间
*/
function datePick(date_num,event_obj){
$(".date-picker-btn").removeClass("selected");
$(event_obj).addClass('selected');
// alert(new Date().format("yyyy-MM-dd hh:mm"));
var now_date = new Date();
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);
}
/**
* 删除导出记录
*/
var flag_delete = false;
function deleteExport(export_ids) {
layer.confirm('确定要删除导出记录吗?', {
btn: ['确定', '取消']
}, function (index) {
if (flag_delete) return;
flag_delete = true;
layer.close(index);
$.ajax({
type: "POST",
async: true,
url: ns.url('{$delete_url}'),
data: {
export_ids: export_ids,
},
dataType: "JSON",
success: function (data) {
layer.msg(data.message);
flag_delete = false;
if (data.code == 0) {
table.reload();
}
}
});
}, function () {
layer.close();
});
}
</script>

View File

@@ -0,0 +1,461 @@
<style>
.design-sketch{width: 766px;height: 510px;border: 1px solid #ccc;}
.design-sketch div{display: inline-block;border: 1px solid #ccc;padding: 10px;margin: 8px;border-radius: 2px;color: #555;white-space: nowrap;user-select: none;background-color: #fff;line-height: 1;}
.design-sketch div i{position: absolute;top: -10px;right: -10px;display: none;width: 20px;height: 20px;border-radius: 10px;background-color: rgba(0, 0, 0, .5);color: #FFFFFF;text-align: center;line-height: 20px;z-index: 99;}
.print-option{display: inline-block;border: 1px solid #E5E5E5;line-height: 1;padding: 10px;margin-left: 5px;margin-bottom: 8px;border-radius: 2px;color: #545454;cursor: pointer;}
.form-row{margin-top: 0;margin-left: 220px;}
.express-sheet-rule .form-row{margin-left: 200px;}
.bg-color-gray{background-color: #E5E5E5!important;}
.discount {margin-bottom: 15px; display: flex; justify-content: space-between; height: 34px; line-height: 34px; padding: 5px 15px;background-color: #F6FBFD; border: 1px dashed #BCE8F1; }
</style>
<div class="layui-form">
<div class="layui-card card-common card-brief">
<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"><span class="required">*</span>物流公司名称:</label>
<div class="layui-input-inline">
<input type="text" name="company_name" lay-verify="required" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label">物流公司LOGO</label>
<div class="layui-input-inline">
<div class="upload-img-block">
<div class="upload-img-box">
<div class="upload-default" id="companyLOGO">
<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" name="logo"/>
</div>
<!-- <p id="companyLOGO" class="no-replace">替换</p>
<input type="hidden" name="logo"/>
<i class="del">x</i> -->
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="number" name="sort" value="0" placeholder="请输入" lay-verify="sorts" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">排序值必须为整数:</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">URL</label>
<div class="layui-input-block">
<input type="text" name="url" class="layui-input len-long">
</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="express_no" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">快递100编码</label>
<div class="layui-input-block">
<input type="text" name="express_no_kd100" class="layui-input len-long">
</div>
</div>
<!--<div class="layui-form-item">
<label class="layui-form-label">菜鸟编码:</label>
<div class="layui-input-block">
<input type="text" name="express_no_cainiao" class="layui-input len-long">
</div>
</div>-->
</div>
</div>
<!--<div class="layui-card card-common card-brief">
<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">
<div class="layui-input-inline">
<input type="number" name="font_size" value="14" lay-verify="int" class="layui-input print-size len-short">
</div>
<span class="layui-form-mid">px</span>
</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="scale" value="1" class="layui-input proportion len-short">
</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 name="width" type="number" value="766" lay-verify="int" class="layui-input show-width len-short">
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input name="height" type="number" value="510" lay-verify="int" class="layui-input show-height len-short">
</div>
</div>
<div class="word-aux">尺寸单位px用于打印模板预览效果的尺寸值为整数且不能小于0</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">实际尺寸:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<span id="realWidth">766</span>
</div>
<div class="layui-form-mid">*</div>
<div class="layui-input-inline">
<span id="realHeight">510</span>
</div>
<span class="layui-word-aux">单位px实际尺寸由当前尺寸乘以比例所得</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">打印选项:</label>
<div class="layui-input-block">
{foreach $print_item_list as $print_k=>$print_v}
<span class="print-option" data-print-name="{$print_v.item_name}">{$print_v.item_title}</span>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">效果图预览:</label>
<div class="layui-input-block design-sketch"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">打印背景图:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box" >
<div class="upload-default" id="printBackground">
<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" name="background_image" />
</div>
<p id="printBackground" class="no-replace">替换</p>
<i class="del">x</i>
</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="checkbox" name="is_electronicsheet" lay-skin="switch" lay-filter="express_sheet">
</div>
</div>
<div class="layui-form-item express-sheet-rule layui-hide">
<label class="layui-form-label">电子面单规则:</label>
<div class="discount-box"></div>
<div class="layui-input-block form-row">
<span class="layui-form-mid">面单模版</span>
<div class="layui-input-inline">
<input type="text" class="layui-input len-short" id="template_style" autocomplete="off">
</div>
<span class="layui-form-mid">,TemplateSize</span>
<div class="layui-input-inline">
<input type="text" class="layui-input len-short" id="template_size" autocomplete="off">
</div>
<button class="layui-btn" onclick="submitRule()">确定规则设置</button>
</div>
</div>
<!-- </div>
</div> -->
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
<script src="STATIC_JS/Tdrag.min.js"></script>
<script>
var delRule,submitRule,printStyle=[],expressSheetChecked;
layui.use(['form'], function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
var logo_upload = new Upload({
elem: '#companyLOGO'
});
// 打印背景图
var bg_upload = new Upload({
elem: '#printBackground',
callback:function (res) {
if (res.code >= 0) {
$(".design-sketch").css("background", "url("+ ns.img(res.data.pic_path) +") no-repeat center/ cover");
}
},
deleteCallback:function () {
$(".design-sketch").css("background", "");
}
});
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if (expressSheetChecked && !printStyle.length){
layer.msg("电子面单规则不能为空");
return false;
}
var content = [];
$(".design-sketch div").each(function () {
var item = {};
item.item_name = $(this).attr("class").substring(5);
item.item_title = $(this).text();
item.left = $(this).position().left;
item.top = $(this).position().top;
content.push(item);
});
if (expressSheetChecked) data.field.is_electronicsheet = 1;
data.field.content_json = JSON.stringify(content);
data.field.print_style = JSON.stringify(printStyle);
// 删除图片
if(!data.field.logo) logo_upload.delete();
if(!data.field.background_image) bg_upload.delete();
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/express/addCompany"),
data: data.field,
dataType: 'JSON',
type: 'POST',
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/express/expressCompany")
layer.close(index);
},
btn2: function (index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
});
});
/**
* 表单验证
*/
form.verify({
sorts: function(value){
if (value == '') {
return;
}
if (value%1 != 0) {
return '排序数值必须为整数';
}
if (value < 0) {
return '排序数值必须为大于0';
}
},
int: function (value) {
if (value == '') {
return;
}
if (value < 0 && value%1 != 0) {
return '请输入0或正整数!'
}
}
});
/**
* 预览内容添加
*/
$(".print-option").click(function(){
var dataValue = $(this).text(),
dataId = $(this).attr("data-print-name");
var fontSize = $("input[name=font_size]").val();
if (fontSize == '') {
fontSize = 14;
}
if ($(".span_"+ dataId).length > 0) {
return false;
} else {
$(this).addClass("bg-color-gray");
$(this).css("cursor", "not-allowed");
}
var html = '<div class="span_' + dataId + '">'+
'<span style="font-size: '+ fontSize +'px;">' + dataValue + '</span>'+
'<i class="iconfont iconclose_light" onclick="remove(this)"></i>'+
'</div>';
$(".design-sketch").append(html);
$(".span_" + dataId).hover(function () {
$(this).find("i").show();
}, function () {
$(this).find("i").hide();
});
$(".span_" + dataId).Tdrag({
scope: ".design-sketch"
});
});
/**
* 改变效果图宽和高
*/
$(".show-width").blur(function(){
$(".design-sketch").css("width", $(this).val());
$("#realWidth").text($(this).val() * $(".proportion").val());
});
$(".show-height").blur(function(){
$(".design-sketch").css("height", $(this).val());
$("#realHeight").text($(this).val() * $(".proportion").val());
});
/**
* 实际尺寸
*/
$(".proportion").blur(function () {
$(this).val();
$("#realWidth").text($(this).val() * $(".show-width").val());
$("#realHeight").text($(this).val() * $(".show-height").val());
});
/**
* 打印字体大小
*/
$(".print-size").blur(function(){
$(".design-sketch span").css("font-size", $(this).val() + "px");
});
//电子面单
form.on('switch(express_sheet)', function(data){
data.elem.checked ? $(".express-sheet-rule").removeClass("layui-hide") : $(".express-sheet-rule").addClass("layui-hide");
expressSheetChecked = data.elem.checked;
submitRule = function() {
var templateStyle = $("#template_style").val().trim(),
templateSize = $("#template_size").val().trim();
if (!templateStyle) {
layer.msg("面单模版不能为空", {icon: 5, anim: 6});
return false;
}
for (var i=0; i < $(".discount-box .discount").length; i++) {
var ident= $(".discount-box .discount").eq(i).find(".template-size").text();
if (templateSize == ident) {
layer.msg("TemplateSize值已添加不可重复添加");
return false;
}
}
var html = '<div class="discount form-row">'+
'<div class="discount-con">'+
'<p>电子面单模版风格:<span class="required">' + templateStyle + '</span>TemplateSize值<span class="required template-size">' + templateSize + '</span></p>'+
'</div>'+
'<div class="discount-del">'+
'<button class="layui-btn" onclick="delRule(this)">删除</button>'+
'</div>'+
'</div>';
$(".discount-box").append(html);
printStyle.push({template_name:templateStyle,template_size:templateSize});
};
delRule = function(obj) {
var val = $(obj).parents(".discount").find(".template-size").text();
for (var i = 0; i < printStyle.length; i++){
if (printStyle[i].template_size == val){
printStyle.splice(i,1);
}
}
$(obj).parent().parent().remove();
}
});
});
function remove(e) {
var that = e;
$(that).parent().remove();
var attr_name = $(that).parent().attr("class").substring(5);
$(".print-option").each(function () {
var print_name = $(this).attr("data-print-name");
if (attr_name == print_name) {
$(this).removeClass("bg-color-gray");
$(this).css("cursor", "pointer");
}
});
}
function back(){
location.hash = ns.hash("shop/express/expressCompany");
}
</script>

View File

@@ -0,0 +1,198 @@
<style>
.add-distribution{cursor: pointer;}
.area-modal{
display: flex;
justify-content: space-around;
align-items: center;
padding: 25px 0;
}
.area-modal .area-list{
width: 255px;
height: 375px;
align-items: center;
border: 1px solid #ccc;
}
.area-modal .title{
height: 35px;
line-height: 35px;
text-align: center;
background-color: #d7d7d7;
}
.area-modal .add{
background-color: transparent;
border: 1px solid #ccc;
padding: 5px 10px;
cursor: pointer;
}
.area-modal .box{
overflow-y: auto;
padding: 10px 0;
height: 340px;
box-sizing: border-box;
}
.modal-operation{
display: flex;
justify-content: center;
align-items: center;
height: 50px;
}
.area-list .box{
height: 314px;
margin: 10px 0;
overflow-y:auto;
overflow-x:hidden;
}
.area-list .box ul li{
line-height: 30px;
cursor: pointer;
background-color:#fff;
}
.area-list .box ul li .title-div{
position:relative;
padding-left:20px;
}
.area-list .box ul li[data-level='2'] .title-div{
margin-left:10px;
}
.area-list .box ul li[data-level='3'] .title-div{
margin-left:20px;
}
.area-list .box ul li[data-level='4'] .title-div{
margin-left:30px;
}
.area-list.all-area .box ul li.selected{
background: #d7d7d7;
}
.area-list .area-btn,.area-list .area-btn-null,.area-list .area-delete{
position:absolute;
top:9px;
display:block;
width: 15px;
height: 15px;
border-radius: 50%;
background-color: #d7d7d7;
color: #fff;
line-height: 15px;
text-align: center;
cursor: pointer;
}
.area-list .area-btn{
left:3px;
}
.area-list .area-btn-null{
background-color:transparent;
left:3px;
}
.area-list .area-delete{
right:6px;
}
.area-list.all-area .area-delete{
display:none;
}
.area-list.all-area .area-btn.selected{
background-color: #fff;
color: #d7d7d7;
}
</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="template_name" type="text" placeholder="请输入模版名称" lay-verify="required" class="layui-input len-long" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">计费方式:</label>
<div class="layui-input-block">
{foreach $fee_type_obj as $fee_type_k => $fee_type_v}
<input type="radio" lay-filter="fee_type" name="json" value="{$fee_type_k}" title="{$fee_type_v.name}" {if $fee_type_k == 1} checked {/if}>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否默认:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_default" lay-filter="is_default" value="1" lay-skin="switch" checked/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>配送区域:</label>
<div class="layui-input-block">
<table id="distributionArea" class="layui-table">
<colgroup>
<col width="40%">
<col width="15%">
<col width="15%">
<col width="15%">
<col width="15%">
</colgroup>
<thead>
<tr>
<th>可配送区域</th>
<th data-name="snum">首重Kg</th>
<th >运费(元)</th>
<th data-name="xnum">续件重Kg</th>
<th >续费(元)</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="5" class="text-color add-distribution js-add-record">指定可配送区域和运费</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">指定包邮:</label>
<div class="layui-input-block">
<input type="checkbox" name="appoint_free_shipping" lay-filter="appoint_free_shipping" value="1" lay-skin="switch" checked/>
</div>
</div>
<div class="layui-form-item free-shipping">
<label class="layui-form-label"><span class="required">*</span>包邮地区:</label>
<div class="layui-input-block">
<table id="shippingArea" class="layui-table">
<colgroup>
<col width="50%">
<col width="25%">
<col width="25%">
</colgroup>
<thead>
<tr>
<th>选择地区</th>
<th >包邮件数</th>
<th >包邮金额(元)</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="5" class="text-color add-distribution js-add-record">指定包邮区域</td>
</tr>
</tbody>
</table>
</div>
<div class="word-aux">达到包邮条件需包邮件数和包邮金额都达到设置的数值。包邮优先级高于其他运费计算方式</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick=" window.history.go(-1);">返回</button>
</div>
</div>
<input type="hidden" value='{$area_level}' id="area_level"/><!-- 配送地区等级 -->
<input type="hidden" value='{$fee_type_json}' id="fee_type_json"/><!-- 计费方式相关数据 -->
<input type="hidden" value="" id="surplus_area_ids">
<input type="hidden" value="" id="shipping_surplus_area_ids">
<input type="hidden" value="" id="template_id">
<input type="hidden" value="1" id="is_default">
<script type='text/javascript' src='SHOP_JS/express_add_template.js?time=20250110'></script>

View File

@@ -0,0 +1,539 @@
<style>
.design-sketch{border: 1px solid #ccc;position: relative;}
.design-sketch div{display: inline-block;border: 1px solid #ccc;padding: 10px;margin: 8px;border-radius: 2px;color: #555;white-space: nowrap;user-select: none;background-color: #fff;line-height: 1;}
.design-sketch div i{position: absolute;top: -10px;right: -10px;display: none;width: 20px;height: 20px;border-radius: 10px;background-color: rgba(0, 0, 0, .5);color: #FFFFFF;text-align: center;line-height: 20px;z-index: 99;}
.print-option{display: inline-block;border: 1px solid #E5E5E5;line-height: 1;padding: 10px;margin-left: 5px;margin-bottom: 8px;border-radius: 2px;color: #545454;cursor: pointer;}
.form-row{margin-top: 0;margin-left: 220px;}
.express-sheet-rule .form-row{margin-left: 200px;}
.bg-color-gray{background-color: #E5E5E5!important;}
.discount {margin-bottom: 15px; display: flex; justify-content: space-between; height: 34px; line-height: 34px; padding: 5px 15px; background-color: #F6FBFD; border: 1px dashed #BCE8F1; }
</style>
<div class="layui-form">
<div class="layui-card card-common card-brief">
<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"><span class="required">*</span>物流公司名称:</label>
<div class="layui-input-inline">
<input type="text" name="company_name" value="{$company_info.data.company_name}" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label short-label ">物流公司LOGO</label>
<div class="layui-input-inline">
<div class="upload-img-block">
<div class="upload-img-box {if !empty($company_info.data.logo)}hover{/if}">
<div class="upload-default" id="companyLOGO">
{if empty($company_info.data.logo)}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{else/}
<div id="preview_companyLOGO" class="preview_img">
<img layer-src src="{:img($company_info.data.logo)}" alt="" class="img_prev">
</div>
{/if}
</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" name="logo" value="{$company_info.data.logo}" />
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="number" name="sort" value="{$company_info.data.sort}" lay-verify="sorts" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">排序值必须为整数</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">URL</label>
<div class="layui-input-block">
<input type="text" name="url" value="{$company_info.data.url}" class="layui-input len-long">
</div>
<p class="word-aux">请输入物流公司官方网址</p>
</div>
<div class="layui-form-item">
<label class="layui-form-label">快递鸟编码:</label>
<div class="layui-input-block">
<input type="text" name="express_no" value="{$company_info.data.express_no}" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">快递100编码</label>
<div class="layui-input-block">
<input type="text" name="express_no_kd100" value="{$company_info.data.express_no_kd100}" class="layui-input len-long">
</div>
</div>
<!--<div class="layui-form-item">
<label class="layui-form-label">菜鸟物流编码:</label>
<div class="layui-input-block">
<input type="text" name="express_no_cainiao" value="{$company_info.data.express_no_cainiao}" class="layui-input len-long">
</div>
</div>-->
</div>
</div>
<!--<div class="layui-card card-common card-brief">
<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">
<div class="layui-input-inline">
<input type="number" name="font_size" lay-verify="int" value="{$company_info.data.font_size}" class="layui-input print-size len-short">
</div>
<span class="layui-form-mid">px</span>
</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="scale" value="{$company_info.data.scale}" class="layui-input proportion len-short">
</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 name="width" type="number" value="{$company_info.data.width}" lay-verify="int" class="layui-input show-width len-short">
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input name="height" type="number" value="{$company_info.data.height}" lay-verify="int" class="layui-input show-height len-short">
</div>
</div>
<div class="word-aux">尺寸单位px用于打印模板预览效果的尺寸值为整数且不能小于0</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">实际尺寸:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<span id="realWidth"></span>
</div>
<div class="layui-form-mid">*</div>
<div class="layui-input-inline">
<span id="realHeight"></span>
</div>
</div>
<div class="word-aux">单位px实际尺寸由当前尺寸乘以比例所得</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">打印选项:</label>
<div class="layui-input-block">
{foreach $print_item_list as $print_k=>$print_v}
<span class="print-option" data-print-name="{$print_v.item_name}">{$print_v.item_title}</span>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">效果图预览:</label>
<div class="layui-input-block design-sketch">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">打印背景图:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box {if !empty($company_info.data.background_image)}hover{/if}">
<div class="upload-default" id="printBackground">
{if empty($company_info.data.background_image)}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{else/}
<div id="preview_printBackground" class="preview_img">
<img layer-src src="{:img($company_info.data.background_image)}" alt="" class="img_prev">
</div>
{/if}
</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" name="background_image" value="{$company_info.data.background_image}" />
</div>
<p id="printBackground" class=" {if condition="$company_info.data.background_image"} replace {else/} no-replace{/if}">替换</p>
<i class="del {if !empty($company_info.data.background_image)}show{/if}">x</i>
</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="checkbox" name="is_electronicsheet" lay-skin="switch" lay-filter="express_sheet" {if $company_info.data.is_electronicsheet == 1}checked {/if}>
</div>
</div>
<div class="layui-form-item express-sheet-rule {if $company_info.data.is_electronicsheet != 1}layui-hide{/if}">
<label class="layui-form-label">电子面单规则:</label>
<div class="discount-box">
</div>
<div class="layui-input-block form-row">
<span class="layui-form-mid">面单模版</span>
<div class="layui-input-inline">
<input type="text" class="layui-input len-short" id="template_style" lay-verify="num" autocomplete="off">
</div>
<span class="layui-form-mid">,TemplateSize</span>
<div class="layui-input-inline">
<input type="text" class="layui-input len-short" id="template_size" lay-verify="num" autocomplete="off">
</div>
<button class="layui-btn" onclick="submitRule()">确定规则设置</button>
</div>
</div>
<!-- </div>
</div>-->
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
<input type="hidden" name="company_id" value="{$company_info.data.company_id}" />
<input type="hidden" class="bg-img-pri" value="{:img($company_info.data.background_image)}" />
<input type="hidden" class="print-con" value="{$company_info.data.content_json}" /> <!-- 打印内容 -->
</div>
<script src="STATIC_JS/Tdrag.min.js"></script>
<script>
$(document).ready(function () {
var img = $(".bg-img-pri").val();
$("#realWidth").text($(".proportion").val() * $(".show-width").val());
$("#realHeight").text($(".proportion").val() * $(".show-height").val());
$(".design-sketch").css({
"width": $(".show-width").val() + "px",
"height": $(".show-height").val() + "px",
"background": "url("+ img +") no-repeat center/ cover"
});
var arr = JSON.parse($(".print-con").val());
var fontSize = $("input[name=font_size]").val();
if (fontSize == 0 || fontSize == '') {
fontSize = 14;
}
for (index in arr) {
var class_name = arr[index].item_name,
span_text = arr[index].item_title,
top = arr[index].top,
left = arr[index].left;
$(".print-option").each(function () {
var print_name = $(this).attr("data-print-name");
if (class_name == print_name) {
$(this).addClass("bg-color-gray");
$(this).css("cursor", "not-allowed");
}
});
var html = '<div class="span_' + class_name + '" style="top: '+ top +'px; left: '+ left +'px;">'+
'<span style="font-size: '+ fontSize +'px;">' + span_text + '</span>'+
'<i class="iconfont iconclose_light" onclick="remove(this)"></i>'+
'</div>';
$(".design-sketch").append(html);
$(".span_" + arr[index].item_name).hover(function () {
$(this).find("i").show();
}, function () {
$(this).find("i").hide();
});
$(".span_" + arr[index].item_name).Tdrag({
scope: ".design-sketch"
});
}
});
</script>
<script>
var delRule,submitRule,expressSheetChecked,printStyle='{:html_entity_decode($company_info.data.print_style)}' ? JSON.parse('{:html_entity_decode($company_info.data.print_style)}') : [];
layui.use(['form'],function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
var logo_upload = new Upload({
elem: '#companyLOGO'
});
// 打印背景图
var bg_upload = new Upload({
elem: '#printBackground',
callback:function (res) {
if (res.code >= 0) {
$(".design-sketch").css("background", "url("+ ns.img(res.data.pic_path) +") no-repeat center/ cover");
}
},
deleteCallback:function () {
$(".design-sketch").css("background", "");
}
});
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
if($("input[name='is_electronicsheet']").is(':checked')) {
expressSheetChecked = true;
}
if (expressSheetChecked && !printStyle.length){
layer.msg("电子面单规则不能为空");
return false;
}
var content = [];
$(".design-sketch div").each(function () {
var item = {};
item.item_name = $(this).attr("class").substring(5);
item.item_title = $(this).text();
item.left = $(this).position().left;
item.top = $(this).position().top;
content.push(item);
});
if (expressSheetChecked) data.field.is_electronicsheet = 1;
data.field.content_json = JSON.stringify(content);
data.field.print_style = JSON.stringify(printStyle);
// 删除图片
if(!data.field.logo) logo_upload.delete();
if(!data.field.background_image) bg_upload.delete();
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/express/editCompany"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res){
repeat_flag = false;
if(res.code == 0){
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("shop/express/expressCompany")
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
});
});
/**
* 预览内容添加
*/
$(".print-option").click(function(){
var dataValue = $(this).text(),
dataId = $(this).attr("data-print-name");
var fontSize = $("input[name=font_size]").val();
if (fontSize == '' || fontSize == 0) {
fontSize = 14;
}
if ($(".span_"+ dataId).length > 0) {
return false;
} else {
$(this).addClass("bg-color-gray");
$(this).css("cursor", "not-allowed");
}
var html = '<div class="span_' + dataId + '" style="font-size: '+ fontSize +'px;">'+
'<span>' + dataValue + '</span>'+
'<i class="iconfont iconclose_light" onclick="remove(this)"></i>'+
'</div>';
$(".design-sketch").append(html);
$(".span_" + dataId).hover(function () {
$(this).find("i").show();
}, function () {
$(this).find("i").hide();
});
$(".span_" + dataId).Tdrag({
scope: ".design-sketch"
});
});
/**
* 改变效果图宽和高
*/
$(".show-width").blur(function(){
$(".design-sketch").css("width", $(this).val());
$("#realWidth").text($(this).val() * $(".proportion").val() + "px");
});
$(".show-height").blur(function(){
$(".design-sketch").css("height", $(this).val());
$("#realHeight").text($(this).val() * $(".proportion").val() + "px");
});
/**
* 实际尺寸
*/
$(".proportion").blur(function () {
$(this).val();
$("#realWidth").text($(this).val() * $(".show-width").val() + "px");
$("#realHeight").text($(this).val() * $(".show-height").val() + "px");
});
/**
* 打印字体大小
*/
$(".print-size").blur(function(){
$(".design-sketch span").css("font-size", $(this).val() + "px");
});
/**
* 表单验证
*/
form.verify({
sorts: function(value){
if (value == '') {
return;
}
if (value%1 != 0) {
return '排序数值必须为整数';
}
if (value < 0) {
return '排序数值必须为大于0';
}
},
int: function (value) {
if (value == '') {
return;
}
if (value < 0 && value%1 != 0) {
return '请输入正整数!'
}
}
});
//电子面单
var printStyleInfo = '{:html_entity_decode($company_info.data.print_style)}' ? JSON.parse('{:html_entity_decode($company_info.data.print_style)}') : [];
if (printStyleInfo.length){
for (var i = 0; i < printStyleInfo.length; i++){
var html = '<div class="discount form-row">'+
'<div class="discount-con">'+
'<p>电子面单模版风格:<span class="required">' + printStyleInfo[i].template_name + '</span>TemplateSize值<span class="required template-size">' + printStyleInfo[i].template_size + '</span></p>'+
'</div>'+
'<div class="discount-del">'+
'<button class="layui-btn" onclick="delRule(this)">删除</button>'+
'</div>'+
'</div>';
$(".discount-box").append(html);
}
}
form.on('switch(express_sheet)', function(data){
expressSheetChecked = data.elem.checked;
data.elem.checked ? $(".express-sheet-rule").removeClass("layui-hide") : $(".express-sheet-rule").addClass("layui-hide");
});
submitRule = function() {
var templateStyle = $("#template_style").val().trim(),
templateSize = $("#template_size").val().trim();
if (!templateStyle) {
layer.msg("面单模版不能为空", {icon: 5, anim: 6});
return false;
}
for (var i=0; i < $(".discount-box .discount").length; i++) {
var ident= $(".discount-box .discount").eq(i).find(".template-size").text();
if (templateSize == ident) {
layer.msg("TemplateSize值已添加不可重复添加");
return false;
}
}
var html = '<div class="discount form-row">'+
'<div class="discount-con">'+
'<p>电子面单模版风格:<span class="required">' + templateStyle + '</span>TemplateSize值<span class="required template-size">' + templateSize + '</span></p>'+
'</div>'+
'<div class="discount-del">'+
'<button class="layui-btn" onclick="delRule(this)">删除</button>'+
'</div>'+
'</div>';
$(".discount-box").append(html);
printStyle.push({template_name:templateStyle,template_size:templateSize});
};
delRule = function(obj) {
var val = $(obj).parents(".discount").find(".template-size").text();
for (var i = 0; i < printStyle.length; i++){
if (printStyle[i].template_size == val){
printStyle.splice(i,1);
}
}
$(obj).parent().parent().remove();
}
});
function remove(e) {
var that = e;
$(that).parent().remove();
var attr_name = $(that).parent().attr("class").substring(5);
$(".print-option").each(function () {
var print_name = $(this).attr("data-print-name");
if (attr_name == print_name) {
$(this).removeClass("bg-color-gray");
$(this).css("cursor", "pointer");
}
});
}
function back(){
location.hash = ns.hash("shop/express/expressCompany");
}
</script>

View File

@@ -0,0 +1,328 @@
<style>
.design-sketch {
border: 1px solid #ccc;
position: relative;
}
.design-sketch div {
display: inline-block;
border: 1px solid #ccc;
padding: 10px;
margin: 8px;
border-radius: 2px;
color: #555;
white-space: nowrap;
user-select: none;
background-color: #fff;
line-height: 1;
}
.design-sketch div i {
position: absolute;
top: -10px;
right: -10px;
display: none;
width: 20px;
height: 20px;
border-radius: 10px;
background-color: rgba(0, 0, 0, .5);
color: #FFFFFF;
text-align: center;
line-height: 20px;
z-index: 99;
}
.print-option {
display: inline-block;
border: 1px solid;
line-height: 1;
padding: 10px;
margin-left: 5px;
margin-bottom: 8px;
border-radius: 2px;
color: #545454;
cursor: pointer;
}
.bg-color-gray {
background-color: #E5E5E5!important;
}
</style>
<div class="layui-form form-wrap">
<input type="hidden" name="company_id" value="{$company_id}">
<input type="hidden" name="id" value="{$id}">
<div class="layui-form-item">
<label class="layui-form-label">打印字体大小:</label>
<div class="layui-input-block">
{if condition="$info.font_size"}
<input type="number" name="font_size" value="{$info.font_size}" class="layui-input print-size len-short" autocomplete="off">
{else/}
<input type="number" value="14" name="font_size" class="layui-input print-size len-short" autocomplete="off">
{/if}
</div>
<div class="word-aux">
<p>请输入字体大小字体单位px用于控制打印模板的文字大小</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">显示尺寸:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
{if condition="$info.width"}
<input name="width" type="number" value="{$info.width}" lay-verify="int" class="layui-input show-width len-short" autocomplete="off">
{else/}
<input name="width" type="number" value="766" lay-verify="int" class="layui-input show-width len-short" autocomplete="off">
{/if}
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
{if condition="$info.height"}
<input name="height" type="number" value="{$info.height}" lay-verify="int" class="layui-input show-height len-short" autocomplete="off">
{else/}
<input name="height" type="number" value="510" lay-verify="int" class="layui-input show-height len-short" autocomplete="off">
{/if}
</div>
</div>
<div class="word-aux">
<p>尺寸单位px用于控制打印模板的尺寸</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">打印选项:</label>
<div class="layui-input-block">
{foreach $print_item_list as $print_k=>$print_v}
<span class="print-option" data-print-name="{$print_v.item_name}">{$print_v.item_title}</span>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">效果图预览:</label>
<div class="layui-input-block design-sketch"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">打印背景图:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box">
{if empty($info.background_image)}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{else/}
<img layer-src src="{:img($info.background_image)}" alt="">
{/if}
</div>
<p id="printBackground" class=" {if condition="$info.background_image"} replace {else/} no-replace{/if}">替换</p>
<input type="hidden" class="bg-img-pri" name="background_image" value="{$info.background_image}" /> <!-- 预览背景图 -->
<i class="del {if !empty($info.background_image)}show{/if}">x</i>
</div>
</div>
<p class="word-aux">上传打印背景图会在打印时以背景形式显示在打印纸上,可在效果预览图中查看效果</p>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
<input type="hidden" class="print-con" value="{$info.content_json}" /> <!-- 打印内容 -->
</div>
<script src="STATIC_JS/Tdrag.min.js"></script>
<script>
$(document).ready(function () {
var img = $(".bg-img-pri").val();
$(".design-sketch").css({
"background": "url("+ img +") no-repeat center/ cover",
"width": $("input[name=width]").val(),
"height": $("input[name=height]").val()
});
if ($(".print-con").val() != '') {
var arr = JSON.parse($(".print-con").val());
var fontSize = $("input[name=font_size]").val();
if (fontSize == '') {
fontSize = 14;
}
for (index in arr) {
var class_name = arr[index].item_name,
span_text = arr[index].item_title,
top = arr[index].top,
left = arr[index].left;
$(".print-option").each(function () {
var print_name = $(this).attr("data-print-name");
if (class_name == print_name) {
$(this).addClass("bg-color-gray");
$(this).css("cursor", "not-allowed");
}
});
var html = '<div class="span_' + class_name + '" style="top: '+ top +'px; left: '+ left +'px; font-size: '+ fontSize +'px;">'+
'<span>' + span_text + '</span>'+
'<i class="iconfont iconclose_light" onclick="remove(this)"></i>'+
'</div>';
$(".design-sketch").append(html);
$(".span_" + arr[index].item_name).hover(function () {
$(this).find("i").show();
}, function () {
$(this).find("i").hide();
});
$(".span_" + arr[index].item_name).Tdrag({
scope: ".design-sketch"
});
}
}
});
</script>
<script>
layui.use(['form'],function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
var upload = new Upload({
elem: '#printBackground',
callback:function (res) {
if (res.code >= 0) {
$(".design-sketch").css("background", "url("+ ns.img(res.data.pic_path) +") no-repeat center/ cover");
}
},
deleteCallback:function () {
$(".design-sketch").css("background", "");
}
});
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
var content = [];
$(".design-sketch div").each(function () {
var item = {};
item.item_name = $(this).attr("class").substring(5);
item.item_title = $(this).text();
item.left = $(this).position().left;
item.top = $(this).position().top;
content.push(item);
});
data.field.content_json = JSON.stringify(content);
// 删除图片
if(!data.field.background_image) upload.delete();
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/express/editprinttemplate"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("shop/express/expressCompany");
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
});
});
/**
* 预览内容添加
*/
$(".print-option").click(function(){
var dataValue = $(this).text(),
dataId = $(this).attr("data-print-name");
var fontSize = $("input[name=font_size]").val();
if (fontSize == '') {
fontSize = 14;
}
if ($(".span_"+ dataId).length > 0) {
return false;
} else {
$(this).addClass("bg-color-gray");
$(this).css("cursor", "not-allowed");
}
var html = '<div class="span_' + dataId + '" style="font-size: '+ fontSize +'px;">'+
'<span>' + dataValue + '</span>'+
'<i class="iconfont iconclose_light" onclick="remove(this)"></i>'+
'</div>';
$(".design-sketch").append(html);
$(".span_" + dataId).hover(function () {
$(this).find("i").show();
}, function () {
$(this).find("i").hide();
});
$(".span_" + dataId).Tdrag({
scope: ".design-sketch"
});
});
/**
* 改变效果图宽和高
*/
$(".show-width").blur(function(){
$(".design-sketch").css("width", $(this).val());
$("#realWidth").text($(this).val() * $(".proportion").val() + "px");
});
$(".show-height").blur(function(){
$(".design-sketch").css("height", $(this).val());
$("#realHeight").text($(this).val() * $(".proportion").val() + "px");
});
/**
* 打印字体大小
*/
$(".print-size").blur(function(){
$(".design-sketch span").css("font-size", $(this).val() + "px");
});
});
function remove(e) {
var that = e;
$(that).parent().remove();
var attr_name = $(that).parent().attr("class").substring(5);
$(".print-option").each(function () {
var print_name = $(this).attr("data-print-name");
if (attr_name == print_name) {
$(this).removeClass("bg-color-gray");
$(this).css("cursor", "pointer");
}
});
}
function back(){
location.hash = ns.hash("shop/express/expressCompany");
}
</script>

View File

@@ -0,0 +1,277 @@
<style>
.add-distribution{cursor: pointer;}
.area-modal{
display: flex;
justify-content: space-around;
align-items: center;
padding: 25px 0;
}
.area-modal .area-list{
width: 255px;
height: 375px;
align-items: center;
border: 1px solid #ccc;
}
.area-modal .title{
height: 35px;
line-height: 35px;
text-align: center;
background-color: #d7d7d7;
}
.area-modal .add{
background-color: transparent;
border: 1px solid #ccc;
padding: 5px 10px;
cursor: pointer;
}
.area-modal .box{
overflow-y: auto;
padding: 10px 0;
height: 340px;
box-sizing: border-box;
}
.modal-operation{
display: flex;
justify-content: center;
align-items: center;
height: 50px;
}
.area-list .box{
height: 314px;
margin: 10px 0;
overflow-y:auto;
overflow-x:hidden;
}
.area-list .box ul li{
line-height: 30px;
cursor: pointer;
background-color:#fff;
}
.area-list .box ul li .title-div{
position:relative;
padding-left:20px;
}
.area-list .box ul li[data-level='2'] .title-div{
margin-left:10px;
}
.area-list .box ul li[data-level='3'] .title-div{
margin-left:20px;
}
.area-list .box ul li[data-level='4'] .title-div{
margin-left:30px;
}
.area-list.all-area .box ul li.selected{
background: #d7d7d7;
}
.area-list .area-btn,.area-list .area-btn-null,.area-list .area-delete{
position:absolute;
top:9px;
display:block;
width: 15px;
height: 15px;
border-radius: 50%;
background-color: #d7d7d7;
color: #fff;
line-height: 15px;
text-align: center;
cursor: pointer;
}
.area-list .area-btn{
left:3px;
}
.area-list .area-btn-null{
background-color:transparent;
left:3px;
}
.area-list .area-delete{
right:6px;
}
.area-list.all-area .area-delete{
display:none;
}
.area-list.all-area .area-btn.selected{
background-color: #fff;
color: #d7d7d7;
}
.right-opt {
float: right;
}
.right-opt span {
cursor: pointer;
}
</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 value="{$info['template_name']}" name="template_name" type="text" placeholder="请输入模版名称" lay-verify="required" class="layui-input len-long" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">计费方式:</label>
<div class="layui-input-block">
{foreach $fee_type_obj as $fee_type_k => $fee_type_v}
<input type="radio" name="json" lay-filter="fee_type" value="{$fee_type_k}" title="{$fee_type_v.name}" {if $fee_type_k == $info['fee_type']} checked {/if}>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否默认:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_default" lay-filter="is_default" value="1" lay-skin="switch" {if condition="$info.is_default == 1"} checked {/if} />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>配送区域:</label>
<div class="layui-input-block">
<table id="distributionArea" class="layui-table">
<colgroup>
<col width="40%">
<col width="15%">
<col width="15%">
<col width="15%">
<col>
</colgroup>
<thead>
<tr>
<th>可配送区域</th>
{if $info['fee_type'] eq 1}
<th data-name="snum">首重Kg</th>
{elseif $info['fee_type'] eq 2}
<th data-name="snum">首体积(m³)</th>
{else/}
<th data-name="snum">首件(个)</th>
{/if}
<th >运费(元)</th>
{if $info['fee_type'] eq 1}
<th data-name="xnum">续重Kg</th>
{elseif $info['fee_type'] eq 2}
<th data-name="xnum">续体积(m³)</th>
{else/}
<th data-name="xnum">续件(个)</th>
{/if}
<th >续费(元)</th>
</tr>
</thead>
<tbody>
{volist name="$info['template_item']" id="item" key="key"}
<tr data-selected="{$key}">
<td>
<p class="area-show">
{$item.area_names}
<span class="right-opt">
<span class="opt-update express-opt-update text-color" data-selected="{$key}">修改</span>&nbsp;
<span class="opt-delete express-opt-delete text-color" data-selected="{$key}">删除</span>
</span>
</p>
</td>
<td>
<div class="layui-input-inline">
<input type="text" name="snum" data-selected="{$key}" class="layui-input" value="{$item.snum}">
</div>
</td>
<td>
<div class="layui-input-inline">
<input type="text" name="sprice" data-selected="{$key}" class="layui-input" value="{$item.sprice}">
</div>
</td>
<td>
<div class="layui-input-inline">
<input type="text" name="xnum" data-selected="{$key}" class="layui-input" value="{$item.xnum}">
</div>
</td>
<td>
<div class="layui-input-inline">
<input type="text" name="xprice" data-selected="{$key}" class="layui-input" value="{$item.xprice}">
</div>
</td>
<input type="hidden" value="{$item.area_ids}" data-selected="{$key}" data-snum="{$item.snum}" data-sprice="{$item.sprice}" data-xnum="{$item.xnum}" data-xprice="{$item.xprice}" class="area_ids" data-name="{$item.area_names}">
</tr>
{/volist}
<tr>
<td colspan="5" class="text-color add-distribution js-add-record">指定可配送区域和运费</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">指定包邮:</label>
<div class="layui-input-block">
<input type="checkbox" name="appoint_free_shipping" lay-filter="appoint_free_shipping" value="1" lay-skin="switch" {if condition="$info.appoint_free_shipping == 1"} checked {/if}/>
</div>
</div>
<div class="layui-form-item free-shipping {if !$info.appoint_free_shipping} layui-hide {/if}">
<label class="layui-form-label"><span class="required">*</span>包邮地区:</label>
<div class="layui-input-block">
<table id="shippingArea" class="layui-table">
<colgroup>
<col width="50%">
<col width="25%">
<col width="25%">
</colgroup>
<thead>
<tr>
<th>选择地区</th>
<th >包邮件数</th>
<th >包邮金额(元)</th>
</tr>
</thead>
<tbody>
{volist name="$info['shipping_template_item']" id="item" key="key"}
<tr data-selected="{$key}">
<td>
<p class="area-show">
{$item.area_names}
<span class="right-opt">
<span class="opt-update shipping-opt-update text-color" data-selected="{$key}">修改</span>&nbsp;
<span class="opt-delete shipping-opt-delete text-color" data-selected="{$key}">删除</span>
</span>
</p>
</td>
<td>
<div class="layui-input-inline">
<input type="text" name="snum" data-selected="{$key}" class="layui-input" value="{$item.snum}">
</div>
</td>
<td>
<div class="layui-input-inline">
<input type="text" name="sprice" data-selected="{$key}" class="layui-input" value="{$item.sprice}">
</div>
</td>
<input type="hidden" value="{$item.area_ids}" data-selected="{$key}" data-snum="{$item.snum}" data-sprice="{$item.sprice}" class="area_ids" data-name="{$item.area_names}">
</tr>
{/volist}
<tr>
<td colspan="5" class="text-color add-distribution js-add-record">指定包邮区域</td>
</tr>
</tbody>
</table>
</div>
<div class="word-aux">达到包邮条件需包邮件数和包邮金额都达到设置的数值。包邮优先级高于其他运费计算方式</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick=" window.history.go(-1);">返回</button>
</div>
</div>
<input type="hidden" value='{$info['template_id']}' id="template_id"/><!-- 模板id 添加为0 -->
<input type="hidden" value='{$fee_type_json}' id="fee_type_json"/><!-- 计费方式相关数据 -->
<input type="hidden" value='{$info.fee_type}' id="fee_type"/><!-- 计费方式 -->
<input type="hidden" value='{$area_level}' id="area_level"/><!-- 配送地区等级 -->
<input type="hidden" value='{$info['template_item']|count}' id="opt_total"/><!-- 模板项的总数 在修改的时候作为操作序列的起点 -->
<input type="hidden" value='{$info['shipping_template_item']|count}' id="shipping_opt_total"/><!-- 模板项的总数 在修改的时候作为操作序列的起点 -->
<input type="hidden" value='{$info['surplus_area_ids']}' id="surplus_area_ids"/>
<input type="hidden" value='{$info['shipping_surplus_area_ids']}' id="shipping_surplus_area_ids"/>
<input type="hidden" value="{$info['is_default']}" id="is_default">
<script type='text/javascript' src='SHOP_JS/express_add_template.js?time=20250110'></script>

View File

@@ -0,0 +1,249 @@
<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="search_text" placeholder="请输入物流公司名称" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="expressCompany" lay-filter="expressCompany"></table>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<!-- logo -->
<script type="text/html" id="company">
<div class="table-tuwen-box">
<div class="img-box">
{{# if(d.logo){ }}
<img layer-src src={{ns.img(d.logo)}} >
{{# } }}
</div>
</div>
</script>
<!-- 批量删除 -->
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="del">批量删除</button>
</script>
<!-- 批量删除 -->
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="del">批量删除</button>
</script>
<!-- url -->
<script type="text/html" id="url">
{{# if (d.url != ''){ }}
<a class="layui-elip" target="_blank" href="{{ns.url(d.url)}}">{{d.url}}</a>
{{# } else { }}
<a class="layui-elip" target="_blank" href="javascript:;"></a>
{{# } }}
</script>
<!-- 编辑排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.company_id}}, this)" value="{{d.sort}}" class="layui-input edit-sort len-short">
</script>
<script>
var form, table;
layui.use(['form'], function() {
form = layui.form;
var repeat_flag = false; //防重复标识
table = new Table({
elem: '#expressCompany',
url: ns.url("shop/express/expressCompany"),
cols: [
[{
width: '3%',
type: 'checkbox',
unresize: 'false'
}, {
title: '公司logo',
unresize: 'false',
templet:'#company',
width: '10%'
}, {
field:'company_name',
title: '公司名称',
unresize: 'false',
width: '20%'
}, {
field: 'url',
title: '物流公司网址',
unresize: 'false',
width: '25%',
templet:'#url'
},{
title: '排序',
unresize: 'false',
width:'15%',
templet: '#editSort'
},{
title: '电子面单',
unresize: 'false',
width:'12%',
templet: function(data){
if(data.is_electronicsheet == 1){
return '支持';
}else{
return '不支持';
}
}
},{
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
toolbar: '#toolbarOperation',
bottomToolbar: "#batchOperation"
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.hash = ns.hash("shop/express/editCompany?company_id=" + data.company_id);
break;
case 'delete': //删除
deleteCompany(data.company_id);
break;
}
});
/**
* 删除
*/
function deleteCompany(company_ids) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该物流公司吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/express/deleteCompany"),
data: {company_ids},
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;
});
}
/**
* 批量操作
*/
table.bottomToolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "del":
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].company_id);
deleteCompany(id_array.toString());
break;
}
});
/**
* 批量操作
*/
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "del":
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].company_id);
deleteCompany(id_array.toString());
break;
}
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
// 监听单元格编辑(排序)
function editSort(id, event){
var data = $(event).val();
if (data == '') {
$("input[name=sort]").val(0);
data = 0;
}
if(!new RegExp("^-?[0-9]\\d*$").test(data)){
layer.msg("排序号只能是整数");
return ;
}
if(data<0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url("shop/express/modifySort"),
data: {
sort: data,
company_id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if(res.code==0){
table.reload();
}
}
});
}
function add() {
location.hash = ns.hash("shop/express/addCompany");
}
</script>

View File

@@ -0,0 +1,187 @@
<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="keyword" placeholder="请输入模板名称关键字" class="layui-input len-mid" 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>
<!-- 列表 -->
<table id="template" lay-filter="template"></table>
<!-- 默认 -->
<script type="text/html" id="is_default">
{{ d.is_default == 1 ? '是' : '否' }}
</script>
<!-- 状态 -->
<script type="text/html" id="fee_type">
{{# if(d.fee_type == 1){ }}
重量(kg)
{{# } }}
{{# if(d.fee_type == 2){ }}
体积()
{{# } }}
{{# if(d.fee_type == 3){ }}
按件
{{# } }}
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
{{# if(d.is_default == 0){ }}
<a class="layui-btn" lay-event="default">设为默认</a>
<a class="layui-btn" lay-event="delete">删除</a>
{{# }}}
<a class="layui-btn" lay-event="edit">编辑</a>
</div>
</script>
<!-- 批量删除 -->
<script type="text/html" id="batchOperation">
<button class="layui-btn layui-btn-primary" lay-event="del">批量删除</button>
</script>
<script>
layui.use(['form'], function() {
var table,
form = layui.form,
repeat_flag = false; //防重复标识
form.render();
table = new Table({
elem: '#template',
url: ns.url("shop/express/template"),
cols: [
[{
type: 'checkbox',
unresize: 'false',
width: '3%'
}, {
field: 'template_name',
title: '名称',
unresize: 'false',
align: 'left',
width: '27%'
}, {
field: 'fee_type',
title: '运费计算方式',
unresize: 'false',
align: 'center',
width: '20%',
templet: '#fee_type'
}, {
field: 'is_default',
title: '是否默认',
unresize: 'false',
align: 'center',
width: '25%',
templet: '#is_default'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
bottomToolbar: "#batchOperation"
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.hash = ns.hash("shop/express/editTemplate", {"template_id": data.template_id});
break;
case 'delete': //删除
deleteCompany(data.template_id);
break;
case 'default': //默认
defaultTemplate(data.template_id);
break;
}
});
/**
* 删除
*/
function deleteCompany(template_id) {
layer.confirm('确定要删除该运费模板吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/express/deleteTemplate"),
data: {template_id},
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;
}
switch (obj.event) {
case "del":
var id_array = new Array();
for (i in obj.data) id_array.push(obj.data[i].template_id);
deleteCompany(id_array.toString());
break;
}
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
/**
* 设置默认
*/
function defaultTemplate(template_id){
$.ajax({
url: ns.url("shop/express/defaultTemplate"),
data: {template_id},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
}
});
function add() {
location.hash = ns.hash("shop/express/addTemplate");
}
</script>

100
app/shop/view/express/trace.html Executable file
View File

@@ -0,0 +1,100 @@
<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">
<div class="layui-input-inline">
{foreach $traces_type as $k => $v}
<input type="radio" name="traces_type" value="{$v.name}" lay-filter="traces_type" title="{$v.title}" {$v.is_use == 1 ? 'checked' : ''} />
{/foreach}
</div>
</div>
</div>
</div>
</div>
<div class="layui-form-item config-item kd100"{if $kd100_config.is_use != 1} style="display:none;"{/if}>
<label class="layui-form-label">APPKEY</label>
<div class="layui-input-block">
<input type="text" name="appkey" placeholder="请输入内容APPKEY" value="{$kd100_config.value.appkey ?? ''}" autocomplete="off" class="layui-input len-long">
</div>
<div class="word-aux">快递100应用密钥</div>
</div>
<div class="layui-form-item config-item kd100"{if $kd100_config.is_use != 1} style="display:none;"{/if}>
<label class="layui-form-label">CUSTOMER</label>
<div class="layui-input-block">
<input type="text" name="customer" placeholder="请输入CUSTOMER" value="{$kd100_config.value.customer ?? ''}" autocomplete="off" class="layui-input len-long">
</div>
<div class="word-aux">快递100分配给的公司编号</div>
</div>
<div class="layui-form-item config-item kdbird"{if $kdbird_config.is_use != 1} style="display:none;"{/if}>
<label class="layui-form-label">EBusinessID</label>
<div class="layui-input-block">
<input type="text" name="EBusinessID" placeholder="请输入电商ID" value="{$kdbird_config.value.EBusinessID ?? ''}" autocomplete="off" class="layui-input len-long">
</div>
<div class="word-aux">快递鸟电商ID请到快递鸟官网申请http://kdniao.com/reg</div>
</div>
<div class="layui-form-item config-item kdbird"{if $kdbird_config.is_use != 1} style="display:none;"{/if}>
<label class="layui-form-label">AppKey</label>
<div class="layui-input-block">
<input type="text" name="AppKey" placeholder="请输入AppKey" value="{$kdbird_config.value.AppKey ?? ''}" autocomplete="off" class="layui-input len-long">
</div>
<div class="word-aux">快递鸟分配的电商加密私钥请到快递鸟官网申请http://kdniao.com/reg</div>
</div>
<div class="layui-form-item config-item kdbird" {if $kdbird_config.is_use != 1} style="display:none;"{/if}>
<label class="layui-form-label">套餐类型:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<!-- <input type="radio" name="kdniao_request_type" value="1002" title="免费版" autocomplete="off" class="layui-input len-long" {if $kdbird_config.value.RequestType == 1002} checked {/if}>-->
<input type="radio" name="kdniao_request_type" value="8002" title="按次付费" autocomplete="off" class="layui-input len-long" {if $kdbird_config.value.RequestType == 8002} checked {/if}>
<input type="radio" name="kdniao_request_type" value="8001" title="按单付费" autocomplete="off" class="layui-input len-long" {if $kdbird_config.value.RequestType == 8001} checked {/if}>
</div>
</div>
<div class="word-aux">
<!-- <p>1、免费版限500次/天只支持3家快递申通、圆通、百世有效期半年代码1002</p>-->
<p>1、按次付费查询相同单号查询多次计费多次代码8002</p>
<p>2、按单付费查询相同单号查询多次计费一次代码8001</p>
</div>
</div>
<div class="single-filter-box">
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
</div>
<script>
layui.use('form', function() {
var form = layui.form,
repeat_flag = false; //防重复标识
form.render();
form.on('radio(traces_type)', function(data){
$(".config-item").hide();
$("."+data.value).show();
});
form.on('submit(save)', function(data) {
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/express/trace"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res) {
repeat_flag = false;
layer.msg(res.message);
}
});
});
});
</script>

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>

View File

@@ -0,0 +1,219 @@
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_attr.css"/>
<style>
.layui-layer-page .layui-layer-content {overflow: auto!important;}
</style>
<div class="custom-panel form-wrap">
<!--商品类型基础信息-->
<div class="custom-panel-content">
<ul class="panel-content">
<li>
<div>
<span>模板名称:</span>
<span>{$attr_class_info['class_name']}</span>
</div>
<div>
<span>排序:</span>
<span>{$attr_class_info['sort']}</span>
</div>
</li>
</ul>
<a class="panel-operation text-color" href="javascript:editAttrClassPopup();">编辑</a>
<!--编辑商品类型-->
<script type="text/html" id="editAttrClass">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-inline">
<input name="class_name" type="text" value="{$attr_class_info['class_name']}" placeholder="请输入模板名称" lay-verify="required" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">排序</label>
<div class="layui-input-block">
<input name="sort" type="number" value="{$attr_class_info['sort']}" placeholder="请输入排序" lay-verify="num" class="layui-input len-short">
</div>
<div class="word-aux mid">排序值必须为整数</div>
</div>
<input type="hidden" name="class_id" value="{$attr_class_info['class_id']}">
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="save_attr">保存</button>
</div>
</div>
</script>
</div>
<!--商品参数管理-->
<div class="custom-panel-content attribute">
<!-- 列表 -->
<table id="attribute_list" lay-filter="attribute_list"></table>
<!-- 操作 -->
<script type="text/html" id="attributeOperation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<div class="form-row sm">
<button class="layui-btn" onclick="addAttributePopup()">添加商品参数</button>
</div>
<!--添加关联属性-->
<script type="text/html" id="addAttribute">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="attr_name" type="text" placeholder="请输入商品参数名称" lay-verify="required" class="layui-input len-long" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">参数类型</label>
<div class="layui-input-block len-mid">
<select name="attr_type" lay-filter="attr_type">
<option value="1">单选</option>
<option value="2">多选</option>
<option value="3">输入</option>
</select>
</div>
<div class="word-aux">
<p>注意参数类型确定后不允许更改输入不参与筛选</p>
</div>
</div>
<div class="attribute-value-list">
<table class="layui-table">
<colgroup>
<col width="60%">
<col width="40%">
</colgroup>
<thead>
<tr>
<th>参数名称</th>
<th>操作</th>
</tr>
</thead>
</table>
<div class="table-wrap">
<table class="layui-table">
<colgroup>
<col width="60%">
<col width="40%">
</colgroup>
<tbody></tbody>
</table>
</div>
<button class="layui-btn layui-btn-primary" type="button" onclick="addAttrValue()">添加参数</button>
</div>
<input type="hidden" name="attr_class_id" value="{$attr_class_info['class_id']}">
<input type="hidden" name="attr_class_name" value="{$attr_class_info['class_name']}">
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save_add_attribute">保存</button>
</div>
</div>
</script>
<!--编辑关联参数-->
<script type="text/html" id="editAttribute">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="attr_name" type="text" value="{{d.attr_name}}" placeholder="请输入参数名称" lay-verify="required" class="layui-input len-long" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">参数类型</label>
<div class="layui-input-block len-mid">
<select name="attr_type" lay-filter="attr_type">
{{# if(d.attr_type == 1){ }}
<option value="1" disabled selected>单选</option>
{{# }else if(d.attr_type == 2){ }}
<option value="2" disabled selected>多选</option>
{{# }else if(d.attr_type == 3){ }}
<option value="3" disabled selected>输入</option>
{{# } }}
</select>
</div>
<div class="word-aux">
<p>注意参数类型不可更改输入不参与筛选</p>
</div>
</div>
{{# if(d.attr_type == 1 || d.attr_type == 2){ }}
<div class="attribute-value-list">
<table class="layui-table">
<colgroup>
<col width="60%">
<col width="40%">
</colgroup>
<thead>
<tr>
<th>参数名称</th>
<th>操作</th>
</tr>
</thead>
</table>
<div class="table-wrap">
<table class="layui-table">
<colgroup>
<col width="60%">
<col width="40%">
</colgroup>
<tbody></tbody>
</table>
</div>
<button class="layui-btn layui-btn-primary" type="button" onclick="addAttrValue()">添加参数</button>
</div>
{{# } }}
<input type="hidden" name="attr_class_id" value="{$attr_class_info['class_id']}">
<input type="hidden" name="attr_class_name" value="{$attr_class_info['class_name']}">
<input type="hidden" name="attr_id" value="{{d.attr_id}}">
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save_edit_attribute">保存</button>
</div>
</div>
</script>
</div>
</div>
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.attr_class_id}},{{d.attr_id}},this)" value="{{d.sort}}" placeholder="请输入排序" class="layui-input edit-sort len-short">
</script>
<script>
var attr_class_id = "{$attr_class_info['class_id']}";
</script>
<script src="SHOP_JS/goods_edit_attr.js"></script>

View File

@@ -0,0 +1,236 @@
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="addAttr()">添加商品参数模板</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_keys" placeholder="请输入商品参数模板名称" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="attr_class_list" lay-filter="attr_class_list"></table>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">管理</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script type="text/html" id="addAttr">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="class_name" type="text" placeholder="请输入商品参数名称" lay-verify="required" class="layui-input len-mid" maxlength="20">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">排序</label>
<div class="layui-input-block">
<input name="sort" type="number" value="0" placeholder="请输入排序" lay-verify="num" class="layui-input len-short">
</div>
<p class="word-aux mid">排序值必须为整数</p>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.class_id}},this)" value="{{d.sort}}" placeholder="请输入排序" class="layui-input edit-sort len-short">
</script>
<script>
var laytpl, add_attr_index = -1,
form, table;
layui.use(['form', 'laytpl'], function() {
var repeat_flag = false; //防重复标识
laytpl = layui.laytpl;
form = layui.form;
form.render();
table = new Table({
elem: '#attr_class_list',
url: ns.url("shop/goodsattr/lists"),
cols: [
[ {
field: 'class_name',
title: '模板名称',
width: '50%',
unresize: 'false'
}, {
field: 'sort',
unresize: 'false',
title: '排序',
width: '30%',
sort : true,
templet: '#editSort'
}, {
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/goodsattr/editattr?class_id=" + data.class_id);
break;
case 'delete':
deleteAttr(data.class_id);
break;
}
});
/**
* 删除
*/
function deleteAttr(class_id) {
layer.confirm('删除商品参数后将会删除对应关联关系,移除后数据会发生不可逆转的行为,请谨慎操作', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goodsattr/deleteAttr"),
data: {
class_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
});
}
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
form.on('submit(save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: '{:addon_url("shop/goodsattr/addAttr")}',
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_attr_index);
}
repeat_flag = false;
}
});
return false;
});
/**
* 表单验证
*/
form.verify({
num: function(value) {
if (value == '') {
return;
}
if (value % 1 != 0) {
return '排序数值必须为整数';
}
if (value < 0) {
return '排序数值必须为大于0';
}
}
});
});
// 监听单元格编辑
function editSort(id, event) {
var data = $(event).val();
if (!new RegExp("^-?[1-9]\\d*$").test(data)) {
layer.msg("排序号只能是整数");
return;
}
if(data<0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url("shop/goodsattr/modifySort"),
data: {
sort: data,
class_id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
}
function addAttr() {
var add_attr = $("#addAttr").html();
laytpl(add_attr).render({}, function(html) {
add_attr_index = layer.open({
title: '添加商品参数',
skin: 'layer-tips-class',
type: 1,
area: ['500px', '250px'],
content: html
});
});
}
function closeAttrLayer() {
layer.close(add_attr_index);
}
</script>

View File

@@ -0,0 +1,165 @@
<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-inline len-long">
<input name="brand_name" type="text" lay-verify="required" class="layui-input">
</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="brand_desc" maxlength="100" lay-verify="brand_desc" placeholder="请输入品牌简介不能超过100个字符"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">品牌logo</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block">
<div class="upload-img-box">
<div class="upload-default" id="imgUpload">
<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" name="image_url" value=""/>
</div>
</div>
</div>
<div class="word-aux">
<p>建议图片尺寸200px * 100px。</p>
<p>图片格式jpg、png、jpeg。</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">品牌广告图:</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block">
<div class="upload-img-box">
<div class="upload-default" id="imgBannerUpload">
<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" name="banner" value=""/>
</div>
</div>
</div>
<div class="word-aux">
<p>建议图片尺寸200px * 100px。</p>
<p>图片格式jpg、png、jpeg。</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" name="sort" class="layui-input" placeholder="0" autocomplete="off">
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
<script>
layui.use(['form'], function() {
var form = layui.form,
repeat_flag = false;//防重复标识
form.render();
/**
* 表单验证
*/
form.verify({
// 品牌简介
brand_desc: function (value) {
if (value.length > 100) {
element.tabChange('goods_tab', "basic");
return '品牌简介不能超过100个字符';
}
},
num: function (value) {
if (value == '') {
return;
}
if (value%1 != 0) {
return '排序数值必须为整数';
}
if (value < 0) {
return '排序数值必须为大于0';
}
}
});
// 普通图片上传
var logo_upload = new Upload({
elem: '#imgUpload'
});
var banner_upload = new Upload({
elem: '#imgBannerUpload'
});
form.on('submit(save)', function (data) {
if (repeat_flag) return false;
repeat_flag = true;
if(!data.field.image_url) logo_upload.delete();
if(!data.field.banner) banner_upload.delete();
$.ajax({
url: '{:addon_url("shop/goodsbrand/addBrand")}',
data: data.field,
dataType: 'json',
type: 'post',
success: function (res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
yes: function(index, layero) {
location.hash = ns.hash("shop/goodsbrand/lists");
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
})
}else{
layer.msg(res.message);
}
}
});
});
});
function back(){
location.hash = ns.hash("shop/goodsbrand/lists")
}
</script>

View File

@@ -0,0 +1,152 @@
<style>
.select-goods-brand{margin: 20px;}
.select-goods-brand .single-filter-box{padding: 0;}
.select-goods-brand .single-filter-box .layui-form{margin: inherit;}
.select-goods-brand .single-filter-box .layui-form div{margin: 0;}
</style>
<div class="select-goods-brand">
<div class="single-filter-box">
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入品牌名称" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<table id="goods_brand_list" lay-filter="goods_brand_list"></table>
</div>
<script type="text/html" id="checkbox">
<input type="checkbox" data-brand-id="{{d.brand_id}}" name="brand_checkbox" lay-skin="primary" lay-filter="brand_checkbox">
<input type="hidden" data-brand-id="{{d.brand_id}}" name="brand_json" value='{{ JSON.stringify(d) }}' />
</script>
<script>
var select_id = localStorage.getItem('goods_brand_select_id') || '', // "{$select_id}", //选中商品品牌id
brandList ={:json_encode($brand_list)},
selectList = {}, //选中商品品牌所有数据res
brandIdArr = select_id.length ? select_id.split(',') : [], //已选中的商品品牌id
table, form,laytpl,element;
$(function () {
for (var k in brandList) {
selectList['brand_id_' + brandList[k].brand_id] = {
brand_id: brandList[k].brand_id,
brand_name: brandList[k].brand_name,
image_url: brandList[k].image_url,
}
}
layui.use(['form', 'laytpl', 'element'], function () {
form = layui.form;
laytpl = layui.laytpl;
element = layui.element;
table = new Table({
elem: '#goods_brand_list',
url: '{:addon_url("shop/goodsbrand/brandselect")}',
cols: [
[
{
title: '<input type="checkbox" name="brand_checkbox_all" lay-skin="primary" lay-filter="brand_checkbox_all">',
width: "8%",
templet: '#checkbox'
},
{
field: 'brand_name',
title: '品牌名称',
width: '60%'
},
{
field: 'image_url',
title: '品牌图片',
width: '30%',
templet: function (d) {
return `<img layer-src src="${ns.img(d.image_url)}"/>`;
}
},
]
],
callback: function (res) {
// 更新复选框状态
for (var i = 0; i < brandIdArr.length; i++) {
var selected_brand = $("input[name='brand_checkbox'][data-brand-id='" + brandIdArr[i] + "']");
if (selected_brand.length) {
selected_brand.prop("checked", true);
}
}
form.render();
dealWithTableSelectedNum();
}
});
form.on('submit(search)', function (data) {
formSearch();
return false;
});
//公共搜索方法
function formSearch() {
var data = {};
data.search_text = $("input[name='search_text']").val();
data.brand_ids = brandIdArr.toString();
table.reload({
page: {
curr: 1
},
where: data
});
}
// 勾选商品品牌
form.on('checkbox(brand_checkbox_all)', function (data) {
var all_checked = data.elem.checked;
$("input[name='brand_checkbox']").each(function () {
var checked = $(this).prop('checked');
if (all_checked != checked) {
$(this).next().click();
}
})
});
// 勾选商品品牌
form.on('checkbox(brand_checkbox)', function (data) {
var brand_id = $(data.elem).attr("data-brand-id");
var spuLen = $("input[name='brand_checkbox'][data-brand-id=" + brand_id + "]:checked").length;
if (spuLen) {
var item = JSON.parse($("input[name='brand_json'][data-brand-id=" + brand_id + "]").val());
delete item.LAY_INDEX;
delete item.LAY_TABLE_INDEX;
selectList['brand_id_' + brand_id] = item;
} else {
delete selectList['brand_id_' + brand_id];
}
dealWithTableSelectedNum();
});
});
});
function selectGoodsBrandListener(callback) {
brandIdArr = [];
for (var key in selectList){
brandIdArr.push(selectList[key].brand_id);
}
if(brandIdArr.length == 0) {
layer.msg('请选择商品品牌');
return;
}
callback({
brandIds: brandIdArr,
list: selectList
});
}
//在表格底部增加了一个容器
function dealWithTableSelectedNum() {
$(".layui-table-bottom-left-container").html('已选择 '+ Object.keys(selectList).length +' 个商品品牌');
}
</script>

View File

@@ -0,0 +1,180 @@
<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-inline len-long">
<input name="brand_name" type="text" value="{$brand_info['brand_name']}" lay-verify="required" class="layui-input ">
</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="brand_desc" maxlength="100" lay-verify="brand_desc" placeholder="请输入品牌简介不能超过100个字符">{$brand_info['brand_desc']}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">品牌logo</label>
<div class="layui-input-block">
<input type="hidden" name="brand_id" value="{$brand_info['brand_id']}">
<div class="upload-img-block">
<div class="upload-img-box {notempty name="$brand_info['image_url']"}hover{/notempty}">
<div class="upload-default" id="imgUpload">
{if condition="$brand_info['image_url']"}
<div id="preview_imgUpload" class="preview_img">
<img layer-src src="{:img($brand_info['image_url'])}" class="img_prev"/>
</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" 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" name="image_url" value="{$brand_info['image_url']}">
</div>
</div>
</div>
<div class="word-aux">
<p>建议图片尺寸200px * 100px。</p>
<p>图片格式jpg、png、jpeg。</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">品牌广告图:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box {notempty name="$brand_info['banner']"}hover{/notempty}">
<div class="upload-default" id="imgBannerUpload">
{if condition="$brand_info['banner']"}
<div id="preview_imgBannerUpload" class="preview_img">
<img layer-src src="{:img($brand_info['banner'])}" class="img_prev"/>
</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" 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" name="banner" value="{$brand_info['banner']}">
</div>
</div>
</div>
<div class="word-aux">
<p>建议图片尺寸200px * 100px。</p>
<p>图片格式jpg、png、jpeg。</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input type="number" name="sort" value="{$brand_info['sort']}" class="layui-input" placeholder="0" autocomplete="off">
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="back()">返回</button>
</div>
</div>
<script>
layui.use(['form'], function() {
var form = layui.form,
repeat_flag = false;//防重复标识
form.render();
/**
* 表单验证
*/
form.verify({
// 品牌简介
brand_desc: function (value) {
if (value.length > 100) {
element.tabChange('goods_tab', "basic");
return '品牌简介不能超过100个字符';
}
},
num: function (value) {
if (value == '') {
return;
}
if (value%1 != 0) {
return '排序数值必须为整数';
}
if (value < 0) {
return '排序数值必须为大于0';
}
}
});
// 普通图片上传
var logo_upload = new Upload({
elem: '#imgUpload'
});
var banner_upload = new Upload({
elem: '#imgBannerUpload'
});
form.on('submit(save)', function (data) {
if (repeat_flag) return false;
repeat_flag = true;
if(!data.field.image_url) logo_upload.delete();
if(!data.field.banner) banner_upload.delete();
$.ajax({
url: '{:addon_url("shop/goodsbrand/editBrand")}',
data: data.field,
dataType: 'json',
type: 'post',
success: function (res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("shop/goodsbrand/lists");
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
})
}else{
layer.msg(res.message);
}
}
});
return false;
});
});
function back(){
location.hash = ns.hash("shop/goodsbrand/lists")
}
</script>

View File

@@ -0,0 +1,173 @@
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="addBrand()">添加品牌</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_keys" placeholder="请输入品牌名称" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<table id="brand_list" lay-filter="brand_list"></table>
<script type="text/html" id="image_url">
{{# if(d.image_url){ }}
<div class="img-box">
<img layer-src src={{ns.img(d.image_url)}} >
</div>
{{# } }}
</script>
<script type="text/html" id="banner">
{{# if(d.banner){ }}
<div class="img-box">
<img layer-src src={{ns.img(d.banner)}} >
</div>
{{# } }}
</script>
<!-- 操作 -->
<script type="text/html" id="action">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<!-- 编辑排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.brand_id}}, this)" value="{{d.sort}}" class="layui-input edit-sort">
</script>
<script>
var form, table;
layui.use(['table', 'form'], function() {
form = layui.form;
form.render();
table = new Table({
elem: '#brand_list',
url: ns.url("shop/goodsbrand/lists"),
cols: [
[
/* {
width: "3%",
type: 'checkbox',
unresize: 'false'
}, */
{
field: 'brand_name',
title: '品牌名称',
width: '30%',
unresize: 'false'
}, {
field: 'image_url',
title: '品牌LOGO',
width: '15%',
unresize: 'false',
templet: "#image_url"
}, {
field: 'banner',
title: '品牌广告图',
width: '15%',
unresize: 'false',
templet: "#banner"
},{
unresize: 'false',
title: '排序',
width: '15%',
templet: '#editSort'
}, {
title: '操作',
width: '25%',
toolbar: '#action',
align:'right',
unresize: 'false'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit':
location.hash = ns.hash("shop/goodsbrand/editbrand",{"brand_id":data.brand_id});
break;
case 'delete':
deleteBrand(data.brand_id);
break;
}
});
/**
* 删除
*/
function deleteBrand(brand_id) {
layer.confirm('确定要删除该品牌吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goodsbrand/deleteBrand"),
data: {brand_id: brand_id},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
});
}
/**
* 搜索功能
*/
form.on('submit(search)', function(data){
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
// 监听单元格编辑
function editSort(id, event){
var data = $(event).val();
if(!new RegExp("^-?[0-9]\\d*$").test(data)){
layer.msg("排序号只能是整数");
return ;
}
if(data<0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url("shop/goodsbrand/modifySort"),
data: {
sort: data,
brand_id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if(res.code==0){
table.reload();
}
}
});
}
function addBrand() {
location.hash = ns.hash("shop/goodsbrand/addBrand");
}
</script>

View File

@@ -0,0 +1,230 @@
<style>
.layui-input-inline.js-pid a{margin-left: 20px;}
.link-url-show{margin-right: 10px}
.click-link{height: 34px;line-height: 34px;display: inline-block;white-space: nowrap;text-align: center;border-radius: 2px;cursor: pointer;padding: 0 16px;border: 1px solid #C9C9C9;background-color: #fff;color: #555;}
</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 len-long">
<input name="category_name" type="text" placeholder="请输入分类名称" maxlength="30" lay-verify="required" class="layui-input" autocomplete="off">
</div>
<div class="word-aux">
<p>分类名称最长不超过30个字符</p>
</div>
</div>
<!-- <div class="layui-form-item">
<label class="layui-form-label">简称:</label>
<div class="layui-input-block len-long">
<input name="short_name" type="text" placeholder="请输入简称" maxlength="20" class="layui-input" autocomplete="off">
</div>
<div class="word-aux">
<p>分类名过长设置简称方便显示字数设置为不超过20个字符</p>
</div>
</div>
-->
<div class="layui-form-item">
<label class="layui-form-label">上级分类:</label>
<div class="layui-input-block js-pid">
<span class="input-text">顶级分类</span>
<input type="hidden" name="pid" value="0">
<input type="hidden" name="level" value="1">
<input type="hidden" name="category_id_1" value="0">
<input type="hidden" name="category_id_2" value="0">
<a class="text-color" href="javascript:selectedCategoryPopup();">选择分类</a>
</div>
<div class="word-aux">
<p>如果选择上级分类,那么新增的分类则为被选择上级分类的子分类,不选择上级分类默认为顶级分类</p>
</div>
</div>
<!-- <div class="layui-form-item">
<label class="layui-form-label">商品参数:</label>
<div class="layui-input-block len-mid">
<select name="attr_class_id" lay-filter="attr_class_id">
<option value=""></option>
{foreach name="$attr_class_list" item="vo"}
<option value="{$vo.class_id}">{$vo.class_name}</option>
{/foreach}
</select>
</div>
</div> -->
<div class="layui-form-item">
<label class="layui-form-label">分类图片:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box">
<div class="upload-default" id="imgUpload">
<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" name="image">
</div>
<!-- <p id="imgUpload" class="no-replace">替换</p>
<input type="hidden" name="image">
<i class="del">x</i> -->
</div>
</div>
<div class="word-aux">
<p>建议图片尺寸不能大于100k。图片格式jpg、png、jpeg。</p>
</div>
<a id="imageUploadAction"></a>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类广告图:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box">
<div class="upload-default" id="imgUploadAdv">
<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" name="image_adv" value="">
</div>
<!-- <p id="imgUploadAdv" class="no-replace">替换</p>
<i class="del">x</i> -->
</div>
</div>
<div class="word-aux">
<p>该图片只对一级使用, 建议图片尺寸550px * 250px。图片格式jpg、png、jpeg。</p>
</div>
<a id="imageAdvUploadAction"></a>
</div>
<!-- <div class="layui-form-item">
<label class="layui-form-label">是否显示:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_show" lay-skin="switch" value="1" checked>
</div>
<div class="word-aux">
<p>用于控制前台是否展示</p>
</div>
</div> -->
<div class="layui-form-item link-url-show-wrap">
<label class="layui-form-label">广告链接:</label>
<div class="layui-input-block">
<span class="link-url-show"></span>
<input name="link_url" type="hidden" class="layui-input len-long" autocomplete="off">
<a class="click-link" onclick="selectedLink()">选择链接</a>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">关键字:</label>
<div class="layui-input-block">
<input name="keywords" type="text" placeholder="请输入关键字" class="layui-input len-long" autocomplete="off">
</div>
<div class="word-aux">
<p>用于网站搜索引擎的优化,关键字之间请用英文逗号分隔</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类描述:</label>
<div class="layui-input-block len-long">
<textarea name="description" placeholder="请输入分类描述" class="layui-textarea" maxlength="150"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类图标:</label>
<div class="layui-input-block">
<input name="icon" type="text" placeholder="请输入分类图标类名示例iconfont home" class="layui-input len-long" autocomplete="off">
</div>
<div class="word-aux">
<p>通过引用外部文件实现加载字体图标示例iconfont home</p>
</div>
</div>
<!-- <div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input name="sort" type="number" value="0" placeholder="请输入排序" lay-verify="num" class="layui-input len-short" autocomplete="off">
</div>
<div class="word-aux">
<p>排序值必须为整数</p>
</div>
</div> -->
<div class="layui-form-item">
<label class="layui-form-label">是否推荐</label>
<div class="layui-input-block">
<input type="radio" name="is_recommend" value="1" title="是">
<input type="radio" name="is_recommend" value="0" title="否" checked>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否显示</label>
<div class="layui-input-block">
<input type="radio" name="is_show" value="0" title="显示" checked="">
<input type="radio" name="is_show" value="-1" title="不显示">
</div>
<div class="word-aux">
<p>如果不显示会导致小程序、h5没有该分类以及该分类下的所有商品</p>
</div>
</div>
<div class="form-row">
<button class="layui-btn bg-color" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="backGoodsCategoryList()">返回</button>
</div>
</div>
<script type="text/html" id="selectedCategory">
<form class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label sm">一级分类</label>
<div class="layui-input-block len-mid">
<select name="category_id_1" lay-filter="category_id_1">
<option value="0" data-level="0">顶级分类</option>
{{# for(var i=0;i<d.category_list_1.length;i++){ }}
{{# if(d.category_id_1 ==d.category_list_1[i].category_id){ }}
<option value="{{ d.category_list_1[i].category_id }}" data-level="{{d.category_list_1[i].level}}" selected>{{ d.category_list_1[i].category_name }}</option>
{{# }else{ }}
<option value="{{ d.category_list_1[i].category_id }}" data-level="{{d.category_list_1[i].level}}">{{ d.category_list_1[i].category_name }}</option>
{{# } }}
{{# } }}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label sm">二级分类</label>
<div class="layui-input-block len-mid">
<select name="category_id_2" lay-filter="category_id_2"></select>
</div>
</div>
<div class="form-row sm">
<button class="layui-btn bg-color" lay-submit lay-filter="save_pid">保存</button>
</div>
</form>
</script>
<script src="SHOP_JS/goods_edit_category.js"></script>

View File

@@ -0,0 +1,346 @@
<style>
.js-pid a{
margin-left: 20px;
}
.form-wrap {
margin-top: 0;
}
.link-url-show{margin-right: 10px}
.click-link{height: 34px;line-height: 34px;display: inline-block;white-space: nowrap;text-align: center;border-radius: 2px;cursor: pointer;padding: 0 16px;border: 1px solid #C9C9C9;background-color: #fff;color: #555;}
.goods-category-list .layui-table td{border-left: 0;border-right: 0;}
.goods-category-list .layui-table .switch{font-size: 16px;cursor: pointer;width: 12px;line-height: 1;display: inline-block;text-align: center;vertical-align: middle;}
.goods-category-list .layui-table img{width: 40px;}
/* 分类样式*/
.table_div{color:#666}
.table_head{display: flex;font-weight: bold;background-color: #F7F7F7;}
.table_head li{height: 50px;line-height: 50px;border: 0;padding: 0 15px;font-size: 14px;font-weight: 400;color: #333;}
.table_head .operate{text-align: right;}
.table_head li:first-child{padding-right: 0;}
.table_tr{display: flex;border-bottom: 1px solid #e6e6e6;background: #fff;align-items: center;}
.table_tr .table_td{position: relative;padding: 5px 15px;font-size: 14px;display: flex;align-items: center;}
.table_tr .table_td span{cursor: pointer;}
.table_tr .table_td span>img{width:12px;height:12px}
.table_tr .table_td span>img.rotate{transform:rotate(90deg);}
.table_tr .table_td .img-box{width:30px;height:30px;line-height: 30px;}
.table_tr .table_td:first-child{padding-right:0}
.table_tr .table-btn{display: flex;flex-wrap: wrap;justify-content: flex-end;}
.table_tr .layui-btn{display: flex;justify-content: center;align-items: center;height: 23px;border-radius: 50px;background-color: transparent;color: var(--base-color);text-align: center;padding: 2px 0;margin: 5px 0 5px 10px;position: relative;}
.table_two_div{display: none;}
.table_three{display: none;}
.empty_switch{display: inline-block;width:30px;height:25px;padding-right:15px;}
.js-switch{display: inline-block;width:30px;text-align: center;}
.table_move{float:left;margin-right: 10px;}
.table_moves{float:left;margin-right: 10px;}
.tables_move{float:left;margin-right: 20px;padding-left: 70px;}
.select-category .layui-layer-content{overflow: auto!important;}
.table_three .table_td.checkbox{
padding-left: 70px;
}
</style>
<form 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="category_name" type="text" value="{$goods_category_info['category_name']}" placeholder="请输入分类名称" maxlength="30" lay-verify="required" class="layui-input len-long" autocomplete="off">
</div>
<div class="word-aux">
<p>分类名称最长不超过30个字符</p>
</div>
</div>
<!-- <div class="layui-form-item">
<label class="layui-form-label">简称:</label>
<div class="layui-input-block">
<input name="short_name" type="text" value="{$goods_category_info['short_name']}" placeholder="请输入简称" maxlength="20" class="layui-input len-long" autocomplete="off">
</div>
<div class="word-aux">
<p>分类名过长设置简称方便显示字数设置为不超过20个字符</p>
</div>
</div> -->
<div class="layui-form-item">
<label class="layui-form-label">上级分类:</label>
<div class="layui-input-block len-mid js-pid">
{if $goods_category_info['pid'] == 0}
<span class="input-text">顶级分类</span>
{else/}
<span class="input-text">{$goods_category_parent_info['category_name']}</span>
{/if}
<input type="hidden" name="pid" value="{$goods_category_info['pid']}">
<input type="hidden" name="level" value="{$goods_category_info['level']}">
<input type="hidden" name="category_id_1" value="{$goods_category_info['category_id_1']}">
<input type="hidden" name="category_id_2" value="{$goods_category_info['category_id_2']}">
<input type="hidden" name="category_id_3" value="{$goods_category_info['category_id_3']}">
<input type="hidden" name="category_name_1" value="">
<a class="text-color" href="javascript:selectedCategoryPopup();">选择分类</a>
</div>
<div class="word-aux">
{if $goods_category_info['level'] == 1}
<p>注意:顶级分类不能修改</p>
{elseif $goods_category_info['level'] == 2}
<p>注意:二级分类可以修改一级分类</p>
{elseif $goods_category_info['level'] == 3}
<p>注意:三级分类可以修改二级分类</p>
{/if}
</div>
</div>
<!-- <div class="layui-form-item">
<label class="layui-form-label">商品参数:</label>
<div class="layui-input-block len-mid">
<select name="attr_class_id" lay-filter="attr_class_id">
<option value=""></option>
{foreach name="$attr_class_list" item="vo"}
<option value="{$vo.class_id}" {if $goods_category_info['attr_class_id'] == $vo['class_id']}selected{/if}>{$vo.class_name}</option>
{/foreach}
</select>
</div>
</div> -->
<div class="layui-form-item">
<label class="layui-form-label">分类图片:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box {notempty name="$goods_category_info['image']"}hover{/notempty}">
<div class="upload-default" id="imgUpload">
{notempty name="$goods_category_info['image']"}
<div id="preview_imgUpload" class="preview_img">
<img layer-src src="{:img($goods_category_info['image'])}" class="img_prev"/>
</div>
{else/}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{/notempty}
</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" name="image" value="{$goods_category_info['image']}">
</div>
</div>
</div>
<div class="word-aux">
<p>建议图片尺寸不能大于100k。图片格式jpg、png、jpeg。</p>
</div>
<a id="imageUploadAction"></a>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类广告图:</label>
<div class="layui-input-block">
<div class="upload-img-block ">
<div class="upload-img-box {notempty name="$goods_category_info['image_adv']"} hover {/notempty}" >
<div class="upload-default" id="imgUploadAdv">
{notempty name="$goods_category_info['image_adv']"}
<div id="preview_imgUploadAdv" class="preview_img">
<img layer-src src="{:img($goods_category_info['image_adv'])}" class="img_prev"/>
</div>
{else/}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{/notempty}
</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" name="image_adv" value="{$goods_category_info['image_adv']}">
</div>
<!-- <p id="imgUploadAdv" class=" {if condition="$goods_category_info['image_adv']"} replace {else/} no-replace{/if}">替换</p> -->
<!-- <i class="del {if condition="$goods_category_info['image_adv']"}show{/if}">x</i> -->
</div>
</div>
<div class="word-aux">
<p>该图片只对一级使用, 建议图片尺寸550px * 250px。图片格式jpg、png、jpeg。</p>
</div>
<a id="imageAdvUploadAction"></a>
</div>
<!-- <div class="layui-form-item">
<label class="layui-form-label">是否显示:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_show" lay-skin="switch" value="1" {if $goods_category_info['is_show']==1}checked{/if}>
</div>
<div class="word-aux">
<p>用于控制前台是否展示</p>
</div>
</div> -->
<div class="layui-form-item link-url-show-wrap">
<label class="layui-form-label">广告链接:</label>
<div class="layui-input-block">
<span class="link-url-show"></span>
<input name="link_url" type="hidden" class="layui-input len-long" autocomplete="off" value="{$goods_category_info.link_url}">
<a class="click-link" onclick="selectedLink()">选择链接</a>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">关键字:</label>
<div class="layui-input-block">
<input name="keywords" type="text" placeholder="请输入关键字" value="{$goods_category_info['keywords']}" class="layui-input len-long" autocomplete="off">
</div>
<div class="word-aux">
<p>用于网站搜索引擎的优化,关键字之间请用英文逗号分隔</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类描述:</label>
<div class="layui-input-inline len-long">
<textarea name="description" placeholder="请输入分类描述" class="layui-textarea" maxlength="150">{$goods_category_info['description']}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类图标:</label>
<div class="layui-input-block">
<input name="icon" type="text" placeholder="请输入分类图标类名示例iconfont home" class="layui-input len-long" autocomplete="off" value="{$goods_category_info['icon']}">
</div>
<div class="word-aux">
<p>通过引用外部文件实现加载字体图标示例iconfont home</p>
</div>
</div>
<!-- <div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input name="sort" type="number" placeholder="请输入排序" lay-verify="num" class="layui-input len-short" value="{$goods_category_info['sort']}">
</div>
<div class="word-aux">
<p>排序值只能为整数</p>
</div>
</div> -->
<div class="layui-form-item">
<label class="layui-form-label">是否推荐</label>
<div class="layui-input-block">
<input type="radio" name="is_recommend" value="1" title="是" {if $goods_category_info['is_recommend'] == 1} checked {/if}>
<input type="radio" name="is_recommend" value="0" title="否" {if $goods_category_info['is_recommend'] == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否显示</label>
<div class="layui-input-block">
<input type="radio" name="is_show" value="0" title="显示" {if $goods_category_info['is_show'] == 0} checked="" {/if}>
<input type="radio" name="is_show" value="-1" title="不显示" {if $goods_category_info['is_show'] == -1} checked="" {/if}>
</div>
<div class="word-aux">
<p>如果不显示会导致小程序、h5没有该分类以及该分类下的所有商品</p>
</div>
</div>
<input type="hidden" id="category_id" name="category_id" value="{$goods_category_info['category_id']}">
<input type="hidden" name="category_full_name" value="{$goods_category_info['category_full_name']}">
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="backGoodsCategoryList()">返回</button>
</div>
</form>
<script type="text/html" id="selectedCategory">
<div class="goods-category-list layui-form">
<div class="table_div" >
<ul class="table_head">
<li style="width:60px"></li>
<li style="flex:6">分类名称</li>
<li style="flex:2">是否显示</li>
</ul>
<div class="table_body">
{if condition="$list"}
{foreach name="$list" item="vo" key="index"}
<li class="table_one" data-index="{$index}" data-sort="{$vo['sort']}" data-cateid="{$vo['category_id']}">
<div class="table_tr">
<div class="table_td" style="width:60px">
<div class="table_move">
<input type="checkbox" name="category_id" title="" lay-skin="primary" data-name="{$vo['category_name']}" value="{$vo['category_id']}" data-category-id="{$vo['category_id']}" data-level="{$vo['level']}" data-open="0" lay-filter="category">
</div>
{notempty name="$vo['child_list']"}
<span class="switch text-color js-switch" data-category-id="{$vo['category_id']}" data-level="{$vo['level']}" data-open="0">+</span>
{/notempty}
</div>
<div class="table_td" style="flex:6">{$vo['category_name']}</div>
<div class="table_td" style="flex:2">
{if $vo['is_show'] == 0} 显示 {else /} {/if}
</div>
</div>
{notempty name="$vo['child_list']"}
<div class="table_two_div">
{foreach name="$vo['child_list']" item="second"}
<div class="table_two" data-index="{$index}" data-sort="{$second['sort']}" data-cateid="{$second['category_id']}">
<div class="table_tr">
<div class="table_td" style="width: 36px">
</div>
<div class="table_td" style="flex:6.4">
<div class="table_move">
<input type="checkbox" name="category_id" title="" lay-skin="primary" value="{$second['category_id']}" data-category-id="{$second['category_id']}" data-level="{$second['level']}" data-open="0" data-name="{$second['category_name']}" lay-filter="category">
</div>
<!-- <span class="switch text-color empty_switch" > </span>-->
<span>{$second['category_name']}</span>
</div>
<div class="table_td" style="flex:2">
{if $second['is_show'] == 0} 显示 {else /} {/if}
</div>
</div>
{notempty name="$second['child_list']"}
<div class="table_three layui-hide">
{foreach name="$second['child_list']" item="third"}
<div class="table_tr table_three_tr" data-sort="{$third['sort']}" data-cateid="{$third['category_id']}">
<div class="table_td" style="width: 36px">
</div>
<div class="table_td checkbox" style="flex:5.5">
<input type="checkbox" name="category_id" title="" lay-skin="primary" data-name="{$third['category_name']}" value="{$third['category_id']}" data-category-id="{$third['category_id']}" data-level="{$third['level']}" data-open="0">
<div>{$third['category_name']}</div>
</div>
<div class="table_td" style="flex:2">
{if $third['is_show'] == 0} 显示 {else /} {/if}
</div>
</div>
{/foreach}
</div>
{/notempty}
</div>
{/foreach}
</div>
{/notempty}
</li>
{/foreach}
{else/}
<div class="table_tr">
<div class="table_td" style="flex:1;text-align: center;">暂无数据</div>
</div>
{/if}
</div>
</div>
</div>
</script>
<script src="SHOP_JS/goods_edit_category.js"></script>

View File

@@ -0,0 +1,372 @@
<style>
.table_body{font-family: arial;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}
.goods-category-list .layui-table td{border-left: 0;border-right: 0;}
.goods-category-list .layui-table .switch{font-size: 16px;cursor: pointer;width: 12px;line-height: 1;display: inline-block;text-align: center;vertical-align: middle;}
.goods-category-list .layui-table img{width: 40px;}
/* 分类样式*/
.table_div{color:#666}
.table_head{display: flex;font-weight: bold;background-color: #F7F7F7;}
.table_head li{height: 50px;line-height: 50px;border: 0;padding: 0 15px;font-size: 14px;font-weight: 400;color: #333;}
.table_head .operate{text-align: right;}
.table_head li:first-child{padding-right: 0;}
.table_tr{display: flex;border-bottom: 1px solid #e6e6e6;background: #fff;align-items: center;}
.table_tr .table_td{position: relative;padding: 5px 15px;font-size: 14px;}
.table_tr .table_td span{cursor: pointer;}
.table_tr .table_td span>img{width:12px;height:12px}
.table_tr .table_td span>img.rotate{transform:rotate(90deg);}
.table_tr .table_td .img-box{width:30px;height:30px;line-height: 30px;}
.table_tr .table_td:first-child{padding-right:0}
.table_tr .table-btn{display: flex;flex-wrap: wrap;justify-content: flex-end;}
.table_tr .layui-btn{display: flex;justify-content: center;align-items: center;height: 23px;border-radius: 50px;background-color: transparent;color: var(--base-color);text-align: center;padding: 2px 0;margin: 5px 0 5px 10px;position: relative;}
.table_two_div{display: none;}
.table_three{display: none;}
.empty_switch{display: inline-block;width:30px;height:25px;padding-right:15px;}
.js-switch{display: inline-block;height:30px;width:30px;text-align: center;line-height: 30px;}
.table_move{cursor: move;float:left;margin-right: 10px;line-height: 30px;}
.table_moves{cursor: move;float:left;margin-right: 10px;}
.tables_move{cursor: move;float:left;margin-right: 20px;padding-left: 70px;}
</style>
<div class="single-filter-box">
<button class="layui-btn" onclick="addCategory()">添加商品分类</button>
</div>
<div class="goods-category-list">
<div class="table_div" >
<ul class="table_head">
<li style="width:60px"></li>
<li style="flex:6">分类名称</li>
<li style="flex:2">图片</li>
<!-- <li style="flex:2">排序</li> -->
<li style="flex:2">是否显示</li>
<li class="operate" style="flex:2">操作</li>
</ul>
<div class="table_body">
{if condition="$list"}
{foreach name="$list" item="vo" key="index"}
<li class="table_one" data-index="{$index}" data-sort="{$vo['sort']}" data-cateid="{$vo['category_id']}">
<div class="table_tr">
<div class="table_td" style="width:60px">
<div class="table_move iconfont icontuodong"></div>
{notempty name="$vo['child_list']"}
<span class="switch text-color js-switch" data-category-id="{$vo['category_id']}" data-level="{$vo['level']}" data-open="0">+</span>
{/notempty}
</div>
<div class="table_td" style="flex:6">{$vo['category_name']}</div>
<div class="table_td" style="flex:2">
{notempty name="$vo['image']"}
<div class="img-box">
<img layer-src src="{:img($vo['image'])}"/>
</div>
{/notempty}
</div>
<!-- <div class="table_td" style="flex:2">
<input type="number" class="layui-input len-short" value="{$vo['sort']}" onchange="editSort('{$vo.category_id}')" id="category_sort{$vo.category_id}">
</div> -->
<div class="table_td layui-form" style="flex:2">
<input type="checkbox" name="is_show" value="{$vo['category_id']}" lay-skin="switch" lay-text="" lay-filter="is_show" {if $vo['is_show'] == 0} checked {/if}>
</div>
<div class="table_td" style="flex:2">
<div class="table-btn">
<a class="layui-btn" href="{:href_url('shop/goodscategory/editcategory',['category_id'=>$vo['category_id']])}">编辑</a>
<a class="layui-btn" href="javascript:deleteCategory({$vo['category_id']});">删除</a>
</div>
</div>
</div>
{notempty name="$vo['child_list']"}
<div class="table_two_div">
{foreach name="$vo['child_list']" item="second"}
<div class="table_two" data-index="{$index}" data-sort="{$second['sort']}" data-cateid="{$second['category_id']}">
<div class="table_tr">
<div class="table_td" style="width: 36px"></div>
<div class="table_td" style="flex:6.2">
<div class="table_moves iconfont icontuodong"></div>
{notempty name="$second['child_list']"}
<span class="switch text-color js-switch" data-category-id="{$second['category_id']}" data-level="{$second['level']}" data-open="0" style="padding-right: 15px;">
+
</span>
{else /}
<span class="switch text-color empty_switch" > </span>
{/notempty}
<span>{$second['category_name']}</span>
</div>
<div class="table_td" style="flex:2">
{notempty name="$second['image']"}
<div class="img-box">
<img layer-src src="{:img($second['image'])}"/>
</div>
{/notempty}
</div>
<!-- <div class="table_td" style="flex:2">
<input type="number" class="layui-input len-short" value="{$second['sort']}" onchange="editSort('{$second.category_id}')" id="category_sort{$second.category_id}">
</div> -->
<!-- <div class="table_td" style="flex:2">-->
<!-- {if $second['is_show'] == 0} 显示 {else /} 隐藏 {/if}-->
<!-- </div>-->
<div class="table_td layui-form" style="flex:2">
<input type="checkbox" name="is_show" value="{$second['category_id']}" lay-skin="switch" lay-text="" lay-filter="is_show" {if $second['is_show'] == 0} checked {/if}>
</div>
<div class="table_td" style="flex:2">
<div class="table-btn">
<a class="layui-btn" href="{:href_url('shop/goodscategory/editcategory',['category_id'=>$second['category_id']])}">编辑</a>
<a class="layui-btn" href="javascript:deleteCategory({$second['category_id']});">删除</a>
</div>
</div>
</div>
{notempty name="$second['child_list']"}
<div class="table_three">
{foreach name="$second['child_list']" item="third"}
<div class="table_tr table_three_tr" data-sort="{$third['sort']}" data-cateid="{$third['category_id']}">
<div class="table_td" style="width: 36px"></div>
<div class="table_td" style="flex:6.2">
<div class="tables_move iconfont icontuodong"></div>
<div>{$third['category_name']}</div>
</div>
<div class="table_td" style="flex:2">
{notempty name="$third['image']"}
<div class="img-box">
<img layer-src src="{:img($third['image'])}"/>
</div>
{/notempty}
</div>
<!-- <div class="table_td" style="flex:2">
<input type="number" class="layui-input len-short" value="{$second['sort']}" onchange="editSort('{$second.category_id}')" id="category_sort{$second.category_id}">
</div> -->
<!-- <div class="table_td" style="flex:2">-->
<!-- {if $third['is_show'] == 0} 显示 {else /} 隐藏 {/if}-->
<!-- </div>-->
<div class="table_td layui-form" style="flex:2">
<input type="checkbox" name="is_show" value="{$third['category_id']}" lay-skin="switch" lay-text="" lay-filter="is_show" {if $third['is_show'] == 0} checked {/if}>
</div>
<div class="table_td" style="flex:2">
<div class="table-btn">
<a class="layui-btn" href="{:href_url('shop/goodscategory/editcategory',['category_id'=>$third['category_id']])}">编辑</a>
<a class="layui-btn" href="javascript:deleteCategory({$third['category_id']});">删除</a>
</div>
</div>
</div>
{/foreach}
</div>
{/notempty}
</div>
{/foreach}
</div>
{/notempty}
</li>
{/foreach}
{else/}
<div class="table_tr">
<div class="table_td" style="flex:1;text-align: center;">暂无数据</div>
</div>
{/if}
</div>
</div>
</div>
<script src="STATIC_EXT/drag-arrange.js"></script>
<script src="STATIC_EXT/diyview/js/ddsort.js"></script>
<script>
var form;
layui.use(['form'], function(){
form = layui.form;
form.on('switch(is_show)', function(data){
$.ajax({
url: ns.url("shop/goodscategory/modifyShow"),
data: {id:data.value,is_show:data.elem.checked ? 0 : -1},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
layer.msg(res.message);
}
});
console.log(data.elem); // 获取当前 checkbox 的 DOM 对象
console.log(data.elem.checked); // 获取当前 checkbox 的选中状态true 或 false
console.log(data.value); // 获取当前 checkbox 的 value 值,即 name 属性的值或者自定义的 value 值(如果有的话)
console.log(data.othis); // 获取当前 checkbox 的 jQuery 对象
});
form.render();
});
$(function() {
var tempPos = '';
$('li').arrangeable({
dragSelector: '.table_move',
callback:function(e){
var temparr = [];
$('.table_one').each(function(index,item){
var tempObj = {};
tempObj.category_id = item.getAttribute('data-cateid');
tempObj.sort = index;
temparr.push(tempObj)
})
setTimeout(function(){
$.ajax({
url: ns.url("shop/goodscategory/modifySort"),
data: {category_sort_array : JSON.stringify(temparr)},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
layer.msg(res.message);
}
});
},100);
}
});
$('.table_two').arrangeable({
dragSelector: '.table_moves',
callback:function(e){
var temparrs = [];
$('.table_two').each(function(index,item){
var tempObjs = {};
tempObjs.category_id = item.getAttribute('data-cateid');
tempObjs.sort = index;
temparrs.push(tempObjs)
})
setTimeout(function(){
$.ajax({
url: ns.url("shop/goodscategory/modifySort"),
data: {category_sort_array : JSON.stringify(temparrs)},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
layer.msg(res.message);
}
});
},100);
}
});
$('.table_three_tr').arrangeable({
dragSelector: '.tables_move',
callback:function(e){
var temparres = [];
$('.table_three_tr').each(function(index,item){
var tempObjes = {};
tempObjes.category_id = item.getAttribute('data-cateid');
tempObjes.sort = index;
temparres.push(tempObjes)
})
setTimeout(function(){
$.ajax({
url: ns.url("shop/goodscategory/modifySort"),
data: {category_sort_array : JSON.stringify(temparres)},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
layer.msg(res.message);
}
});
},100);
}
});
});
// var tempPos = '';
// bindDragSort('.table_body' ,'.table_one');
// bindDragSort('.table_two_div' ,'.table_two');
// bindDragSort('.table_three' ,'.table_tr');
// function bindDragSort(paremtElem,childElem){
// $(paremtElem ).DDSort({
// target: childElem,
// floatStyle: {
// 'border': '1px solid #ccc',
// 'background-color': '#fff'
// },
// down:function(e){
// tempPos = $(this).data('sort');
// },
// up:function(e){
// var index = $(this).index(),self = $(this);
// if(index != tempPos){
// var temparr = [];
// $(childElem).each(function(index,item){
// var tempObj = {};
// tempObj.category_id = item.getAttribute('data-cateid');
// tempObj.sort = index;
// temparr.push(tempObj)
// })
// setTimeout(function(){
// $.ajax({
// url: ns.url("shop/goodscategory/modifySort"),
// data: {category_sort_array : JSON.stringify(temparr)},
// dataType: 'JSON',
// type: 'POST',
// async: false,
// success: function (res) {
// self.data('sort',index)
// layer.msg(res.message);
// }
// });
// },100);
// }
//
// }
// });
// }
$(function () {
loadImgMagnify(); //图片放大
//展开收齐点击事件
$(".js-switch").click(function (event) {
event.stopPropagation();
var category_id = $(this).attr("data-category-id");
var level = $(this).attr("data-level");
var open = parseInt($(this).attr("data-open").toString());
if(open){
$(".goods-category-list .layui-table tr[data-category-id-"+ level+"='" + category_id + "']").hide();
// $(this).children("img").removeClass('rotate');
$(this).text("+");
if(level == 1) $(this).parents('.table_tr').siblings('.table_two_div').hide();
else if(level == 2) $(this).parents('.table_tr').siblings('.table_three').hide();
}else{
$(".goods-category-list .layui-table tr[data-category-id-"+ level+"='" + category_id + "']").show();
$(this).text("-");
// $(this).children("img").addClass('rotate');
if(level == 1) $(this).parents('.table_tr').siblings('.table_two_div').show();
else if(level == 2) $(this).parents('.table_tr').siblings('.table_three').show();
}
$(this).attr("data-open", (open ? 0 : 1));
});
});
function deleteCategory(category_id) {
layer.confirm('子级分类也会删除,请谨慎操作', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goodscategory/deleteCategory"),
data: {category_id : category_id},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
layer.msg(res.message);
if (res.code == 0) {
listenerHash(); // 刷新页面
}
}
});
});
}
function addCategory() {
location.hash = ns.hash("shop/goodscategory/addcategory");
}
</script>

View File

@@ -0,0 +1,293 @@
<style>
.layui-layer-content {padding-bottom: 20px!important;}
</style>
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="addLabel()">添加商品标签</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_keys" placeholder="请输入商品标签名称" autocomplete="off" class="layui-input" maxlength="10">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="attr_class_list" lay-filter="attr_class_list"></table>
<!-- 编辑排序 -->
<script type="text/html" id="editSort">
<input name="sort" type="number" onchange="editSort({{d.id}}, this)" value="{{d.sort}}" class="layui-input edit-sort len-short">
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script type="text/html" id="addLabel">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="label_name" type="text" placeholder="请输入商品标签名称" lay-verify="required" class="layui-input len-mid" maxlength="10">
</div>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<script type="text/html" id="editLabel">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="label_name" type="text" value="{{ d.label_name }}" placeholder="请输入商品标签名称" lay-verify="required" class="layui-input len-mid" maxlength="10">
</div>
</div>
<input type="hidden" name="id" value="{{ d.id }}">
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="edit_save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<script>
var laytpl, add_attr_index = -1,
form, table;
layui.use(['form', 'laytpl'], function() {
var repeat_flag = false; //防重复标识
laytpl = layui.laytpl;
form = layui.form;
form.render();
table = new Table({
elem: '#attr_class_list',
url: ns.url("shop/goodslabel/lists"),
cols: [
[ {
field: 'label_name',
title: '标签名称',
unresize: 'false'
}, {
field: 'sort',
unresize:'false',
title: '排序',
width: '20%',
sort : true,
align: 'center',
templet: '#editSort'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit':
editLabel(data);
break;
case 'delete':
deleteLabel(data.id);
break;
}
});
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 删除
*/
function deleteLabel(id) {
layer.confirm('确认删除该标签吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goodslabel/delete"),
data: {
id:id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
});
}
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
form.on('submit(save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: '{:addon_url("shop/goodslabel/add")}',
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_attr_index);
}
repeat_flag = false;
}
});
return false;
});
form.on('submit(edit_save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: '{:addon_url("shop/goodslabel/edit")}',
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_attr_index);
}
repeat_flag = false;
}
});
return false;
});
/**
* 表单验证
*/
form.verify({
num: function(value) {
if (value == '') {
return;
}
if (value % 1 != 0) {
return '排序数值必须为整数';
}
if (value < 0) {
return '排序数值必须为大于0';
}
}
});
});
function addLabel() {
var add_attr = $("#addLabel").html();
laytpl(add_attr).render({}, function(html) {
add_attr_index = layer.open({
title: '添加商品标签',
skin: 'layer-tips-class',
type: 1,
area: ['500px', '200px'],
content: html
});
});
}
function editLabel(data) {
var add_attr = $("#editLabel").html();
laytpl(add_attr).render(data, function(html) {
add_attr_index = layer.open({
title: '编辑商品标签',
skin: 'layer-tips-class',
type: 1,
area: ['500px', '300px'],
content: html
});
});
}
function closeAttrLayer() {
layer.close(add_attr_index);
}
// 监听单元格编辑
function editSort(id, event){
var data = $(event).val();
if (data == '') {
$(event).val(0);
data = 0;
}
if(!new RegExp("^-?[0-9]\\d*$").test(data)){
layer.msg("排序号只能是整数");
return ;
}
if(data<0){
layer.msg("排序号必须大于0");
return ;
}
$.ajax({
type: 'POST',
url: ns.url("shop/goodslabel/modifySort"),
data: {
sort: data,
id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if(res.code==0){
table.reload();
}
}
});
}
</script>

View File

@@ -0,0 +1,478 @@
<link rel="stylesheet" href="STATIC_EXT/colorPicker/css/colorpicker.css" />
<link rel="stylesheet" href="SHOP_CSS/goods_service.css" />
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="addService()">添加商品服务</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_keys" placeholder="请输入商品服务名称" autocomplete="off" class="layui-input">
<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 id="table_app">
<!-- 列表 -->
<table id="attr_class_list" lay-filter="attr_class_list"></table>
</div>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script type="text/html" id="addService">
<div class="layui-form" id="app">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="service_name" type="text" placeholder="请输入商品服务名称" lay-verify="required" class="layui-input len-mid" maxlength="20">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">描述</label>
<div class="layui-input-block">
<textarea name="desc" class="layui-textarea len-mid" maxlength="150"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">图标</label>
<div class="layui-input-block img-upload">
<div class="img-icon-box">
<img-icon-upload :data="{data:myData}"></img-icon-upload>
<div class="action-box">
<div class="action" v-if="myData.iconType == 'icon' && myData.icon" title="风格" @click="iconStyle($event)"><i class="iconfont iconpifu"></i></div>
<div class="action" v-if="myData.iconType == 'icon' && myData.icon" title="背景" @click="selectColor('icon-color-' +id)" :id="'icon-color-' +id"><i class="iconfont iconyanse"></i></div>
</div>
</div>
</div>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<script type="text/html" id="editService">
<div class="layui-form" id="app">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input name="service_name" type="text" value="{{ d.service_name }}" placeholder="请输入商品服务名称" lay-verify="required" class="layui-input len-mid" maxlength="20">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">描述</label>
<div class="layui-input-block">
<textarea name="desc" class="layui-textarea len-mid" maxlength="150">{{ d.desc }}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mid">图标</label>
<div class="layui-input-block img-upload">
<div class="img-icon-box">
<img-icon-upload :data="{data:myData}"></img-icon-upload>
<div class="action-box">
<div class="action" v-if="myData.iconType == 'icon' && myData.icon" title="风格" @click="iconStyle($event)"><i class="iconfont iconpifu"></i></div>
<div class="action" v-if="myData.iconType == 'icon' && myData.icon" title="背景" @click="selectColor('icon-color-' +id)" :id="'icon-color-' +id"><i class="iconfont iconyanse"></i></div>
</div>
</div>
</div>
</div>
<input type="hidden" name="id" value="{{ d.id }}">
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="edit_save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="closeAttrLayer()">返回</button>
</div>
</div>
</script>
<script src="STATIC_JS/vue.js"></script>
{include file="diy/iconfont_component"/}
<script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
<script src="STATIC_EXT/diyview/js/components.js"></script>
<script>
var laytpl, add_attr_index = -1, form, table,vue;
layui.use(['form', 'laytpl'], function() {
var repeat_flag = false; //防重复标识
laytpl = layui.laytpl;
form = layui.form;
form.render();
table = new Table({
elem: '#attr_class_list',
url: ns.url("shop/goodsservice/lists"),
cols: [
[ {
field: 'service_name',
title: '商品服务',
unresize: 'false',
width: '15%'
},{
title: '图标',
unresize: 'false',
width: '15%',
align: 'center',
templet: function (data) {
return iconHtml(data);
},
}, {
field:'desc',
unresize: 'false',
title: '描述',
width: '55%',
templet:'<div><span title="{{d.desc}}">{{d.desc}}</span></div>'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit':
editService(data);
break;
case 'delete':
deleteService(data.id);
break;
}
});
/**
* 删除
*/
function deleteService(id) {
layer.confirm('确认删除该服务吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/goodsservice/delete"),
data: {
id:id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
table.reload();
}
}
});
});
}
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
form.on('submit(save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
data.field.icon = JSON.stringify(vue.myData)
$.ajax({
url: '{:addon_url("shop/goodsservice/add")}',
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_attr_index);
}
repeat_flag = false;
}
});
return false;
});
form.on('submit(edit_save)', function(data) {
if (repeat_flag) return false;
repeat_flag = true;
data.field.icon = JSON.stringify(vue.myData)
$.ajax({
url: '{:addon_url("shop/goodsservice/edit")}',
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(data) {
layer.msg(data.message);
if (data.code == 0) {
table.reload();
layer.close(add_attr_index);
}
repeat_flag = false;
}
});
return false;
});
/**
* 表单验证
*/
form.verify({
num: function(value) {
if (value == '') {
return;
}
if (value % 1 != 0) {
return '排序数值必须为整数';
}
if (value < 0) {
return '排序数值必须为大于0';
}
}
});
});
function iconHtml(data){
let iconData = JSON.parse(data.icon);
var html = '';
if(iconData.iconType == 'img'){
html += `
<div class="td-box">
<div class="icon-img-box">
<img src="${ns.img(iconData.imageUrl)}" alt="">
</div>
</div>`;
}else if(iconData.iconType == 'icon') {
let iconBgStyle = '';
let iconStyle = '';
if(iconData.style) {
var style = {
'border-radius': iconData.style.bgRadius + '%',
'background': ''
};
if (iconData.style.iconBgImg) style['background'] += 'url(' + ns.img(iconData.style.iconBgImg) + ') no-repeat bottom / contain'
if (iconData.style.iconBgColor.length) {
if (style.background) style.background += ',';
if (iconData.style.iconBgColor.length == 1) {
style.background += iconData.style.iconBgColor[0];
} else {
style['background'] += 'linear-gradient(' + iconData.style.iconBgColorDeg + 'deg, ' + iconData.style.iconBgColor.join(',') + ')';
}
}
for (let i in style){
iconBgStyle += i+':'+style[i]+';';
}
var style = {
'font-size': iconData.style.fontSize + '%'
}
if (iconData.style.iconColor.length == 1) {
style.color = iconData.style.iconColor[0];
} else {
style['background'] = 'linear-gradient('+ iconData.style.iconColorDeg +'deg, '+ iconData.style.iconColor.join(',') +')';
}
for (let i in style){
iconStyle += i+':'+style[i]+';';
}
}
let iconClass = iconData.icon;
if (iconData.style && iconData.style.iconColor.length > 1) iconClass += ' gradient';
html += `
<div class="td-box">
<div class="icon-img-box">
<div class="icon-wrap" style="${iconBgStyle}">
<i class="js-icon ${iconClass}" style="${iconStyle}"></i>
</div>
</div>
</div>`;
}
return html;
}
function addService() {
var add_attr = $("#addService").html();
laytpl(add_attr).render({}, function(html) {
add_attr_index = layer.open({
title: '添加商品服务',
skin: 'layer-tips-class',
type: 1,
area: ['500px', '400px'],
content: html,
success: function(){
init({
"imageUrl": "",
"icon" : "",
"iconType": "icon",
"style": '',
});
}
});
});
}
function editService(data) {
var add_attr = $("#editService").html();
laytpl(add_attr).render(data, function(html) {
add_attr_index = layer.open({
title: '编辑商品服务',
skin: 'layer-tips-class',
type: 1,
area: ['500px', '400px'],
content: html,
success: function(){
if(data.icon){
if(isJSON(data.icon)){
init(JSON.parse(data.icon));
}else{
init({
"imageUrl": data.icon,
"icon" : "",
"iconType": "img",
"style": '',
});
}
}else{
init({
"imageUrl": "",
"icon" : "",
"iconType": "icon",
"style": '',
});
}
}
});
});
}
function isJSON(str) {
if (typeof str == 'string') {
try {
var obj = JSON.parse(str);
if (typeof obj == 'object' && obj) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
}
function closeAttrLayer() {
layer.close(add_attr_index);
}
function init(data){
vue = new Vue({
el: "#app",
data: {
myData: {},
id : '',
colorPicker:{}
},
created: function (){
this.id = ns.gen_non_duplicate(10);
this.myData = data;
loadImgMagnify();
},
methods: {
// 选择图标风格
iconStyle(event) {
var self = this;
selectIconStyle({
elem: event.currentTarget,
icon: self.myData.icon,
callback: function (data) {
if (data) {
self.myData.style = data;
} else {
iconStyleSet({
style: JSON.stringify(self.myData.style),
query: {
icon: self.myData.icon
}
}, function (style) {
self.myData.style = style;
})
}
}
})
},
/**
* 渲染颜色组件
* @param id
* @param color
* @param callback
*/
colorRender(id, color, callback) {
var self = this;
if (this.colorPicker[id]) return;
setTimeout(function () {
self.colorPicker[id] = Colorpicker.create({
el: id,
color: color,
change: function (elem, hex) {
callback(elem, hex)
}
});
$('#' + id).click();
}, 10)
},
selectColor(id) {
let self = this;
this.colorRender(id, '', function (elem, color) {
if (self.myData.style['iconBgImg'] || self.myData.style['iconBgColor'].length) {
self.myData.style['iconBgColor'] = [color];
} else {
self.myData.style['iconColor'] = [color];
}
self.$forceUpdate();
})
},
previewImg(id){
$('#'+id).find('div>img').click();
}
}
})
}
</script>

View File

@@ -0,0 +1,82 @@
<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="class_name" type="text" placeholder="请输入类型名称" lay-verify="required" class="layui-input len-mid" maxlength="30">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input name="sort" type="number" value="0" placeholder="请输入排序值" lay-verify="num" class="layui-input len-short">
</div>
<span class="layui-word-aux">排序值必须为整数</span>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backHelpClassList()">返回</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/help/addClass"),
data: data.field,
dataType: 'JSON',
type: 'POST',
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/help/classList")
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
});
});
/**
* 表单验证
*/
form.verify({
num: function(value) {
if (value == '') {
return;
}
if (value%1 != 0) {
return "输入错误,请输入整数!";
}
}
});
});
function backHelpClassList() {
location.hash = ns.hash("shop/help/classList");
}
</script>

133
app/shop/view/help/add_help.html Executable file
View File

@@ -0,0 +1,133 @@
<style>
.layui-form-select dl { z-index: 9999; }
</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="title" type="text" placeholder="请输入帮助标题" lay-verify="required" class="layui-input len-long" maxlength="30">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>帮助类型:</label>
<div class="layui-input-block len-mid">
<select name="class_id" lay-verify="required" lay-filter="help_class_list" class="len-mid">
<option value="">请选择</option>
{foreach $help_class_list as $help_class_k => $help_class_v}
<option value="{$help_class_v.class_id}">{$help_class_v.class_name}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input name="sort" type="number" value="0" placeholder="请输入排序值" lay-verify="num" class="layui-input len-short">
</div>
<div class="word-aux">排序值必须为整数</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">链接地址:</label>
<div class="layui-input-block">
<input name="link_address" type="text" placeholder="请输入链接地址" lay-verify="link_address" class="layui-input len-long">
</div>
<div class="word-aux">当填写链接链接地址后点击标题将打开链接地址链接格式请以http://开头</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">帮助内容:</label>
<div class="layui-input-block special-length">
<script id="container" name="content" type="text/plain" style="width:800px;height:300px;"></script>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backHelpList()">返回</button>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.config.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/ueditor.all.js?time=20240614"></script>
<script type="text/javascript" charset="utf-8" src="STATIC_EXT/ueditor/lang/zh-cn/zh-cn.js"></script>
<script>
var ue = UE.getEditor('container');
layui.use('form', function() {
var form = layui.form,
repeat_flag = false;//防重复标识
form.render();
/**
* 监听提交
*/
form.on('submit(save)', function(data) {
var html;
ue.ready(function() { //对编辑器的操作最好在编辑器ready之后再做
html = ue.getContent(); //获取html内容返回: <p>hello</p>
});
data.field.content = html;
var class_name = $("option[value="+data.field.class_id+"]").text();
data.field.class_name = class_name;
if (repeat_flag) return;
repeat_flag = true;
$.ajax({
url: ns.url("shop/help/addHelp"),
data: data.field,
dataType: 'JSON',
type: 'POST',
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/help/helpList")
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
});
});
/**
* 表单验证
*/
form.verify({
num: function(value) {
if (value == '') {
return;
}
if (value%1 != 0) {
return "输入错误,请输入整数!";
}
},
link_address : function (value) {
if(value) {
if (value.indexOf("http://") === -1 && value.indexOf("https://") === -1) {
return '链接格式请以http://、https://开头';
}
}
}
});
});
function backHelpList() {
location.hash = ns.hash("shop/help/helpList");
}
</script>

View File

@@ -0,0 +1,183 @@
<style>
.prompt-block, .prompt-block .prompt {display: inline-block;}
.prompt-block .prompt {width: 18px;height: 18px;line-height: 18px;position: relative;}
.layui-table-box {overflow: inherit;}
.layui-table-header {overflow: inherit;}
.layui-table-cell, .layui-table-tool-panel li {overflow: inherit;}
</style>
<!-- 搜索框 -->
<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="search_text" placeholder="请输入分类名称" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="type_list" lay-filter="type_list"></table>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script type="text/html" id="sort">
<input name="sort" type="number" onchange="editSort({{d.class_id}},this)" value="{{d.sort}}" placeholder="请输入排序" class="layui-input edit-sort len-short">
</script>
<script>
layui.use('form', function() {
var table,
form = layui.form,
repeat_flag = false;//防重复标识
form.render();
table = new Table({
elem: '#type_list',
url: ns.url("shop/help/classList"),
cols: [
[{
field: 'class_name',
title: '分类名称',
width: '60%',
unresize: 'false'
},{
field: 'sort',
title: `<div 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">
<p>默认排序号为0数字越小排序越靠前数字重复则最新添加的靠前。</p>
</div>
</div>
</div>
</div>`,
width: '20%',
unresize: 'false',
sort:true,
templet: '#sort'
},{
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
],
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.hash = ns.hash("shop/help/editClass?class_id=" + data.class_id);
break;
case 'delete': //删除
deleteUser(data.class_id,data.child);
break;
}
});
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
/**
* 删除
*/
function deleteUser(class_id,child) {
if (repeat_flag) return false;
repeat_flag = true;
if(child == 1){
repeat_flag = false;
layer.msg("该分类使用中,不可删除");
return false;
}
layer.confirm('确定要删除该帮助类型吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/help/deleteClass"),
data: {
class_id
},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
},function() {
repeat_flag = false;
layer.close();
});
}
});
// 监听单元格编辑
function editSort(id, event) {
var data = $(event).val();
let reg = ns.getRegexp('>=0num');
if (!reg.test(data)) {
layer.msg("排序号必须是大于或等于0的整数");
return;
}
$.ajax({
type: 'POST',
url: ns.url("shop/help/modifyClassSort"),
data: {
sort: data,
class_id: id
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message);
if (res.code == 0) {
listenerHash(); // 刷新页面
}
}
});
}
function add() {
location.hash = ns.hash("shop/help/addClass");
}
</script>

View File

@@ -0,0 +1,82 @@
<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="class_name" type="text" placeholder="请输入类型名称" value="{$class_info.data.class_name}" lay-verify="required" class="layui-input len-mid" maxlength="30">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-inline">
<input name="sort" type="number" placeholder="请输入排序值" value="{$class_info.data.sort}" lay-verify="num" class="layui-input len-short">
</div>
<span class="layui-word-aux">排序值必须为整数</span>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backHelpClassList()">返回</button>
</div>
<input type="hidden" name="class_id" value="{$class_info.data.class_id}" />
</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/help/editClass"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("shop/help/classList")
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
});
});
/**
* 表单验证
*/
form.verify({
num: function(value) {
if (value == '') {
return;
}
if (value%1 != 0) {
return "输入错误,请输入整数!";
}
}
});
});
function backHelpClassList() {
location.hash = ns.hash("shop/help/classList");
}
</script>

Some files were not shown because too many files have changed in this diff Show More