初始上传

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,183 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\topic\shop\controller;
use app\shop\controller\BaseShop;
use addon\topic\model\Topic as TopicModel;
/**
* 专题活动
* @author Administrator
*
*/
class Topic extends BaseShop
{
/**
* 专题活动列表
*/
public function lists()
{
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$topic_name = input('topic_name', '');
$condition[] = [ 'site_id', '=', $this->site_id ];
if ($topic_name) {
$condition[] = [ 'topic_name', 'like', '%' . $topic_name . '%' ];
}
$status = input('status', '');
if ($status !== '') {
$condition[] = [ 'status', '=', $status ];
}
$order = 'create_time desc';
$field = '*';
$start_time = input('start_time', '');
$end_time = input('end_time', '');
if ($start_time && !$end_time) {
$condition[] = [ 'end_time', '>=', date_to_time($start_time) ];
} elseif (!$start_time && $end_time) {
$condition[] = [ 'start_time', '<=', date_to_time($end_time) ];
} elseif ($start_time && $end_time) {
$start_timestamp = date_to_time($start_time);
$end_timestamp = date_to_time($end_time);
$sql = "start_time between {$start_timestamp} and {$end_timestamp}";
$sql .= " or end_time between {$start_timestamp} and {$end_timestamp}";
$sql .= " or (start_time <= {$start_timestamp} and end_time >= {$end_timestamp})";
$condition[] = [ '', 'exp', \think\facade\Db::raw($sql) ];
}
$topic_model = new TopicModel();
$res = $topic_model->getTopicPageList($condition, $page, $page_size, $order, $field);
return $res;
} else {
return $this->fetch("topic/lists");
}
}
/**
* 添加专题活动
*/
public function add()
{
if (request()->isJson()) {
$topic_name = input("topic_name", '');
$start_time = input("start_time", 0);
$end_time = input("end_time", 0);
$remark = input("remark", '');
$topic_adv = input("topic_adv", '');
$bg_color = input("bg_color", '#ffffff');
$goods = input("goods", '{}');
$topic_model = new TopicModel();
$data = array (
'site_id' => $this->site_id,
"topic_name" => $topic_name,
"start_time" => $start_time,
"end_time" => $end_time,
"remark" => $remark,
"topic_adv" => $topic_adv,
'bg_color' => $bg_color,
'goods' => json_decode($goods, true),
'create_time' => time()
);
$res = $topic_model->addTopic($data);
return $res;
} else {
return $this->fetch("topic/add");
}
}
/**
* 编辑专题活动
*/
public function edit()
{
$topic_id = input("topic_id", '');
$topic_model = new TopicModel();
if (request()->isJson()) {
$topic_name = input("topic_name", '');
$start_time = input("start_time", 0);
$end_time = input("end_time", 0);
$remark = input("remark", '');
$topic_adv = input("topic_adv", '');
$bg_color = input("bg_color", '#ffffff');
$goods = input("goods", '{}');
$del_id = input('del_id', '');
$data = array (
"topic_name" => $topic_name,
"start_time" => $start_time,
"end_time" => $end_time,
"remark" => $remark,
"topic_adv" => $topic_adv,
"topic_id" => $topic_id,
'bg_color' => $bg_color,
'goods' => json_decode($goods, true),
'modify_time' => time()
);
$res = $topic_model->editTopic($data, $this->site_id, $del_id);
return $res;
} else {
$condition = array (
[ "topic_id", "=", $topic_id ]
);
$topic_info_result = $topic_model->getTopicDetail($condition);
if (empty($topic_info_result[ 'data' ])) $this->error('未获取到活动数据', href_url('topic://shop/topic/lists'));
$this->assign("info", $topic_info_result[ "data" ]);
$this->assign('sku_ids', implode(',', array_column($topic_info_result[ 'data' ][ 'goods_list' ], 'sku_id')));
return $this->fetch("topic/edit");
}
}
/**
* 查看专题活动
*/
public function detail()
{
$topic_id = input("topic_id", '');
$topic_model = new TopicModel();
$condition = array (
[ "topic_id", "=", $topic_id ]
);
$topic_info_result = $topic_model->getTopicDetail($condition);
if (empty($topic_info_result[ 'data' ])) $this->error('未获取到活动数据', href_url('topic://shop/topic/lists'));
$this->assign("info", $topic_info_result[ "data" ]);
$this->assign('sku_ids', implode(',', array_column($topic_info_result[ 'data' ][ 'goods_list' ], 'sku_id')));
return $this->fetch("topic/detail");
}
/**
* 删除专题活动
*/
public function delete()
{
$topic_id = input("topic_id", '');
$topic_model = new TopicModel();
$res = $topic_model->deleteTopic($topic_id, $this->site_id);
return $res;
}
/**
* 删除专题活动(批量)
*/
public function deleteAll(){
if (request()->isJson()) {
$topic_id = input("topic_id", '');
$topic_model = new TopicModel();
foreach ($topic_id as $k => $v){
$res = $topic_model->deleteTopic($v, $this->site_id);
}
return $res;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

View File

@@ -0,0 +1,355 @@
<style>
.layui-form-item .layui-input-inline.end-time{float: none;}
.goods-title{display: flex;align-items: center;}
.goods-title .goods-img{display: flex;align-items: center;justify-content: center;width: 55px;height: 55px;margin-right: 5px;}
.goods-title .goods-img img{max-height: 100%;max-width: 100%;}
.goods-title .goods-name{flex: 1;line-height: 1.6;}
.goods_num {padding-left: 20px;}
</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 type="text" name="topic_name" lay-verify="required" autocomplete="off" class="layui-input len-long" maxlength="40">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>活动时间:</label>
<div class="layui-inline">
<div class="layui-input-inline">
<input type="text" id="start_time" name="start_time" lay-verify="required" class="layui-input len-mid" autocomplete="off">
<i class=" iconrili iconfont calendar"></i>
</div>
<span class="layui-form-mid">-</span>
<div class="layui-input-inline end-time">
<input type="text" id="end_time" name="end_time" lay-verify="required|time" class="layui-input len-mid" autocomplete="off">
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">横幅图片:</label>
<div class="layui-input-inline img-upload">
<div class="upload-img-block icon">
<div class="upload-img-box">
<div class="upload-default" id="webLogoUpload">
<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="topic_adv" />
</div>
<!-- <p id="webLogoUpload" class="no-replace">替换</p>
<input type="hidden" name="topic_adv" />
<i class="del">x</i> -->
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">活动内容:</label>
<div class="layui-input-block">
<textarea class="layui-textarea len-long" name="remark" maxlength="300"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>商品:</label>
<div class="layui-input-block">
<table class="layui-table" id="goods" lay-skin="line" lay-size="lg">
<colgroup>
<col width="40%">
<col width="15%">
<col width="15%">
<col width="15%">
<col width="15%">
</colgroup>
<thead>
<tr>
<th>商品名称</th>
<th>库存</th>
<th>价格</th>
<th>活动价格</th>
<th class="operation">操作</th>
</tr>
</thead>
<tbody>
<tr class="goods-empty">
<td colspan="5">
<div>未添加商品</div>
</td>
</tr>
</tbody>
</table>
<button class="layui-btn" onclick="addGoods()">添加商品</button>
<span class="goods_num">已选商品(<span id="goods_num" class="text-color">0</span></span>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
<a id="webLogoUploadImage"></a>
</div>
</div>
<script>
var selectGoodsSkuId = [];
var saveData = null;
var totalUploadNum = 0;
var completeUploadNum = 0;
var upload;
layui.use(['form','laydate','colorpicker'], function() {
var form = layui.form,
laydate = layui.laydate,
colorpicker = layui.colorpicker,
currentDate = new Date(),
minDate = "",
repeat_flag = false;//防重复标识
currentDate.setDate(currentDate.getDate() + 30);
form.render();
upload = new Upload({
elem: '#webLogoUpload',
auto:false,
bindAction:'#webLogoUploadImage',
callback: function(res) {
uploadComplete('topic_adv', res.data.pic_path);
}
});
function uploadComplete(field, pic_path) {
saveData.field[field] = pic_path;
completeUploadNum += 1;
if(completeUploadNum == totalUploadNum){
saveFunc();
}
}
function saveFunc(){
if(repeat_flag) return;
repeat_flag = true;
var data = saveData;
$.ajax({
url: ns.url("topic://shop/topic/add"),
dataType: 'JSON',
type: 'POST',
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("topic://shop/topic/lists");
layer.close(index);
},btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
})
}else{
layer.msg(res.message);
}
}
})
}
/**
* 颜色
*/
colorpicker.render({
elem: '#colorpicker', //绑定元素
color: "#FFFFFF",
done: function(color) {
$("#bg_color").val(color);
}
});
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime',
value: new Date(),
done: function(value) {
minDate = value;
reRender();
}
});
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime',
value: new Date(currentDate)
});
/**
* 重新渲染结束时间
* */
function reRender() {
$("#end_time").remove();
$(".end-time").html('<input type="text" id="end_time" name="end_time" placeholder="请输入结束时间" lay-verify="required|time" class = "layui-input len-mid" > ');
laydate.render({
elem: '#end_time',
type: 'datetime',
min: minDate
});
}
form.verify({
topic_price: function(value, item) {
var price = $(item).parents("tr").find(".goods-price").text();
if (value.trim() == "") {
return '活动价格不能为空';
}
if (parseFloat(value) <= 0) {
return '活动价格必须大于0';
}
if (parseFloat(value) > parseFloat(price)) {
return '活动价格不能大于商品价格';
}
var pattern = /^[0-9]+(\.[0-9]{1,2})?$/;
if(!pattern.test(value)){
return '请输入正确格式';
}
var arrMen = value.split(".");
var val = 0;
if (arrMen.length == 2) {
val = arrMen[1];
}
if (val.length > 2) {
return '活动价格最多保留两位小数';
}
},
time: function(value) {
var now_time = (new Date()).getTime();
var start_time = (new Date($("#start_time").val())).getTime();
var end_time = (new Date(value)).getTime();
if (now_time > end_time) {
return '结束时间不能小于当前时间!'
}
if (start_time > end_time) {
return '结束时间不能小于开始时间!';
}
},
});
form.on("submit(save)",function(data){
data.field.start_time = ns.date_to_time(data.field.start_time);
data.field.end_time = ns.date_to_time(data.field.end_time);
// 删除图片
if(!data.field.topic_adv) upload.delete();
if ($('#goods tbody tr[data-sku-id]').length == 0) {
layer.msg('请选择商品', {icon: 5});
return;
}
var goods = {};
$('#goods tbody tr[data-sku-id]').each(function(){
var item = {
goods_id : $(this).attr('data-goods-id'),
sku_id : $(this).attr('data-sku-id'),
topic_price : $(this).find('.topic-price').val()
};
if (!goods['goods_' + item.goods_id]) goods['goods_' + item.goods_id] = [];
goods['goods_' + item.goods_id].push(item);
});
data.field.goods = JSON.stringify(goods);
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();
}
})
});
/**
* 添加商品
*/
function addGoods() {
goodsSelect(function (data) {
if (Object.keys(data).length == 0) {
selectGoodsSkuId = [];
$('.goods-empty').show();
$("#goods_num").text(selectGoodsSkuId.length);
$("#goods tbody tr:not(.goods-empty)").remove();
return;
}
var html = '';
for (var key in data) {
for (var sku in data[key].selected_sku_list) {
var item = data[key].selected_sku_list[sku];
if(selectGoodsSkuId.indexOf(parseInt(item.sku_id)) != -1){
continue;
}
html += "<tr data-sku-id=" + item.sku_id + " data-goods-id=" + item.goods_id + ">";
html += '<td><div class="goods-title"><div class="goods-img"><img layer-src="" src="' + ns.img(item.sku_image) + '" alt=""></div><p class="multi-line-hiding goods-name">' + item.sku_name + '</p></td>';
html += "<td>" + item.stock + "</td>";
html += "<td class='goods-price'>" + item.price + "</td>";
html += '<td><input type="text" class="layui-input topic_pic len-input topic-price" lay-verify="topic_price" min="0.00" value="' + item.price + '"/></td>';
html += "<td class='operation'> <div class='table-btn '><a href='javascript:;' class='layui-btn' onclick='deleteGoods(this)'>删除商品</a></div></td>";
html += "</tr>";
selectGoodsSkuId.push(item.sku_id);
}
}
if(selectGoodsSkuId.length) {
$('.goods-empty').hide();
$("#goods tbody").append(html);
} else {
$('.goods-empty').show();
}
$("#goods_num").text(selectGoodsSkuId.length)
}, selectGoodsSkuId, {mode: "sku"});
}
/**
* 删除商品
*/
function deleteGoods(data) {
var obj = $(data).parent().parent().parent();
$(obj).remove();
for (var i in selectGoodsSkuId) {
if (selectGoodsSkuId[i] == Number($(obj).attr("data-sku-id"))) {
selectGoodsSkuId.splice(i, 1);
}
}
$("#goods_num").html(selectGoodsSkuId.length);
if(selectGoodsSkuId.length) $('.goods-empty').hide();
else $('.goods-empty').show();
}
function back(){
location.hash = ns.hash("topic://shop/topic/lists");
}
</script>

View File

@@ -0,0 +1,105 @@
<link rel="stylesheet" href="STATIC_CSS/promotion_detail.css">
<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="promotion-view">
<div class="promotion-view-item">
<label>活动名称:</label>
<span>{$info.topic_name}</span>
</div>
<div class="promotion-view-item">
<label>开始时间:</label>
<span>{:date('Y-m-d H:i:s',$info.start_time)}</span>
</div>
<div class="promotion-view-item">
<label>结束时间:</label>
<span>{:date('Y-m-d H:i:s',$info.end_time)}</span>
</div>
</div>
<div class="promotion-view">
<div class="promotion-view-item-line">
<label class="promotion-view-item-custom-label">横幅图片:</label>
<div class="promotion-view-item-custom-box img-upload">
<div class="upload-img-block icon">
<div class="upload-img-box">
{if condition="$info.topic_adv"}
<img layer-src src="{:img($info.topic_adv)}" >
{else/}
<img layer-src src="__STATIC__/img/shape.png" />
{/if}
</div>
</div>
</div>
</div>
{if !empty($info.remark)}
<div class="promotion-view-item-line">
<label class="promotion-view-item-custom-label">活动内容:</label>
<div class="promotion-view-item-custom-box">{$info.remark}</div>
</div>
{/if}
</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='promotion-view-list'>
<table id="promotion_list"></table>
</div>
</div>
</div>
<script type='text/html' id="promotion_list_item_box_html">
<div class="promotion-list-item-title">
<div class="promotion-list-item-title-icon">
<img src="{{ ns.img(d.sku_image) }}" alt="">
</div>
<p class="promotion-list-item-title-name multi-line-hiding">{{ d.sku_name }}</p>
</div>
</script>
<script>
var promotion_list = {:json_encode($info.goods_list, JSON_UNESCAPED_UNICODE)};
layui.use('table', function() {
new Table({
elem: '#promotion_list',
cols: [
[{
field: 'sku_name',
title: '商品名称',
width: '30%',
unresize: 'false',
templet: '#promotion_list_item_box_html'
}, {
field: 'price',
title: '商品价格',
unresize: 'false',
templet: function(data) {
return '¥' + data.price;
}
}, {
field: 'stock',
title: '库存',
unresize: 'false',
}, {
title: '活动价格',
unresize: 'false',
templet: function(data) {
return '¥' + data.topic_price;
}
}]
],
data: promotion_list
});
});
</script>

View File

@@ -0,0 +1,390 @@
<style>
.layui-form-item .layui-input-inline.end-time{float: none;}
.goods-title{display: flex;align-items: center;}
.goods-title .goods-img{display: flex;align-items: center;justify-content: center;width: 55px;height: 55px;margin-right: 5px;}
.goods-title .goods-img img{max-height: 100%;max-width: 100%;}
.goods-title .goods-name{flex: 1;line-height: 1.6;}
.goods_num {padding-left: 20px;}
</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 type="text" name="topic_name" value="{$info.topic_name}" lay-verify="required" autocomplete="off" class="layui-input len-long" maxlength="40">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>活动时间:</label>
<div class="layui-inline">
<div class="layui-input-inline">
<input type="text" id="start_time" name="start_time" value="{:date('Y-m-d H:i:s', $info.start_time)}" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<span class="layui-form-mid">-</span>
<div class="layui-input-inline end-time">
<input type="text" id="end_time" name="end_time" value="{:date('Y-m-d H:i:s', $info.end_time)}" lay-verify="required|time" class="layui-input len-mid" autocomplete="off" readonly>
<input type="hidden" value="{$info.end_time}" id="old_end_time">
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">横幅图片:</label>
<div class="layui-input-inline img-upload">
<div class="upload-img-block icon">
<div class="upload-img-box {if !empty($info.topic_adv)}hover{/if}">
<div class="upload-default" id="webLogoUpload">
{if empty($info.topic_adv)}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{else/}
<div id="preview_webLogoUpload" class="preview_img">
<img layer-src src="{:img($info.topic_adv)}" 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="topic_adv" value="{$info.topic_adv}"/>
</div>
<!-- <p id="webLogoUpload" class=" {if condition="$info.topic_adv"} replace {else/} no-replace{/if}">替换</p>
<i class="del {if !empty($info.topic_adv)}show{/if}">x</i> -->
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">活动内容:</label>
<div class="layui-input-block">
<textarea class="layui-textarea len-long" name="remark" maxlength="300">{$info.remark}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>商品:</label>
<div class="layui-input-block">
<table class="layui-table" id="goods" lay-skin="line" lay-size="lg">
<colgroup>
<col width="40%">
<col width="15%">
<col width="15%">
<col width="15%">
<col width="15%">
</colgroup>
<thead>
<tr>
<th>商品名称</th>
<th>库存</th>
<th>价格</th>
<th>活动价格</th>
<th class="operation">操作</th>
</tr>
</thead>
<tbody>
{notempty name="$info['goods_list']"}
{foreach name="$info['goods_list']" item="item"}
<tr data-id="{$item.id}" data-sku-id="{$item.sku_id}" data-goods-id="{$item.goods_id}">
<td>
<div class="goods-title">
<div class="goods-img">
{if $item.sku_image}
<img layer-src="" src="{:img($item.sku_image)}" alt="">
{else /}
<img layer-src="" src="__STATIC__/img/shape.png" alt="">
{/if}
</div>
<p class="multi-line-hiding goods-name">{$item.sku_name}</p>
</div>
<td>{$item.stock}</td>
<td class='goods-price'>{$item.price}</td>
<td><input type="number" class="layui-input len-input topic-price" lay-verify="required|topic_price" min="0.00" value="{$item.topic_price}"/></td>
<td class='operation'><div class='table-btn '><a href='javascript:;' class='layui-btn' onclick='deleteGoods(this)'>删除商品</a></div></td>
</tr>
{/foreach}
{/notempty}
<tr class="goods-empty" {notempty name="$info['goods_list']"}style="display:none;"{/notempty}>
<td colspan="5">
<div>未添加商品</div>
</td>
</tr>
</tbody>
</table>
<button class="layui-btn" onclick="addGoods()">添加商品</button> <span class="goods_num">已选商品(<span id="goods_num" class="text-color">{$info.goods_list_count}</span></span>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
<a id="webLogoUploadImage"></a>
</div>
<input type="hidden" name="topic_id" value="{$info.topic_id}">
<input type="hidden" name="del_id" value="">
</div>
<script>
var selectGoodsSkuId = '{$sku_ids}'.split(',');
var saveData = null;
var totalUploadNum = 0;
var completeUploadNum = 0;
var upload;
layui.use(['form','laydate','colorpicker'], function() {
var form = layui.form,
laydate = layui.laydate,
colorpicker = layui.colorpicker,
startTime = {$info.start_time},
endTime = {$info.end_time},
minDate = "",
repeat_flag = false;//防重复标识
form.render();
upload = new Upload({
elem: '#webLogoUpload',
auto:false,
bindAction:'#webLogoUploadImage',
callback: function(res) {
uploadComplete('topic_adv', 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("topic://shop/topic/edit"),
dataType: 'JSON',
type: 'POST',
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("topic://shop/topic/lists");
layer.close(index);
},btn2: function(index, layero) {
layer.close(index);
}
})
}else{
layer.msg(res.message);
}
}
})
}
/**
* 颜色
*/
colorpicker.render({
elem: '#colorpicker', //绑定元素
color: "{$info.bg_color}",
done: function(color) {
$("#bg_color").val(color);
}
});
var now_time = ((new Date()).getTime())/1000;
var start_time = ((new Date($("#start_time").val())).getTime())/1000;
var old_end_time = ((new Date($("#end_time").val())).getTime())/1000;
// if(now_time <= start_time){
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime',
value: ns.time_to_date(startTime),
done: function(value) {
minDate = value;
reRender();
}
});
// }
// if(now_time <= old_end_time){
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime',
value: ns.time_to_date(endTime)
});
// }
/**
* 重新渲染结束时间
* */
function reRender() {
$("#end_time").remove();
$(".end-time").html('<input type="text" id="end_time" name="end_time" placeholder="请输入结束时间" lay-verify="required|time" class = "layui-input len-mid" > ');
laydate.render({
elem: '#end_time',
type: 'datetime',
min: minDate
});
}
form.verify({
topic_price: function(value, item) {
var price = $(item).parents("tr").find(".goods-price").text();
if (value.trim() == "") {
return '活动价格不能为空';
}
if (parseFloat(value) <= 0) {
return '活动价格必须大于0';
}
if (parseFloat(value) > parseFloat(price)) {
return '活动价格不能大于商品价格';
}
var pattern = /^[0-9]+(\.[0-9]{1,2})?$/;
if(!pattern.test(value)){
return '请输入正确格式';
}
var arrMen = value.split(".");
var val = 0;
if (arrMen.length == 2) {
val = arrMen[1];
}
if (val.length > 2) {
return '活动价格最多保留两位小数';
}
},
time: function(value) {
var now_time = ((new Date()).getTime())/1000;
var start_time = ((new Date($("#start_time").val())).getTime())/1000;
var end_time = ((new Date(value)).getTime())/1000;
var old_end_time = $("#old_end_time").val();
if (now_time > end_time) {
return '结束时间不能小于当前时间!'
}
if (start_time > end_time) {
return '结束时间不能小于开始时间!';
}
if (old_end_time > end_time) {
return '结束时间不能小于之前设置的结束时间!';
}
},
})
form.on("submit(save)",function(data){
data.field.start_time = ns.date_to_time(data.field.start_time);
data.field.end_time = ns.date_to_time(data.field.end_time);
// 删除图片
if(!data.field.topic_adv) upload.delete();
if ($('#goods tbody tr[data-sku-id]').length == 0) {
layer.msg('请选择商品', {icon: 5});
return;
}
var goods = {};
$('#goods tbody tr[data-sku-id]').each(function(){
var item = {
id:$(this).attr('data-id'),
goods_id : $(this).attr('data-goods-id'),
sku_id : $(this).attr('data-sku-id'),
topic_price : $(this).find('.topic-price').val()
};
if (!goods['goods_' + item.goods_id]) goods['goods_' + item.goods_id] = [];
goods['goods_' + item.goods_id].push(item);
})
data.field.goods = JSON.stringify(goods);
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();
}
})
});
/**
* 添加商品
*/
function addGoods() {
goodsSelect(function (data) {
if (Object.keys(data).length == 0) {
selectGoodsSkuId = [];
$('.goods-empty').show();
$("#goods_num").text(selectGoodsSkuId.length);
$("#goods tbody tr:not(.goods-empty)").remove();
return;
}
var html = '';
for (var key in data) {
for (var sku in data[key].selected_sku_list) {
var item = data[key].selected_sku_list[sku];
if(selectGoodsSkuId.indexOf(parseInt(item.sku_id)) != -1){
continue;
}
html += "<tr data-sku-id=" + item.sku_id + " data-goods-id=" + item.goods_id + ">";
html += '<td><div class="goods-title"><div class="goods-img"><img layer-src="" src="' + ns.img(item.sku_image) + '" alt=""></div><p class="multi-line-hiding goods-name">' + item.sku_name + '</p></td>';
html += "<td>" + item.stock + "</td>";
html += "<td class='goods-price'>" + item.price + "</td>";
html += '<td><input type="text" class="layui-input topic_pic len-input topic-price" lay-verify="topic_price" min="0.00" value="' + item.price + '"/></td>';
html += "<td class='operation'> <div class='table-btn '><a href='javascript:;' class='layui-btn' onclick='deleteGoods(this)'>删除商品</a></div></td>";
html += "</tr>";
selectGoodsSkuId.push(item.sku_id);
}
}
if(selectGoodsSkuId.length) {
$('.goods-empty').hide();
$("#goods tbody").append(html);
} else {
$('.goods-empty').show();
}
$("#goods_num").text(selectGoodsSkuId.length)
}, selectGoodsSkuId, {mode: "sku"});
}
/**
* 删除商品
*/
function deleteGoods(data) {
var obj = $(data).parent().parent().parent();
$(obj).remove();
for (var i in selectGoodsSkuId) {
if (selectGoodsSkuId[i] == Number($(obj).attr("data-sku-id"))) {
selectGoodsSkuId.splice(i, 1);
}
}
var delId = $('input[name="del_id"]').val().length>0 ? $('input[name="del_id"]').val().toString().split(',') : [];
delId.push($(obj).attr('data-id'));
$('input[name="del_id"]').val(delId);
$("#goods_num").html(selectGoodsSkuId.length)
if(selectGoodsSkuId.length) $('.goods-empty').hide();
else $('.goods-empty').show();
}
function back(){
location.hash = ns.hash("topic://shop/topic/lists");
}
</script>

View File

@@ -0,0 +1,244 @@
<style>
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
.layui-layout-admin .table-tab .layui-tab-title{margin-bottom: 15px;}
</style>
<div class="single-filter-box">
<button class="layui-btn" onclick="clickAdd()">添加专题活动</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="topic_name" 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" 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>
</div>
</div>
<div class="form-row">
<button type="button" class="layui-btn" lay-filter="search" lay-submit>筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="topic_tab">
<ul class="layui-tab-title">
<li class="layui-this" data-status="">全部</li>
<li data-status="1">未开始</li>
<li data-status="2">进行中</li>
<li data-status="3">已结束</li>
</ul>
<div class="layui-tab-content">
<!-- 列表 -->
<table id="topic_list" lay-filter="topic_list"></table>
</div>
</div>
<!-- 时间 -->
<script id="time" type="text/html">
<div class="layui-elip">开始{{ns.time_to_date(d.start_time)}}</div>
<div class="layui-elip">结束{{ns.time_to_date(d.end_time)}}</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="toolbarAction">
<button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
</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>
<a class="layui-btn" lay-event="delete">删除</a>
</div>
</script>
<script>
layui.use(['form', 'element','laydate'], function() {
form = layui.form,
element = layui.element,
laydate = layui.laydate,
repeat_flag = false; //防重复标识
form.render();
element.on('tab(topic_tab)', function() {
table.reload({
page: {
curr: 1
},
where: {
'status': this.getAttribute('data-status')
}
});
});
table = new Table({
elem: '#topic_list',
url: ns.url("topic://shop/topic/lists"),
cols: [
[{
type: 'checkbox',
width: '3%',
},{
field: 'topic_name',
title: '专题名称',
unresize: 'false',
width: '25%'
}, {
title: '活动时间',
unresize: 'false',
width: '20%',
templet: '#time'
}, {
title: '状态',
unresize: 'false',
width: '30%',
templet: function (data) {
if(data.status == 1){
return '未开始';
}else if(data.status == 2){
return '进行中';
}else if(data.status == 3){
return '已结束';
}
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
toolbar: '#toolbarAction'
});
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime'
});
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime'
});
// 监听工具栏操作
table.toolbar(function (obj) {
var data = obj.data;
if(data.length <= 0) return;
var topicIdAll = [];
for (var i in data){
topicIdAll.push(data[i].topic_id);
}
switch (obj.event) {
case 'delete':
deleteTopicAll(topicIdAll)
break;
}
})
function deleteTopicAll(data){
layer.confirm('确定要删除该专题活动吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("topic://shop/topic/deleteAll"),
data: {topic_id: data},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
table.reload({
page: {
curr: 1
},
});
}
});
}, function() {
layer.close();
repeat_flag = false;
});
}
/**
* 监听工具栏操作
*/
table.tool(function (obj) {
var data = obj.data;
switch (obj.event) {
case 'delete': //删除
layer.confirm('确定要删除该专题活动吗?', function (index) {
layer.close(index);
$.ajax({
url: ns.url("topic://shop/topic/delete"),
data: {topic_id: data.topic_id},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload({
page: {
curr: 1
},
});
}
}
});
});
break;
case 'edit': //编辑
location.hash = ns.hash("topic://shop/topic/edit?topic_id=" + data.topic_id);
break;
case 'detail': //详情
location.hash = ns.hash("topic://shop/topic/detail?topic_id=" + data.topic_id);
break;
}
});
layui.use('form', function () {
var form = layui.form;
form.render();
form.on();
});
form.on('submit(search)', function (data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
function clickAdd() {
location.hash = ns.hash("topic://shop/topic/add");
}
</script>