初始上传

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,688 @@
<style>
#container{ width: 650px; height: 500px; }
#container > div {z-index: 500!important}
.empty-address{ display: none; }
.address-content {display: inline-block;vertical-align: top;}
.day-wrap {display: flex;align-items: center}
.day-input {width: 80px}
.day-input[readonly] {background: #f5f5f5}
.day-wrap .layui-form-radio:nth-child(4) {margin-right: 0px}
.upload-img-block .upload-img-box .preview_img{width: 100%; height: 100%; display: flex; justify-content: center; align-items: center;}
.upload-img-block .upload-img-box .preview_img img{max-width: 100%; max-height: 100%;}
</style>
<div class="layui-form form-wrap" lay-filter="editselffetch">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>门店名称:</label>
<div class="layui-input-block">
<input type="text" name="store_name" autocomplete="off" lay-verify="store_name" class="layui-input len-long">
</div>
<div class="word-aux">门店的名称(招牌)</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label img-upload-lable">门店Logo</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block icon">
<div class="upload-img-box logo-image-box hover"></div>
</div>
</div>
<div class="word-aux">
<p>门店图片在PC及移动端对应页面及列表作为门店标志出现。</p>
<p>建议图片尺寸100 * 100像素图片格式jpg、png、jpeg。</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">门店图片:</label>
<div class="layui-input-block">
<div class="js-store-image"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">门店电话:</label>
<div class="layui-input-block">
<input type="text" name="telphone" autocomplete="off" lay-verify="tel" 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="checkbox" name="status" value="1" lay-skin="switch">
</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" value="1" name="is_pickup" lay-skin="switch">
</div>
<div class="word-aux">当启用自提,该门店支持到店自提的配送方式</div>
</div>
<!--自提点地址-->
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>门店地址:</label>
<div class="layui-input-inline len-mid area-select">
<select name="province_id" lay-filter="province_id" lay-verify="province_id">
<option value="">请选择省份</option>
{foreach $province_list as $k => $v}
<option value="{$v.id}">{$v.name}</option>
{/foreach}
</select>
</div>
<div class="layui-input-inline len-mid area-select">
<select name="city_id" lay-filter="city_id" lay-verify="city_id">
<option value="">请选择城市</option>
</select>
</div>
<div class="layui-input-inline len-mid area-select">
<select name="district_id" lay-filter="district_id" lay-verify="district_id">
<option value="">请选择区/县</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="address" placeholder="请填写门店的具体地址" lay-verify="required" autocomplete="off" class="layui-input len-long address-content" value="">
<input type = "hidden" name="longitude" lay-verify="required" class="layui-input"/>
<input type = "hidden" name="latitude" lay-verify="required" class="layui-input"/>
<button class='layui-btn-primary layui-btn' onclick="refreshFrom();">查找地址</button>
</div>
<div class="word-aux">点击查找地址可在地图上显示输入的地理位置</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">地图定位:</label>
<div class="layui-input-block special-length">
<div id="container" class="selffetch-map"></div>
</div>
<div class="word-aux empty-address">请选择地理位置!在地图上点击得到的地理位置会自动填入到对应的输入框中</div>
</div>
<div class="layui-form-item layui-hide">
<label class="layui-form-label">是否启用同城配送:</label>
<div class="layui-input-block">
<input type="checkbox" value="1" name="is_o2o" lay-skin="switch">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">营业时间:</label>
<div class="layui-input-block">
<input type="text" name="open_date" class="layui-input len-long">
</div>
<div class="word-aux ">上午9:00-12:00下午2:00-6:00</div>
</div>
<div class="layui-form-item time-view">
<div class="layui-inline">
<label class="layui-form-label">自提日期:</label>
<div class="layui-input-inline">
<input type="radio" name="time_type" value="0" title="每天" lay-filter="time_type" checked>
<input type="radio" name="time_type" value="1" title="自定义" lay-filter="time_type">
</div>
</div>
</div>
<div class="time-view">
<div class="layui-form-item time-type-view" lay-verify="time_week">
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="checkbox" value="1" class='time-week' name="time_week[]" title="周一" lay-skin="primary">
<input type="checkbox" value="2" class='time-week' name="time_week[]" title="周二" lay-skin="primary">
<input type="checkbox" value="3" class='time-week' name="time_week[]" title="周三" lay-skin="primary">
<input type="checkbox" value="4" class='time-week' name="time_week[]" title="周四" lay-skin="primary">
<input type="checkbox" value="5" class='time-week' name="time_week[]" title="周五" lay-skin="primary">
<input type="checkbox" value="6" class='time-week' name="time_week[]" title="周六" lay-skin="primary">
<input type="checkbox" value="0" class='time-week' name="time_week[]" title="周日" lay-skin="primary">
</div>
</div>
</div>
<div class="time-type-view-all">
<div class="delivery-time">
<div class="layui-form-item" >
<label class="layui-form-label"><span class="required">*</span>自提时段设置</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="startTime" lay-verify="start_time" placeholder="配送开始时间" value="" readonly >
<input type="hidden" class="layui-input" name="start_time" placeholder="配送开始时间" value="">
</div>
<div class="layui-form-mid layui-word-aux">~</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="endTime" lay-verify="end_time" placeholder="配送结束时间" value="" readonly >
<input type="hidden" class="layui-input" name="end_time" placeholder="配送结束时间" value="">
</div>
<div class="layui-form-mid layui-word-aux">
<a href="javascript:;" class="text-color add">添加</a>
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">细分时段:</label>
<div class="layui-input-block">
<input type="radio" name="time_interval" value="30" title="30分钟" checked/>
<input type="radio" name="time_interval" value="60" title="一小时"/>
<input type="radio" name="time_interval" value="90" title="90分钟" />
<input type="radio" name="time_interval" value="120" title="两小时" />
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">提前预约:</label>
<div class="layui-input-block day-wrap">
<input type="radio" name="advance_day" value="0" title="无需提前" checked lay-filter="day_select"/>
<input type="radio" name="advance_day" value="1" title="提前" lay-filter="day_select"/>
<div class="layui-input-inline">
<input type="number" name="advance_day_num" lay-verify="advance_day" class="layui-input day-input" readonly>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="word-aux">预约提货是否需提前进行预约</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">最长预约:</label>
<div class="layui-input-block day-wrap">
<input type="radio" name="most_day" value="0" title="仅当日" lay-filter="day_select"/>
<input type="radio" name="most_day" value="1" title="可预约" checked lay-filter="day_select"/>
<div class="layui-input-inline">
<input type="number" name="most_day_num" lay-verify="most_day" class="layui-input day-input" value="7">
</div>
<div class="layui-form-mid layui-word-aux">天内</div>
</div>
<div class="word-aux">预约提货最长可预约多少天内进行提货</div>
</div>
</div>
{if $is_exit == 1}
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>门店账号:</label>
<div class="layui-input-block">
<input type="text" name="username" lay-verify="required" placeholder="请填写门店登录账号" autocomplete="off" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>门店密码:</label>
<div class="layui-input-block">
<input type="password" name="password" lay-verify="required" placeholder="请填写门店登录密码" autocomplete="off" class="layui-input len-mid">
</div>
</div>
{/if}
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backStoreList()">返回</button>
<a id="storeImage"></a>
</div>
</div>
<script type="text/html" id="storeLogoImageTpl">
{{# if(d.list){ }}
<div class="preview_img">
<img layer-src src="{{ns.img(d.list)}}" class="img_prev"/>
</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 js-add-logo-image">点击替换</div>
</div>
<input type="hidden" name="store_image" value="{{d.list}}">
{{# }else{ }}
<div class="upload-default">
<div class="upload js-add-logo-image" >
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
{{# } }}
</script>
<script type="text/html" id="storeImageTpl">
{{# 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])}}" layer-src>
</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-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
</script>
<!--<script type="text/javascript" src="{$http_type}://webapi.amap.com/maps?v=1.4.6&amp;key=2df5711d4e2fd9ecd1622b5a53fc6b1d"></script>-->
<!--<script type="text/javascript" src="STATIC_JS/map_address.js"></script>-->
<script type="text/javascript" src="SHOP_JS/address.js"></script>
<script src="https://map.qq.com/api/gljs?v=1.exp&libraries=service&key={$tencent_map_key}"></script>
<script src="https://map.qq.com/api/js?v=2.exp&key={$tencent_map_key}"></script>
<script src="https://mapapi.qq.com/jsapi_v2/2/4/148/main.js"></script>
<script type="text/javascript" src="STATIC_JS/qq_map.js?time=20240601"></script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script>
var STORE_IMAGE_MAX = 5;
var form, laytpl,repeat_flag, map_class;
var saveData = null;
var storeImage = [];
layui.use(['form','laydate','laytpl'], function() {
var laydate = layui.laydate;
form = layui.form;
repeat_flag = false;//防重复标识
laytpl = layui.laytpl;
if($("#container").length) {
setTimeout(function () {
map_class = new mapClass("container", {lat: '', lng: ''});
map_class.mpKey = '{$tencent_map_key}';
},200);
}
form.render();
function fetchTimeSelect(){
$('.delivery-time .layui-form-item').each(function (index, item) {
//时间选择器
var startTime = $(item).find("input[name=start_time]").val(), endTime = $(item).find("input[name=end_time]").val(), initTime = parseInt({:strtotime(date('Y-m-d'))});
laydate.render({
elem: '#startTime' + (index ? index : '')
,type: 'time'
,value: startTime ? ns.time_to_date((initTime + parseInt(startTime)), 'H:i:s') : ''
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$(item).find("input[name=start_time]").val(time);
}
});
//时间选择器
laydate.render({
elem: '#endTime' + (index ? index : '')
,type: 'time'
,value: startTime ? ns.time_to_date((initTime + parseInt(endTime)), 'H:i:s') : ''
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$(item).find("input[name=end_time]").val(time);
}
});
})
}
fetchTimeSelect();
$('body').off('click', '.delivery-time .delete').on('click', '.delivery-time .delete', function () {
$(this).parents('.layui-form-item').remove()
});
$('body').off('click', '.delivery-time .add').on('click', '.delivery-time .add', function () {
var length = $('.delivery-time .layui-form-item').length;
if (length >= 3) { layer.msg('最多添加三个时段'); return;}
var h = `<div class="layui-form-item" >
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="startTime`+ length +`" lay-verify="start_time" placeholder="配送开始时间" value="" readonly >
<input type="hidden" class="layui-input" name="start_time" placeholder="配送开始时间" value="">
</div>
<div class="layui-form-mid layui-word-aux">~</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="endTime`+ length +`" lay-verify="end_time" placeholder="配送结束时间" value="" readonly >
<input type="hidden" class="layui-input" name="end_time" placeholder="配送结束时间" value="">
</div>
<div class="layui-form-mid layui-word-aux">
<a href="javascript:;" class="text-color delete">删除</a>
</div>
</div>`;
$('.delivery-time').append(h);
fetchTimeSelect();
});
$('.time-type-view').hide();
form.on('radio(time_type)', function(data){
timeTypeChange(data.value);
});
form.on('radio(day_select)', function (data){
if (data.value == 1) {
$(data.elem).parents('.day-wrap').find('input[type="number"]').prop('readonly', false);
} else {
$(data.elem).parents('.day-wrap').find('input[type="number"]').prop('readonly', true);
}
})
/**
* 验证码
*/
form.verify({
required : function(value, item){
var msg = $(item).attr("placeholder") != undefined ? $(item).attr("placeholder") : '';
if(value == '') return msg;
},
province_id : function(value, item){
if(value == ''){
return '请选择省份';
}
},
city_id : function(value, item){
if(value == ''){
return '请选择城市';
}
},
// district_id : function(value, item){
// if(value == ''){
// return '请选择区/县';
// }
// },
tel : function(value, item) {
if (value != '') {
if (!ns.parse_telephone(value) && !ns.parse_mobile(value)) {
return '请输入正确的电话号码或手机号!';
}
}
},
store_name : function (value,item) {
if(value == ""){
return '请输入门店名称';
}
},
time_week: function(){
if ($('[name="time_type"]:checked').val() == 1 && !$('.time-week:checked').length)
return '请选择可配送日期';
},
start_time: function(value, item){
var end_time = $(item).parents('.layui-form-item').find("input[name=end_time]").val();
var start_time = $(item).parents('.layui-form-item').find("input[name=start_time]").val();
if(parseInt(start_time) > parseInt(end_time)){
return '开始时间不能大于结束时间';
}
var prev_endtime = $(item).parents('.layui-form-item').prev('.layui-form-item').find("input[name=end_time]").val();
if (prev_endtime && parseInt(prev_endtime) > parseInt(start_time)) return '开始时间不能小于上一阶段结束时间';
},
end_time: function(value, item){
var end_time = $(item).parents('.layui-form-item').find("input[name=end_time]").val();
var start_time = $(item).parents('.layui-form-item').find("input[name=start_time]").val();
var time_interval = $('[name="time_interval"]:checked').val();
if (parseInt(end_time) < parseInt(start_time)) {
return '结束时间不能小于开始时间';
}
if ((parseInt(end_time) - parseInt(start_time)) / 60 < parseInt(time_interval)) {
return '时间间隔不能小于' + time_interval + '分钟';
}
},
advance_day: function (value){
if ($('[name="advance_day"]:checked').val() == 1) {
if (value == '' || value == 0) return '请输入提前预约时间';
if (value < 0) return '提前预约时间不能为负数';
}
},
most_day: function (value){
if ($('[name="most_day"]:checked').val() == 1) {
if (value == '' || value == 0) return '请输入最长可预约时间';
if (value < 0) return '最长可预约时间不能为负数';
if (value > 15) return '最长可预约时间不能超过15天';
}
}
});
// 添加logo图片
var storeLogoImage = '';
$("body").off("click", ".js-add-logo-image").on("click", ".js-add-logo-image", function () {
openAlbum(function (data) {
storeLogoImage = data[0].pic_path;
refreshLogoStoreImage();
}, 1, 1);
});
//渲染logo图片
function refreshLogoStoreImage() {
var store_image_template = $("#storeLogoImageTpl").html();
var data = {
list: storeLogoImage
};
laytpl(store_image_template).render(data, function (html) {
$(".logo-image-box").html(html);
//加载图片放大
loadImgMagnify();
if (storeLogoImage.length) {
//预览
$(".logo-image-box .js-preview").click(function () {
$(this).parent().parent().prev().find("img").click();
});
//图片删除
$(".logo-image-box .js-delete").click(function () {
storeLogoImage = '';
refreshLogoStoreImage();
});
}
});
}
refreshLogoStoreImage();
function saveFunc(){
var data = saveData;
var full_address = [];
full_address.push($("select[name=province_id] option:selected").text());
full_address.push($("select[name=city_id] option:selected").text());
full_address.push($("select[name=district_id] option:selected").text());
data.field.full_address = full_address.toString();
data.field.delivery_time = [];
$('.delivery-time .layui-form-item').each(function (index, item) {
data.field.delivery_time.push({
start_time: $(item).find("input[name=start_time]").val(),
end_time: $(item).find("input[name=end_time]").val()
})
});
data.field.delivery_time = JSON.stringify(data.field.delivery_time);
data.field.advance_day = $('[name="advance_day"]:checked').val() == 0 ? 0 : $('[name="advance_day_num"]').val();
data.field.most_day = $('[name="most_day"]:checked').val() == 0 ? 0 : $('[name="most_day_num"]').val();
data.field.store_images = storeImage.toString();
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type : "POST",
dataType: 'JSON',
url : ns.url("shop/store/addStore"),
async : true,
data : data.field,
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/store/lists")
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
})
}
/**
* 监听提交
*/
form.on('submit(save)', function(data){
saveData = data;
if( data.field.longitude == "" || data.field.latitude == ""){
layer.msg('请确认地理位置!');
$(".empty-address").show();
return;
}else{
$(".empty-address").hide();
}
saveFunc();
});
$("body").off("click", ".js-add-image").on("click", ".js-add-image", function () {
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (storeImage.length < STORE_IMAGE_MAX) storeImage.push(data[i].pic_path);
}
refreshStoreImage();
}, 5, 1);
});
function refreshStoreImage() {
var store_image_template = $("#storeImageTpl").html();
var data = {
list: storeImage,
max: STORE_IMAGE_MAX
};
laytpl(store_image_template).render(data, function (html) {
$(".js-store-image").html(html);
//加载图片放大
loadImgMagnify();
if (storeImage.length) {
//预览
$(".js-store-image .js-preview").click(function () {
$(this).parent().prev().find("img").click();
});
//图片删除
$(".js-store-image .js-delete").click(function () {
var index = $(this).attr("data-index");
storeImage.splice(index, 1);
refreshStoreImage();
});
// 拖拽
$('.js-store-image .upload_img_square_item').arrangeable({
//拖拽结束后执行回调
callback: function (e) {
var indexBefore = $(e).attr("data-index");//拖拽前的原始位置
var indexAfter = $(e).index();//拖拽后的位置
var temp = storeImage[indexBefore];
storeImage[indexBefore] = storeImage[indexAfter];
storeImage[indexAfter] = temp;
refreshStoreImage();
}
});
}
//最多传十张图
if (storeImage.length < STORE_IMAGE_MAX) {
$(".js-add-image").show();
} else {
$(".js-add-image").hide();
}
});
}
refreshStoreImage();
});
function backStoreList() {
location.hash = ns.hash("shop/store/lists");
}
/**
* 重新渲染表单
*/
function refreshFrom(){
form.render();
orderAddressChange();//改变地址
map_class.mapChange();
}
//动态改变订单地址赋值
function orderAddressChange(){
map_class.address.province = $("select[name=province_id]").val();
map_class.address.province_name = $("select[name=province_id] option:selected").text();
map_class.address.city = $("select[name=city_id]").val();
map_class.address.city_name = $("select[name=city_id] option:selected").text();
map_class.address.district = $("select[name=district_id]").val();
map_class.address.district_name = $("select[name=district_id] option:selected").text();
map_class.address.detail_address = $("input[name=address]").val()
}
/**
* 地址下拉框(主要用于坐标记录)
*/
function selectCallBack(){
$("input[name=longitude]").val(map_class.address.longitude);//坐标
$("input[name=latitude]").val(map_class.address.latitude);//坐标
}
//地图点击回调事件
function mapChangeCallBack(){
$("input[name=address]").val(map_class.address.address);//详细地址
$("input[name=longitude]").val(map_class.address.longitude);//坐标
$("input[name=latitude]").val(map_class.address.latitude);//坐标
$.ajax({
type : "POST",
dataType: 'JSON',
url : ns.url("shop/address/getGeographicId"),
async : true,
data : {
"address" : map_class.address.area
},
success : function(data) {
map_class.address.province = data.province_id;
map_class.address.city = data.city_id;
map_class.address.district = data.district_id;
map_class.address.township = data.subdistrict_id;
map_class.map_change = false;
form.val("editselffetch", {
"province_id": data.province_id
});
$("select[name=province_id]").change();
form.val("editselffetch", {
"city_id": data.city_id
});
$("select[name=city_id]").change();
form.val("editselffetch", {
"district_id": data.district_id
});
refreshFrom();//重新渲染form
map_class.map_change = true;
}
});
}
function timeTypeChange(type){
if(type == 1){
$('.time-type-view').show();
}else{
$('.time-type-view').hide();
}
}
</script>

View File

@@ -0,0 +1,157 @@
<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="deliverLists" lay-filter="deliverLists"></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>
var form, table;
layui.use(['form'], function() {
form = layui.form;
var repeat_flag = false; //防重复标识
table = new Table({
elem: '#deliverLists',
url: ns.url("shop/store/deliverlists"),
where:{'store_id':"{$store_id}"},
cols: [
[{
title: '配送员名称',
unresize: 'false',
field: 'deliver_name',
width: '40%'
}, {
field:'deliver_mobile',
title: '配送员电话',
unresize: 'false',
width: '40%'
},{
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/store/editDeliver?store_id={$store_id}&deliver_id=" + data.deliver_id);
break;
case 'delete': //删除
deleteDeliver(data.deliver_id);
break;
}
});
/**
* 删除
*/
function deleteDeliver(deliver_ids) {
if (repeat_flag) return false;
repeat_flag = true;
layer.confirm('确定要删除该配送员吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/local/deleteDeliver"),
data: {deliver_ids},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload(
{
page: {
curr: 1
}
}
);
}
}
});
}, 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 add() {
location.hash = ns.hash("shop/store/addDeliver?store_id={$store_id}");
}
</script>

View File

@@ -0,0 +1,722 @@
<style>
#container{ width: 650px; height: 500px; }
#container > div {z-index: 500!important}
.empty-address{ display: none; }
.address-content {display: inline-block;vertical-align: top;}
.day-wrap {display: flex;align-items: center}
.day-input {width: 80px}
.day-input[readonly] {background: #f5f5f5}
.day-wrap .layui-form-radio:nth-child(4) {margin-right: 0px}
.upload-img-block .upload-img-box .preview_img{width: 100%; height: 100%; display: flex; justify-content: center; align-items: center;}
.upload-img-block .upload-img-box .preview_img img{max-width: 100%; max-height: 100%;}
</style>
<div class="layui-form form-wrap" lay-filter="storeform" >
<input type="hidden" name="store_id" value="{$store_id}"/>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>门店名称:</label>
<div class="layui-input-block">
<input type="text" name="store_name" autocomplete="off" lay-verify="store_name" class="layui-input len-mid" value="{$info.store_name}">
</div>
<div class="word-aux">门店的名称(招牌)</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label img-upload-lable">门店Logo</label>
<div class="layui-input-block img-upload">
<div class="upload-img-block icon">
<div class="upload-img-box logo-image-box {if !empty($info.store_image)}hover{/if}" >
<input type="hidden" name="store_image" value="{$info.store_image}">
</div>
</div>
</div>
<div class="word-aux">
<p>门店图片在PC及移动端对应页面及列表作为门店标志出现。</p>
<p>建议图片尺寸100 * 100像素图片格式jpg、png、jpeg。</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">门店图片:</label>
<div class="layui-input-block">
<div class="js-store-image"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">门店电话:</label>
<div class="layui-input-block">
<input type="text" name="telphone" value="{$info.telphone}" lay-verify="tel" autocomplete="off" class="layui-input len-mid">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">营业状态:</label>
<div class="layui-input-block">
<input type="checkbox" name="status" value="1" lay-skin="switch" {if !empty($info) && $info.status==1 }checked{/if}>
</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" value="1" name="is_pickup" lay-skin="switch" {if !empty($info) && $info.is_pickup==1 }checked{/if}>
</div>
<div class="word-aux">当启用自提,该门店支持到店自提的配送方式</div>
</div>
<!--自提点地址-->
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">* </span>门店地址:</label>
<div class="layui-input-inline area-select">
<select name="province_id" lay-filter="province_id" lay-verify="province_id">
{foreach $province_list as $k => $v}
<option value="{$v.id}" {if $info.province_id == $v.id}select{/if}>{$v.name}</option>
{/foreach}
</select>
</div>
<div class="layui-input-inline area-select">
<select name="city_id" lay-filter="city_id" lay-verify="city_id">
<option value="">请选择城市</option>
</select>
</div>
<div class="layui-input-inline area-select">
<select name="district_id" lay-filter="district_id" lay-verify="district_id">
<option value="">请选择区/县</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="address" placeholder="请填写门店的具体地址" value="{$info.address}" lay-verify="required" autocomplete="off" class="layui-input len-long address-content">
<input type = "hidden" name="longitude" lay-verify="required" class="layui-input" value="{$info.longitude}"/>
<input type = "hidden" name="latitude" lay-verify="required" class="layui-input" value="{$info.latitude}"/>
<button class='layui-btn-primary layui-btn' onclick="refreshFrom();">查找地址</button>
</div>
<div class="word-aux">点击查找地址可在地图上显示输入的地理位置</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">地图定位:</label>
<div class="layui-input-block">
<div id="container" class="selffetch-map"></div>
</div>
<span class="layui-word-aux empty-address">请选择地理位置!在地图上点击得到的地理位置会自动填入到对应的输入框中</span>
</div>
<div class="layui-form-item layui-hide">
<label class="layui-form-label">是否启用同城配送:</label>
<div class="layui-input-block">
<input type="checkbox" value="1" name="is_o2o" lay-skin="switch" {if !empty($info) && $info.is_o2o==1 }checked{/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">营业时间:</label>
<div class="layui-input-block">
<input type="text" name="open_date" value="{$info.open_date}" class="layui-input len-long">
</div>
<div class="word-aux ">上午9:00-12:00下午2:00-6:00</div>
</div>
<div class="layui-form-item time-view">
<div class="layui-inline">
<label class="layui-form-label">自提日期:</label>
<div class="layui-input-inline">
<input type="radio" name="time_type" value="0" title="每天" lay-filter="time_type" {if $info.time_type == 0 || !isset($info.time_type)}checked{/if}/>
<input type="radio" name="time_type" value="1" title="自定义" lay-filter="time_type" {if $info.time_type == 1 }checked{/if}/>
</div>
</div>
</div>
<div class="time-view">
<div class="layui-form-item time-type-view" lay-verify="time_week">
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="checkbox" value="1" class='time-week' name="time_week[]" title="周一" lay-skin="primary" {if !empty($info.time_week) && in_array(1,$info.time_week)} checked {/if}>
<input type="checkbox" value="2" class='time-week' name="time_week[]" title="周二" lay-skin="primary" {if !empty($info.time_week) && in_array(2,$info.time_week)} checked {/if}>
<input type="checkbox" value="3" class='time-week' name="time_week[]" title="周三" lay-skin="primary" {if !empty($info.time_week) && in_array(3,$info.time_week)} checked {/if}>
<input type="checkbox" value="4" class='time-week' name="time_week[]" title="周四" lay-skin="primary" {if !empty($info.time_week) && in_array(4,$info.time_week)} checked {/if}>
<input type="checkbox" value="5" class='time-week' name="time_week[]" title="周五" lay-skin="primary" {if !empty($info.time_week) && in_array(5,$info.time_week)} checked {/if}>
<input type="checkbox" value="6" class='time-week' name="time_week[]" title="周六" lay-skin="primary" {if !empty($info.time_week) && in_array(6,$info.time_week)} checked {/if}>
<input type="checkbox" value="0" class='time-week' name="time_week[]" title="周日" lay-skin="primary" {if !empty($info.time_week) && in_array(0,$info.time_week)} checked {/if}>
</div>
</div>
</div>
<div class="time-type-view-all">
<div class="delivery-time">
{foreach name="$info.delivery_time" key="k" item="item"}
<div class="layui-form-item" >
<label class="layui-form-label">{$k == 0 ? '自提时段设置:' : ''}</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="startTime{$k == 0 ? '' : $k}" lay-verify="start_time" placeholder="配送开始时间" value="" readonly >
<input type="hidden" class="layui-input" name="start_time" placeholder="配送开始时间" value="{$item.start_time}">
</div>
<div class="layui-form-mid layui-word-aux">~</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="endTime{$k == 0 ? '' : $k}" lay-verify="end_time" placeholder="配送结束时间" value="" readonly >
<input type="hidden" class="layui-input" name="end_time" placeholder="配送结束时间" value="{$item.end_time}">
</div>
<div class="layui-form-mid layui-word-aux">
{if $k eq 0}
<a href="javascript:;" class="text-color add">添加</a>
{else/}
<a href="javascript:;" class="text-color delete">删除</a>
{/if}
</div>
</div>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">细分时段:</label>
<div class="layui-input-block">
<input type="radio" name="time_interval" value="30" title="30分钟" {if $info.time_interval == 30}checked{/if}/>
<input type="radio" name="time_interval" value="60" title="一小时" {if $info.time_interval == 60}checked{/if}/>
<input type="radio" name="time_interval" value="90" title="90分钟" {if $info.time_interval == 90}checked{/if}/>
<input type="radio" name="time_interval" value="120" title="两小时" {if $info.time_interval == 120}checked{/if}/>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">提前预约:</label>
<div class="layui-input-block day-wrap">
<input type="radio" name="advance_day" value="0" title="无需提前" {if $info.advance_day == 0}checked{/if} lay-filter="day_select"/>
<input type="radio" name="advance_day" value="1" title="提前" {if $info.advance_day != 0}checked{/if} lay-filter="day_select"/>
<div class="layui-input-inline">
<input type="number" name="advance_day_num" lay-verify="advance_day" class="layui-input day-input" {if $info.advance_day == 0}readonly{else/}value="{$info.advance_day}"{/if}>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="word-aux">预约提货是否需提前进行预约</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">最长预约:</label>
<div class="layui-input-block day-wrap">
<input type="radio" name="most_day" value="0" title="仅当日" {if $info.most_day == 0}checked{/if} lay-filter="day_select"/>
<input type="radio" name="most_day" value="1" title="可预约" {if $info.most_day != 0}checked{/if} lay-filter="day_select"/>
<div class="layui-input-inline">
<input type="number" name="most_day_num" lay-verify="most_day" class="layui-input day-input" {if $info.most_day == 0}readonly{else/}value="{$info.most_day}"{/if}>
</div>
<div class="layui-form-mid layui-word-aux">天内</div>
</div>
<div class="word-aux">预约提货最长可预约多少天内进行提货</div>
</div>
</div>
{if $is_exit == 1}
{if $info.username}
<div class="layui-form-item">
<label class="layui-form-label">门店账号:</label>
<div class="layui-input-block">
<p class="input-text">{$info.username}</p>
<input type="hidden" name="user_type" value="1"/>
</div>
</div>
{else/}
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>门店账号:</label>
<div class="layui-input-block">
<input type="text" name="username" lay-verify="required" placeholder="请填写门店登录账号" autocomplete="off" class="layui-input len-mid">
<input type="hidden" name="user_type" value="0"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>门店密码:</label>
<div class="layui-input-block">
<input type="password" name="password" lay-verify="required" placeholder="请填写门店登录密码" autocomplete="off" class="layui-input len-mid">
</div>
</div>
{/if}
{/if}
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backStoreList()">返回</button>
<a id="storeImage"></a>
</div>
</div>
<script type="text/html" id="storeLogoImageTpl">
{{# if(d.list){ }}
<div class="preview_img">
<img layer-src src="{{ns.img(d.list)}}" class="img_prev"/>
</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 js-add-logo-image">点击替换</div>
</div>
<input type="hidden" name="store_image" value="{{d.list}}">
{{# }else{ }}
<div class="upload-default">
<div class="upload js-add-logo-image" >
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
{{# } }}
</script>
<script type="text/html" id="storeImageTpl">
{{# 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])}}" layer-src>
</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-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-image upload_img_square">+</div>
{{# } }}
</script>
<!--<script type="text/javascript" src="{$http_type}://webapi.amap.com/maps?v=1.4.6&amp;key=2df5711d4e2fd9ecd1622b5a53fc6b1d"></script>-->
<!--<script type="text/javascript" src="STATIC_JS/map_address.js"></script>-->
<script type="text/javascript" src="SHOP_JS/address.js"></script>
<script src="https://map.qq.com/api/gljs?v=1.exp&libraries=service&key={$tencent_map_key}"></script>
<script src="https://map.qq.com/api/js?v=2.exp&key={$tencent_map_key}"></script>
<script src="https://mapapi.qq.com/jsapi_v2/2/4/148/main.js"></script>
<script type="text/javascript" src="STATIC_JS/qq_map.js?time=20240601"></script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script>
var form,laytpl, repeat_flag, map_class;
var saveData = null;
var STORE_IMAGE_MAX = 5;
var storeImage = [];
{notempty name="$info.store_images"}
storeImage = '{$info.store_images}'.split(',');
{/notempty}
layui.use(['form','laydate','laytpl'], function() {
var laydate = layui.laydate;
form = layui.form;
repeat_flag = false;//防重复标识
laytpl = layui.laytpl;
form.render();
function fetchTimeSelect(){
$('.delivery-time .layui-form-item').each(function (index, item) {
//时间选择器
var startTime = $(item).find("input[name=start_time]").val(), endTime = $(item).find("input[name=end_time]").val(), initTime = parseInt({:strtotime(date('Y-m-d'))});
laydate.render({
elem: '#startTime' + (index ? index : '')
,type: 'time'
,value: startTime ? ns.time_to_date((initTime + parseInt(startTime)), 'H:i:s') : ''
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$(item).find("input[name=start_time]").val(time);
}
});
//时间选择器
laydate.render({
elem: '#endTime' + (index ? index : '')
,type: 'time'
,value: startTime ? ns.time_to_date((initTime + parseInt(endTime)), 'H:i:s') : ''
,done: function(value, date, endDate){
var time = date.hours * 3600 + date.minutes * 60 + date.seconds;
$(item).find("input[name=end_time]").val(time);
}
});
})
}
fetchTimeSelect();
$('body').off('click', '.delivery-time .delete').on('click', '.delivery-time .delete', function () {
$(this).parents('.layui-form-item').remove()
});
$('body').off('click', '.delivery-time .add').on('click', '.delivery-time .add', function () {
var length = $('.delivery-time .layui-form-item').length;
if (length >= 3) { layer.msg('最多添加三个时段'); return;}
var h = `<div class="layui-form-item" >
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="startTime`+ length +`" lay-verify="start_time" placeholder="配送开始时间" value="" readonly >
<input type="hidden" class="layui-input" name="start_time" placeholder="配送开始时间" value="">
</div>
<div class="layui-form-mid layui-word-aux">~</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="endTime`+ length +`" lay-verify="end_time" placeholder="配送结束时间" value="" readonly >
<input type="hidden" class="layui-input" name="end_time" placeholder="配送结束时间" value="">
</div>
<div class="layui-form-mid layui-word-aux">
<a href="javascript:;" class="text-color delete">删除</a>
</div>
</div>`;
$('.delivery-time').append(h);
fetchTimeSelect();
});
form.on('radio(day_select)', function (data){
if (data.value == 1) {
$(data.elem).parents('.day-wrap').find('input[type="number"]').prop('readonly', false);
} else {
$(data.elem).parents('.day-wrap').find('input[type="number"]').prop('readonly', true);
}
})
timeTypeChange($("input[name=time_type]:checked").val());
form.on('radio(time_type)', function(data){
timeTypeChange(data.value);
});
var initdata = {province_id : '{$info.province_id}', city_id : '{$info.city_id}', district_id : '{$info.district_id}'};
initAddress(initdata, "storeform");
if('{$info.latitude}' == "" || '{$info.longitude}' == ""){
var latlng = {lat:'',lng:''};
}else{
var latlng = {lat:'{$info.latitude}',lng:'{$info.longitude}'};
}
//地图展示
if($("#container").length) {
setTimeout(function () {
map_class = new mapClass("container", latlng);
},200);
}
/**
* 验证码
*/
form.verify({
required : function(value, item){
var msg = $(item).attr("placeholder") != undefined ? $(item).attr("placeholder") : '';
if(value == '') return msg;
},
province_id : function(value, item){
if(value == ''){
return '请选择省份';
}
},
city_id : function(value, item){
if(value == ''){
return '请选择城市';
}
},
// district_id : function(value, item){
// if(value == ''){
// return '请选择区/县';
// }
// },
tel : function(value, item) {
if (value != '') {
if (!ns.parse_telephone(value) && !ns.parse_mobile(value)) {
return '请输入正确的电话号码或手机号!';
}
}
},
store_name : function (value,item) {
if(value == ""){
return '请输入门店名称';
}
},
time_week: function(){
if ($('[name="time_type"]:checked').val() == 1 && !$('.time-week:checked').length)
return '请选择可配送日期';
},
start_time: function(value, item){
var end_time = $(item).parents('.layui-form-item').find("input[name=end_time]").val();
var start_time = $(item).parents('.layui-form-item').find("input[name=start_time]").val();
if(parseInt(start_time) > parseInt(end_time)){
return '开始时间不能大于结束时间';
}
var prev_endtime = $(item).parents('.layui-form-item').prev('.layui-form-item').find("input[name=end_time]").val();
if (prev_endtime && parseInt(prev_endtime) > parseInt(start_time)) return '开始时间不能小于上一阶段结束时间';
},
end_time: function(value, item){
var end_time = $(item).parents('.layui-form-item').find("input[name=end_time]").val();
var start_time = $(item).parents('.layui-form-item').find("input[name=start_time]").val();
var time_interval = $('[name="time_interval"]:checked').val();
if (parseInt(end_time) < parseInt(start_time)) {
return '结束时间不能小于开始时间';
}
if ((parseInt(end_time) - parseInt(start_time)) / 60 < parseInt(time_interval)) {
return '时间间隔不能小于' + time_interval + '分钟';
}
},
advance_day: function (value){
if ($('[name="advance_day"]:checked').val() == 1) {
if (value == '' || value == 0) return '请输入提前预约时间';
if (value < 0) return '提前预约时间不能为负数';
}
},
most_day: function (value){
if ($('[name="most_day"]:checked').val() == 1) {
if (value == '' || value == 0) return '请输入最长可预约时间';
if (value < 0) return '最长可预约时间不能为负数';
if (value > 15) return '最长可预约时间不能超过15天';
}
}
});
// 添加logo图片
var storeLogoImage = '{$info.store_image}';
$("body").off("click", ".js-add-logo-image").on("click", ".js-add-logo-image", function () {
openAlbum(function (data) {
storeLogoImage = data[0].pic_path;
refreshLogoStoreImage();
}, 1, 1);
});
//渲染logo图片
function refreshLogoStoreImage() {
var store_image_template = $("#storeLogoImageTpl").html();
var data = {
list: storeLogoImage
};
laytpl(store_image_template).render(data, function (html) {
$(".logo-image-box").html(html);
//加载图片放大
loadImgMagnify();
if (storeLogoImage.length) {
//预览
$(".logo-image-box .js-preview").click(function () {
$(this).parent().parent().prev().find("img").click();
});
//图片删除
$(".logo-image-box .js-delete").click(function () {
storeLogoImage = '';
refreshLogoStoreImage();
});
}
});
}
refreshLogoStoreImage();
function saveFunc(){
var data = saveData;
var full_address = [];
full_address.push($("select[name=province_id] option:selected").text());
full_address.push($("select[name=city_id] option:selected").text());
full_address.push($("select[name=district_id] option:selected").text());
data.field.full_address = full_address.toString();
data.field.delivery_time = [];
$('.delivery-time .layui-form-item').each(function (index, item) {
data.field.delivery_time.push({
start_time: $(item).find("input[name=start_time]").val(),
end_time: $(item).find("input[name=end_time]").val()
})
});
data.field.delivery_time = JSON.stringify(data.field.delivery_time);
data.field.advance_day = $('[name="advance_day"]:checked').val() == 0 ? 0 : $('[name="advance_day_num"]').val();
data.field.most_day = $('[name="most_day"]:checked').val() == 0 ? 0 : $('[name="most_day_num"]').val();
data.field.store_images = storeImage.toString();
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type : "POST",
dataType: 'JSON',
url : ns.url("shop/store/editStore"),
async : true,
data : data.field,
success : function(res) {
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title: '操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("shop/store/lists")
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
} else {
layer.msg(res.message);
}
}
})
}
/**
* 监听提交
*/
form.on('submit(save)', function(data){
saveData = data;
if( data.field.longitude == "" || data.field.latitude == ""){
layer.msg('请确认地理位置!');
$(".empty-address").show();
return;
}else{
$(".empty-address").hide();
}
saveFunc();
});
$("body").off("click", ".js-add-image").on("click", ".js-add-image", function () {
openAlbum(function (data) {
for (var i = 0; i < data.length; i++) {
if (storeImage.length < STORE_IMAGE_MAX) storeImage.push(data[i].pic_path);
}
refreshStoreImage();
}, 5, 1);
});
function refreshStoreImage() {
var store_image_template = $("#storeImageTpl").html();
var data = {
list: storeImage,
max: STORE_IMAGE_MAX
};
laytpl(store_image_template).render(data, function (html) {
$(".js-store-image").html(html);
//加载图片放大
loadImgMagnify();
if (storeImage.length) {
//预览
$(".js-store-image .js-preview").click(function () {
$(this).parent().prev().find("img").click();
});
//图片删除
$(".js-store-image .js-delete").click(function () {
var index = $(this).attr("data-index");
storeImage.splice(index, 1);
refreshStoreImage();
});
// 拖拽
$('.js-store-image .upload_img_square_item').arrangeable({
//拖拽结束后执行回调
callback: function (e) {
var indexBefore = $(e).attr("data-index");//拖拽前的原始位置
var indexAfter = $(e).index();//拖拽后的位置
var temp = storeImage[indexBefore];
storeImage[indexBefore] = storeImage[indexAfter];
storeImage[indexAfter] = temp;
refreshStoreImage();
}
});
}
//最多传十张图
if (storeImage.length < STORE_IMAGE_MAX) {
$(".js-add-image").show();
} else {
$(".js-add-image").hide();
}
});
}
refreshStoreImage();
});
function backStoreList() {
location.hash = ns.hash("shop/store/lists");
}
/**
* 重新渲染表单
*/
function refreshFrom(){
form.render();
orderAddressChange();//改变地址
map_class.mapChange();
}
//动态改变订单地址赋值
function orderAddressChange(){
map_class.address.province = $("select[name=province_id]").val();
map_class.address.province_name = $("select[name=province_id] option:selected").text();
map_class.address.city = $("select[name=city_id]").val();
map_class.address.city_name = $("select[name=city_id] option:selected").text();
map_class.address.district = $("select[name=district_id]").val();
map_class.address.district_name = $("select[name=district_id] option:selected").text();
map_class.address.detail_address = $("input[name='address']").val();
}
/**
* 地址下拉框(主要用于坐标记录)
*/
function selectCallBack(){
$("input[name=longitude]").val(map_class.address.longitude);//坐标
$("input[name=latitude]").val(map_class.address.latitude);//坐标
}
//地图点击回调事件
function mapChangeCallBack(){
$("input[name=address]").val(map_class.address.address);//详细地址
$("input[name=longitude]").val(map_class.address.longitude);//坐标
$("input[name=latitude]").val(map_class.address.latitude);//坐标
$.ajax({
type : "POST",
dataType: 'JSON',
url : ns.url("shop/address/getGeographicId"),
async : true,
data : {
"address" : map_class.address.area
},
success : function(data) {
map_class.address.province = data.province_id;
map_class.address.city = data.city_id;
map_class.address.district = data.district_id;
map_class.address.township = data.subdistrict_id;
map_class.map_change = false;
form.val("storeform", {
"province_id": data.province_id
});
$("select[name=province_id]").change();
form.val("storeform", {
"city_id": data.city_id
});
$("select[name=city_id]").change();
form.val("storeform", {
"district_id": data.district_id
});
refreshFrom();//重新渲染form
map_class.map_change = true;
}
})
}
function timeTypeChange(type){
if(type == 1){
$('.time-type-view').show();
}else{
$('.time-type-view').hide();
}
}
</script>

328
app/shop/view/store/lists.html Executable file
View File

@@ -0,0 +1,328 @@
<link rel="stylesheet" type="text/css" href="SHOP_CSS/store_lists.css" />
<style>
.table-tab{margin-top: 0;}
</style>
<input id="store_exit" type="hidden" value="{$store_is_exit}"/>
<!-- 搜索框 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="add()">添加{$title}</button>
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="keyword" placeholder="请输入{$title}名称" 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="layui-tab table-tab" lay-filter="store_tab">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="" lay-typer="">全部{$title}</li>
<li lay-id="1" lay-type="1">营业中</li>
<li lay-id="0" lay-type="1">休息中</li>
<li lay-id="1" lay-type="2">已停业</li>
</ul>
<div id="store-lists"></div>
<div id="list_page"></div>
</div>
<!-- {$title}详情 -->
<script type="text/html" id="store">
<div class="table-title">
<div class="title-pic">
{{# if(d.store_image){ }}
<img layer-src src={{ns.img(d.store_image)}} alt="" onerror=src='__STATIC__/img/default_shop.png'>
{{# }else{ }}
<img layer-src src="__STATIC__/img/default_shop.png" alt="">
{{# } }}
</div>
<div class="title-content">
<p class="layui-elip">店铺名称{{d.store_name}}</p>
<p class="layui-elip">联系方式{{d.telphone}}</p>
</div>
</div>
</script>
<!-- {$title}管理员 -->
<script type="text/html" id="store_admin">
<div class="table-title">
<div class="title-pic">
<span>{{ d.username }}</span>
{if $store_is_exit == 1}
<a style="cursor: pointer;" class="text-color" onclick="resetStorePassword({{ d.store_id }})" >重置密码</a>
{/if}
</div>
</div>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="edit">编辑</a>
{{# if(d.is_frozen) { }}
<a class="layui-btn" lay-event="frozen">开启</a>
{{# } else{ }}
<a class="layui-btn" lay-event="frozen">关闭</a>
{{# } }}
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script>
var layer_pass,laytpl,table,form,element, laypage, list_count = 0, limit = 12, search_text = "", curr = 1, status = "", type = "", store_exit = $("#store_exit").val(),store_id="";
var repeat_flag = false; //防重复标识
layui.use(['form','element','laytpl'], function() {
form = layui.form;
element = layui.element;
laytpl = layui.laytpl;
laypage = layui.laypage;
form.render();
getStoreLists(search_text, curr, status, type);
pageList(list_count, limit, curr, status, type);
element.on('tab(store_tab)', function(){
search_text = "";
$("input[name='keyword']").val("");
var status = this.getAttribute('lay-id');
var type = this.getAttribute('lay-type');
getStoreLists(search_text, curr, status, type);
pageList(list_count, limit, curr, status, type);
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
/*table.reload({
page: {
curr: 1
},
where: data.field
});*/
search_text = data.field.keyword;
getStoreLists(search_text, curr, status, type);
pageList(list_count, limit, curr, status, type);
});
});
function getStoreLists(search_text, curr, status, type){
$("#store-lists").empty();
$.ajax({
type: "POST",
url: ns.url("shop/store/lists"),
data: {
"page": curr,
"page_size": limit,
"search_text": search_text,
"status" : status,
"type" : type
},
dataType: 'JSON',
async: false,
success: function(res) {
if (res.code == 0) {
var data = res.data.list;
list_count = res.data.count;
if(!data.length){
var empty = "<div class='empty' style='text-align: center;margin-top: 30px;color: #999'>无数据!</div>";
$("#store-lists").html(empty);
}
var html = "";
for (var i=0; i<data.length; i++) {
var d = data[i];
if (d.is_frozen == 1) {
html += '<div class="store-li">';
} else {
html += '<div class="store-li border-color">';
}
html += '<p class="store-name"><span class="store-name">'+ d.store_name +'</span>';
if(d.is_frozen == 1){
html += '<span class="type-name-cloe">停业</span>';
}else{
if(d.status == 0){
html += '<span class="type-name">休息</span>';
}else{
html += '<span class="type-name">正常</span>';
}
}
var telphone = d.telphone ? d.telphone : "暂无";
html += '</p>';
if(store_exit == 1){
html += '<p class="store-time user-name">管理员:'+ d.username +'<a class="edit-password" onclick="resetStorePassword('+ d.store_id +')">重置密码</a></p>';
}
html += '<p class="store-time">联系方式:'+ telphone +'</p>';
html += '<p class="store-time">地址:'+ d.full_address +' '+ d.address +'</p>';
html += '<div class="store-operation">';
html += '<span class="operation-type" onclick="editStore('+ d.store_id +')">编辑</span>';
if(d.is_default != 1) {
html += '<span class="operation-type" onclick="deleteStore(' + d.store_id + ')">删除</span>';
}
if(d.is_frozen == 1){
html += '<span class="operation-type" onclick="closeStore('+ d.store_id +', '+ d.is_frozen +')">开启</span>';
}else{
html += '<span class="operation-type" onclick="closeStore('+ d.store_id +', '+ d.is_frozen +')">停业</span>';
}
html += '</div>';
html += '</div>';
}
$("#store-lists").append(html);
}
}
});
}
function pageList(count, limit, curr, status, type) {
if (!count) return false;
page = new Page({
elem: 'list_page',
count: count,
limit: limit,
curr: curr,
callback: function(obj){
getStoreLists(search_text, obj.page, status, type);
}
});
}
function add() {
location.hash = ns.hash("shop/store/addStore");
}
/**
* 重置密码
*/
function resetStorePassword(data) {
laytpl($("#pass_change").html()).render(data, function(html) {
layer_pass = layer.open({
title: '重置密码',
skin: 'layer-tips-class',
type: 1,
area: ['550px'],
content: html
});
});
store_id=data;
}
function editStore(data) {
location.hash = ns.hash("shop/store/editStore",{"store_id":data});
}
function deleteStore(data){
layer.confirm('{$title}已开始运营,确认要删除吗?', function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/store/deleteStore"),
data: { store_id : data},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
var status = $(".layui-tab.table-tab .layui-tab-title .layui-this").attr('lay-id');
var type = $(".layui-tab.table-tab .layui-tab-title .layui-this").attr('lay-type');
getStoreLists(search_text, curr, status, type);
pageList(list_count, limit, curr, status, type);
}
}
});
});
}
function closeStore(store_id, is_frozen){
var msg = '{$title}已开始运营,确认要关闭吗?';
if(is_frozen == 1) {
msg = '确定要开启该{$title}吗?';
}
layer.confirm(msg, function(index) {
layer.close(index);
$.ajax({
url: ns.url("shop/store/frozenStore"),
data: {store_id:store_id, is_frozen:is_frozen},
dataType: 'JSON',
type: 'POST',
success: function(res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
var status = $(".layui-tab.table-tab .layui-tab-title .layui-this").attr('lay-id');
var type = $(".layui-tab.table-tab .layui-tab-title .layui-this").attr('lay-type');
getStoreLists(search_text, curr, status, type);
pageList(list_count, limit, curr, status, type);
}
}
});
});
}
function closePass() {
layer.close(layer_pass);
}
function determine(){
var password=$("#newPassword").val();
var newPasswordTow=$("#newPasswordTow").val();
if(password!=newPasswordTow){
layer.msg("两次输入密码不一致,请重新输入")
return false
}
if(password!="" && newPasswordTow!="" && password==newPasswordTow){
$.ajax({
type: "POST",
url: ns.url("shop/store/modifyPassword"),
data: {
store_id:store_id,
password:password
},
dataType: 'JSON',
success: function(res) {
layer.msg(res.message)
if(res.code==0){
layer.close(layer_pass);
}
}
});
}
}
</script>
<!-- 重置密码弹框html -->
<script type="text/html" id="pass_change">
<div class="layui-form" id="reset_pass" lay-filter="form">
<div class="layui-form-item">
<label class="layui-form-label mid"><span class="required">*</span></label>
<div class="layui-input-block">
<input type="password" id="newPassword" name="password" lay-verify="required" class="layui-input len-mid new_pass" maxlength="18">
</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="password" id="newPasswordTow" name="password" lay-verify="repass|required" class="layui-input len-mid" maxlength="18">
</div>
<div class="word-aux mid">请再一次输入密码两次输入密码须一致</div>
</div>
<div class="form-row mid">
<button class="layui-btn" lay-submit lay-filter="repass" onclick="determine()">确定</button>
<button class="layui-btn layui-btn-primary" onclick="closePass()">返回</button>
</div>
<input class="reset-pass-id" type="hidden" name="store_id" value="{{d}}"/>
</div>
</script>

60
app/shop/view/store/select.html Executable file
View File

@@ -0,0 +1,60 @@
<style>
html,body {width: 100%;height: 100%}
.store-empty {display: flex;height: 100%; align-items: center;justify-content: center}
.store-wrap {display: flex;height: 100%;flex-wrap: wrap;overflow-y: auto;padding: 15px;box-sizing: border-box;align-content: flex-start;}
.store-wrap .store-item {box-sizing: border-box;margin: 0 15px 15px 0;border: 1px solid #ccc;width: calc((100% - 30px) / 3);padding: 10px;cursor: pointer;height: fit-content;border-radius: 4px;}
.store-wrap .store-item.active {border-color: var(--base-color);}
.store-wrap .store-item .name {font-weight: bold;}
.store-wrap .store-item .status {margin: 5px 0;line-height: 1;font-size: 12px}
.store-wrap .store-item .address {color: #999;font-size: 12px;white-space: nowrap;text-overflow: ellipsis;overflow:hidden;width: 100%;}
.store-wrap .store-item:nth-child(3n+3) {margin-right: 0}
.open {color: #00A717}
.close {color: #ff0000}
</style>
{notempty name="store_list"}
<div class="store-wrap">
{foreach name="store_list" item="vo"}
<div class="store-item {if in_array($vo.store_id, $store_id)}active{/if}" data-store="{$vo.store_id}">
<div class="name">{$vo.store_name}</div>
<div class="status">
{if $vo.is_frozen == 1}
<span class="close">已停业</span>
{else/}
{if $vo.status == 0}
<span class="open">休息中</span>
{else/}
<span class="open">营业中</span>
{/if}
{/if}
</div>
<div class="address">{$vo.full_address}{$vo.address}</div>
</div>
{/foreach}
</div>
{else/}
<div class="store-empty">暂无可用门店</div>
{/notempty}
<script>
var storeList = {:json_encode($store_list)};
var multiple_type = "{$multiple_type ?? 0}"; //0多选 1单选
$('.store-item').click(function () {
if(multiple_type == 1){
$(".store-item").removeClass('active')
}
if ($(this).hasClass('active')) $(this).removeClass('active');
else $(this).addClass('active');
})
function selectStoreListener(callback) {
var store = [];
$('.store-item.active').each(function () {
var index = $(this).index();
store.push(storeList[index])
})
if (typeof callback == "function") callback(store);
}
</script>