记得上下班打卡 | git大法好,push需谨慎

Commit 28872b8d authored by 胡佳晨's avatar 胡佳晨

Merge remote-tracking branch 'origin/dev_goblin' into dev_goblin

parents 19c4d18c 1186e597
package com.liquidnet.service.goblin.dto.manage.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@ApiModel(value = "GoblinMgtCategorySpecVo", description = "分类关联的规格信息")
@Data
public class GoblinMgtCategorySpecVo implements Serializable, Cloneable {
private static final long serialVersionUID = -1807588898644126000L;
@ApiModelProperty(position = 11, value = "分类ID")
private String cateId;
@ApiModelProperty(position = 12, value = "规格ID")
private String specId;
@ApiModelProperty(position = 13, value = "规格名称")
private String specName;
@ApiModelProperty(position = 14, value = "删除标记[0-未删除|1-删除")
private String delFlg;
private static final GoblinMgtCategorySpecVo obj = new GoblinMgtCategorySpecVo();
public static GoblinMgtCategorySpecVo getNew() {
try {
return (GoblinMgtCategorySpecVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinMgtCategorySpecVo();
}
}
}
......@@ -14,7 +14,9 @@ public class GoblinGoodsTagVo implements Serializable, Cloneable {
private String tagId;
@ApiModelProperty(position = 12, value = "标签名称")
private String tagName;
@ApiModelProperty(position = 13, value = "排序[数值越小,排序越前]")
@ApiModelProperty(position = 13, value = "标签图片")
private String tagPic;
@ApiModelProperty(position = 14, value = "排序[数值越小,排序越前]")
private Integer sort;
public GoblinGoodsTagVo setSort(Integer sort) {
......@@ -35,6 +37,7 @@ public class GoblinGoodsTagVo implements Serializable, Cloneable {
if (null == source) return this;
this.setTagId(source.getTagId());
this.setTagName(source.getTagName());
this.setTagPic(source.getTagPic());
return this;
}
}
......@@ -22,8 +22,8 @@ public class GoblinSelfTagVo implements Serializable, Cloneable {
private String tagType;
@ApiModelProperty(position = 15, value = "标签所属[0-普通标签|1-专属标签]")
private String tagBelong;
@ApiModelProperty(position = 16, value = "排序[数值越小,排序越前]")
private Integer sort;
@ApiModelProperty(position = 16, value = "删除标记[0-未删除|1-删除]")
private String delFlg;
private static final GoblinSelfTagVo obj = new GoblinSelfTagVo();
......
package com.liquidnet.service.goblin.dto.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinMgtCategorySpecVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@ApiModel(value = "GoblinStoreGoodsCategoryVo", description = "店铺商品分类")
@Data
public class GoblinStoreGoodsCategoryVo implements Serializable, Cloneable {
private static final long serialVersionUID = -9043528667634548144L;
@ApiModelProperty(position = 11, value = "店铺ID")
private String storeId;
@ApiModelProperty(position = 12, value = "分类ID")
private String cateId;
@ApiModelProperty(position = 13, value = "分类名称")
private String name;
@ApiModelProperty(position = 14, value = "排序[数值越小,排序越前]")
private Integer sort;
@ApiModelProperty(position = 15, value = "分类层级[1-一级|2-二级|3-三级]")
private String grade;
@ApiModelProperty(position = 16, value = "父级分类ID")
private String catePid;
@ApiModelProperty(position = 17, value = "是否需要填写ISBN[0-否|1-是]")
private String neIsbn;
@ApiModelProperty(position = 18, value = "删除标记[0-未删除|1-删除]")
private String delFlg;
private String createdBy;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime createdAt;
private String updatedBy;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime updatedAt;
private String deletedBy;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateUtil.DATE_FULL_STR)
private LocalDateTime deletedAt;
private static final GoblinStoreGoodsCategoryVo obj = new GoblinStoreGoodsCategoryVo();
public static GoblinStoreGoodsCategoryVo getNew() {
try {
return (GoblinStoreGoodsCategoryVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new GoblinStoreGoodsCategoryVo();
}
}
}
......@@ -71,7 +71,11 @@ public class GoblinFrontCubeParam implements Serializable {
@ApiModelProperty(value = "推荐文案4")
private String informationD;
/**
* 0未删除1已删除
*/
@ApiModelProperty(value = "0未删除1已删除")
private Integer delTag;
/**
* 合集id
*/
......
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('商品合集')" />
<th:block th:include="include :: bootstrap-fileinput-css" />
<style>
.layui-layer-btn0 {
padding: 0;
}
.paddings {
padding: 0 !important;
}
#addClassify {
display: none;
width: 540px;
padding: 20px;
}
#addClassify .selectClassify {
display: flex;
align-items: center;
}
#addClassify .selectClassify label {
display: flex;
margin-right: 20px;
align-items: center;
}
#addClassify .selectClassify label input {
margin: 0;
margin-right: 2px;
}
.shadeCss,.layui-layer-shade {
background-color: rgb(0, 0, 0, 0.5) !important;
}
.select-list ul {
display: flex;
justify-content: space-between;
}
.selectClassifyOne {
display: flex;
align-items: center;
margin: 12px 0;
}
.selectClassifyOne span {
width: 45px;
}
.tagStore .fixed-table-toolbar {
display: flex;
}
.tagStore .fixed-table-toolbar .bs-bars {
flex: 1;
}
.tagStore .fixed-table-toolbar .bs-bars .btn-group-sm {
display: flex;
justify-content: space-between;
}
.leftSearchBox {
display: flex;
align-items: center;
}
.leftSearchBox input, .leftSearchBox select {
width: 200px;
height: 34px;
margin-right: 12px;
}
.ibox-content {
border-style: none;
padding: 0;
}
.kv-hidden {
display: none !important;
}
</style>
</head>
<body class="tagStore">
<div class="container-div">
<div class="row">
<div class="btn-group-sm" id="toolbar"></div>
<div class="col-sm-12 search-collapse">
<form id="coupon-form">
<div class="select-list">
<ul>
<div class="leftSearchBox">
<input class="form-control" type="text" placeholder="请输入名字">
类型:<select class="type form-control" data-first-title="请选择">
<option value="">请选择</option>
</select>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
</li>
</div>
<div>
<a class="btn btn-success" id="button-open-10">
<i class="fa fa-plus"></i> 创建分类
</a>
<a class="btn btn-warning" id="button-open-11">
<i class="fa fa-download"></i> 导出Excel
</a>
</div>
</ul>
</div>
</form>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
<div id="addClassify">
<div class="selectClassify">
<span>LOGO:</span>
<img id="viewImg" src="" alt="" style="max-height:150px;">
<div class="ibox-content">
<div class="form-group">
<div class="file-loading">
<input id="fileinput" type="file" name="file" data-browse-on-zone-click="true" data-theme="fas">
</div>
</div>
</div>
</div>
<div class="selectClassifyOne">
<span>昵称:</span>
<input class="form-control" type="text">
</div>
<div class="selectClassify">
<span>类别:</span>
<label>
<input type="radio" checked value="1" id="optionsRadios1" name="optionsRadios"><span>音乐人</span></label>
<label>
<input type="radio" value="2" id="optionsRadios1" name="optionsRadios"><span>艺术家</span></label>
<label>
<input type="radio" value="3" id="optionsRadios1" name="optionsRadios"><span>IP</span></label>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer"/>
<th:block th:include="include :: bootstrap-fileinput-js" />
<script th:inline="javascript">
var dicCouponBusiType = [[${@dict.getType('zhengzai_coupon_busi_type')}]];
var dicCouponBindType = [[${@dict.getType('zhengzai_coupon_bind_type')}]];
var platformUrl = [[${platformUrl}]];
var prefix = ctx + "candy/coupon/mgt";
var prefix2 = ctx + "local";
var viewMgtCouponFlag = [[${@permission.hasPermi('candy:coupon:mgt:detail')}]];
var cancelMgtCouponFlag = [[${@permission.hasPermi('candy:coupon:mgt:cancel')}]];
var couType = [[${couType}]];
$(function () {
var options = {
url: prefix + "/list",
createUrl: prefix + "/add/{id}",
detailUrl: prefix2 + "/shopDetail",
removeUrl: prefix + "/cancel/{id}",
// updateUrl: prefix + "/edit/{id}",
// exportUrl: prefix + "/export",
onCheck: onCheck,
sortName: "createdAt",
sortOrder: "desc",
modalName: "代金券",
showSearch: false,
showRefresh: true,
showColumns: false,
showToggle: false,
columns: [
{
checkbox: true
},
{
field: 'valFace',
title: '头像'
},
{
field: 'bindType',
title: '名称',
formatter: function(value, row, index) {
// $('.pull-right').hide()
return $.table.selectDictLabel(dicCouponBindType, value);
}
},
{
field: 'bindType',
title: '类型',
formatter: function(value, row, index) {
return $.table.selectDictLabel(dicCouponBindType, value);
}
},
{
title: '操作',
align: 'center',
formatter: function (value, row, index) {
return `<a class="btn btn-info btn-xs" href="javascript:void(0)" onclick="del('${row.itemId}', 7, '确定下架此商品吗?')">删除</a>
<a class="btn btn-info btn-xs" href="javascript:void(0)" onclick="del('${row.itemId}', 7, '确定下架此商品吗?')">查看</a>`
}
}]
};
$.table.init(options);
});
$("#button-open-10").click(function(){
var btn = ['<span style="display:inline-block;padding:0 15px;height:100%;" onclick="yes(1,2)">确定</span>', '取消'];
layer.open({
type: 1,
shade: true,
title: '创建分类', //不显示标题
btn,
content: $('#addClassify'), //捕获的元素,注意:最好该指定的元素要存放在body最外层,否则可能被其它的相对元素所影响
success: function () {
console.log(1111)
$(".layui-layer-btn0").addClass('paddings')
$(".layui-layer-shade").addClass('shadeCss')
},
cancel: function(res){
console.log(res, '111')
// layer.msg('捕获就是从页面已经存在的元素上,包裹layer的结构', {time: 5000, icon:6});
}
});
})
$("#button-open-11").click(function(){
$("button[name=refresh]").click()
})
function onCheck (row, $element) {
console.log(row, $element)
}
function yes(index, layero) {
console.log(index, layero)
}
function del(id, status, notice) {
$.modal.confirm(notice, function() {
$.ajax({
type: 'put',
url: '/stone/item/change/status',
data: {
itemId: id,
status
},
success:function(e) {
layer.msg("操作成功!")
$("button[name=refresh]").click()
}
})
});
}
$(function(){
$("#fileinput").fileinput({
'theme': 'explorer-fas',
'uploadUrl': platformUrl + "/platform/basicServices/alOss/upload",
"uploadExtraData": {
"pathName" : "banner",
"buckType" : 1
},
autoReplace: true,
showCaption: false,
showPreview: false,
showRemove: false,
showUpload: false,
showCancel: false,
showClose: false,
autoReplace: true,
dropZoneTitle: "请上传文件",
maxFileCount: 1
}).on("filebatchselected", function (event, files) { //默认上传
$(this).fileinput("upload");
})
.on("fileuploaded", function (event, data) { //上传回调事件
showPicture = 'https://img.zhengzai.tv/' + data.response.data.ossPath;
$("#viewImg").attr('src', showPicture)
})
})
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('顶部banner')" />
<th:block th:include="include :: header('魔方')" />
<th:block th:include="include :: bootstrap-fileinput-css" />
<style>
.home_page {
......@@ -124,11 +124,11 @@
<label>
<input type="radio" checked value="1" id="optionsRadios1" name="optionsRadios"><span>一行一个</span></label>
<label>
<input type="radio" value="2" id="optionsRadios1" name="optionsRadios"><span>一行两个</span></label>
<input type="radio" value="2" id="optionsRadios2" name="optionsRadios"><span>一行两个</span></label>
<label>
<input type="radio" value="3" id="optionsRadios1" name="optionsRadios"><span>一行三个</span></label>
<input type="radio" value="3" id="optionsRadios3" name="optionsRadios"><span>一行三个</span></label>
<label>
<input type="radio" value="4" id="optionsRadios1" name="optionsRadios"><span>上一下三</span></label>
<input type="radio" value="4" id="optionsRadios4" name="optionsRadios"><span>上一下三</span></label>
</div>
</div>
<div class="function_btn">
......@@ -155,17 +155,93 @@
<script th:inline="javascript">
var prefix2 = ctx + "local";
var platformUrl = [[${platformUrl}]];
let num = 1;
let count = 1;
let compilationsId = '';
let createTime = '';
let cubeId = '';
let mid = '';
let updateTime = '';
$(function() {
addItem (1);
// addItem (1);
promiseMethods('/goblin-front-cube/list', 'post').then(res => {
console.log(res)
let { data } = res;
if (data && data.length > 0) {
let arr = data[0].spuId.split(',');
if (data.length == 1) {
$("#optionsRadios1").attr('checked', true).parent().siblings().children().removeAttr('checked');
} else if (data.length == 2) {
$("#optionsRadios2").attr('checked', true).parent().siblings().children().removeAttr('checked');
} else if (data.length == 3) {
$("#optionsRadios3").attr('checked', true).parent().siblings().children().removeAttr('checked');
} else {
$("#optionsRadios4").attr('checked', true).parent().siblings().children().removeAttr('checked');
}
console.log(arr)
for (var i = 0; i < data.length; i++) {
let str = '';
str += `<div class="items" data-id="${data[i].mid}">
<div class="first_content">
<div class="hot_title">
页面属性:
</div>
<div class="tags">
<label>
<input type="radio" checked value="1" id="pageAttribute${i}" name="pageAttribute${i}"><span>单商品</span></label>
</div>
</div>
<div class="first_content" style="align-items: flex-start;">
<div class="hot_title">
选择商品:
</div>
<div class="tags_content" style="width: 553px;">
<div class="input-group">
<input id="goodsName${i}" data-id="${arr[i]}" type="text" class="form-control storeList" placeholder="${data[i].goblinGoods.name}">
<div class="input-group-btn">
<ul class="dropdown-menu dropdown-menu-right" role="menu">
</ul>
</div>
</div>
<div class="img_box">
<img id="goodsImg${i}" src="${data[i].goblinGoods.coverPic}" alt="" style="max-height: 180px;max-width:180px;margin: 12px 0;">
<p id="goodsTitle${i}" style="width:180px;">${data[i].goblinGoods.name}</p>
<p id="goodsPrice${i}">${data[i].goblinGoods.priceLe}</p>
</div>
<button id="del${i}" type="button" class="btn btn-danger" style="width: 60px;" onclick="del('${i}')">删除</button>
</div>
</div>
<div class="first_content" style="align-items: flex-start;">
<div class="hot_title">
推荐文案:
</div>
<div class="tags">`;
if (i == 0) {
str+= `<textarea id="text${i}" class="form-control txtIpt" value="" name="" style="width: 553px;height: 150px;">${data[i].informationA}</textarea>`
} else if (i == 1) {
str+= `<textarea id="text${i}" class="form-control txtIpt" value="" name="" style="width: 553px;height: 150px;">${data[i].informationB}</textarea>`
} else if (i == 2) {
str+= `<textarea id="text${i}" class="form-control txtIpt" value="" name="" style="width: 553px;height: 150px;">${data[i].informationC}</textarea>`
} else {
str+= `<textarea id="text${i}" class="form-control txtIpt" value="" name="" style="width: 553px;height: 150px;">${data[i].informationD}</textarea>`
}
str+=`</div>
</div>
</div>`
$("#bannerList").append(str);
common(i)
}
}
// refreshItem()
})
})
$("input[name=optionsRadios]").change(function(e){
$("#bannerList").empty();
let num = e.target.value;
addItem (num);
count = e.target.value;
addItem (count);
})
function addItem (num) {
console.log(num, '221212')
console.log(num, '221212颠三倒四多')
let str = '';
for (var i = 0; i < num; i++) {
str = `<div class="items">
......@@ -176,8 +252,6 @@
<div class="tags">
<label>
<input type="radio" checked value="1" id="pageAttribute${i}" name="pageAttribute${i}"><span>单商品</span></label>
<label>
<input type="radio" value="2" id="pageAttribute${i}" name="pageAttribute${i}"><span>合集</span></label>
</div>
</div>
<div class="first_content" style="align-items: flex-start;">
......@@ -193,9 +267,9 @@
</div>
</div>
<div class="img_box">
<img id="goodsImg${i}" src="https://img.zhengzai.tv/banner/2022/01/06/d4e7ef3aeabb4151a3a8dd9ab7a272a8.png" alt="" style="max-height: 180px;max-width:180px;margin: 12px 0;">
<p id="goodsTitle${i}" style="width:180px;">2021草莓音乐节主页(RE)连帽卫衣</p>
<p id="goodsPrice${i}">¥99</p>
<img id="goodsImg${i}" src="" alt="" style="max-height: 180px;max-width:180px;margin: 12px 0;">
<p id="goodsTitle${i}" style="width:180px;"></p>
<p id="goodsPrice${i}"></p>
</div>
<button id="del${i}" type="button" class="btn btn-danger" style="width: 60px;" onclick="del('${i}')">删除</button>
</div>
......@@ -205,7 +279,7 @@
推荐文案:
</div>
<div class="tags">
<textarea id="text${i}" class="form-control" name="" id="" style="width: 553px;height: 150px;"></textarea>
<textarea id="text${i}" class="form-control txtIpt" name="" id="" style="width: 553px;height: 150px;"></textarea>
</div>
</div>
</div>`
......@@ -214,7 +288,44 @@
}
}
function save () {
refreshItem()
let data = [{
compilationsId: compilationsId || '',
createTime: createTime || '',
cubeId: cubeId|| '',
goblinGoods: {},
informationA: '',
informationB: '',
informationC: '',
informationD: '',
mid: mid || '0',
pageType: '1',
rowType: count,
spuId: [],
spuName: '',
updateTime: updateTime || ''
}];
let domData = $('.items');
Array.prototype.forEach.call(domData,function (item,index) {
console.log(item.querySelector('.txtIpt').value, 'item')
data[0].spuId.push(item.querySelector('.storeList').getAttribute('data-id') || '');
if (index == 0) {
data[0].informationA = item.querySelector('.txtIpt').value;
} else if (index == 1) {
data[0].informationB = item.querySelector('.txtIpt').value;
} else if (index == 2) {
data[0].informationC = item.querySelector('.txtIpt').value;
} else {
data[0].informationD = item.querySelector('.txtIpt').value;
}
});//foreach js6章封装
data[0].spuId = data[0].spuId.toString();
console.log(data)
promiseMethods('/goblin-front-cube/updateOrCreate', 'post', JSON.stringify(data), 'application/json').then(res => {
console.log(res)
refreshItem()
})
}
function del (num) {
console.log(num)
......@@ -226,25 +337,47 @@
}
function common (num) {
$(".storeList").bsSuggest({
idField: 'spuId', // data.value 的第几个数据,作为input输入框的内容
keyField: 'name', // data.value 的第几个数据,作为input输入框的内容
allowNoKeyword: false, //是否允许无关键字时请求数据
showBtn:false,
multiWord: true, //以分隔符号分割的多关键字支持
hideOnSelect: true,
getDataMethod: "url", //获取数据的方式,总是从 URL 获取
url: ctx+'kylin/base/performance/status?status=(3,6)&title=',
effectiveFields: ['name'],
url: '/compilations/goodsList?name=',
/*如果从 url 获取数据,并且需要跨域,则该参数必须设置*/
processData: function (json) { // url 获取数据时,对数据的处理,作为 getData 的回调函数
//字符串转化为 js 对象
return json;
let data = {};
data.value = json.data
return data
}
}).on('onDataRequestSuccess', function (e, result) {
console.log('onDataRequestSuccess: ',e, result);
}).on('onSetSelectValue', function (e, selectedData,selectedRawData ) { // 当前行的所有值都能拿到
console.log('211: ', e.target.value, selectedData, selectedRawData);
let index = e.target.id.replace(/[^\d]/g,''); // 选中的是第几组
$("#goodsImg"+index+"").attr('src', selectedRawData.coverPic);
$("#goodsTitle"+index+"").text(selectedRawData.name);
$("#goodsPrice"+index+"").text('¥'+ selectedRawData.priceLe);
$('#del'+index+'').show();
}).on('onUnsetSelectValue', function (e) {
console.log("onUnsetSelectValue", e);
});;
}
function promiseMethods(url,type,data,contentType) {
return new Promise((resolve,reject)=>{
$.ajax({
url,
type,
data,
contentType,
success:function(res) {
resolve(res);
}
})
})
}
</script>
</body>
</html>
\ No newline at end of file
......@@ -114,7 +114,7 @@
<label>
<input type="radio" checked value="1" id="optionsRadios1" name="optionsRadios"><span>一行</span></label>
<label>
<input type="radio" value="2" id="optionsRadios1" name="optionsRadios"><span>两行</span></label>
<input type="radio" value="2" id="optionsRadios2" name="optionsRadios"><span>两行</span></label>
</div>
</div>
<div class="function_btn">
......@@ -143,18 +143,127 @@
</div>
<th:block th:include="include :: footer"/>
<th:block th:include="include :: bootstrap-fileinput-js" />
<th:block th:include="include :: bootstrap-suggest-js" />
<script th:inline="javascript">
var prefix2 = ctx + "local";
var platformUrl = [[${platformUrl}]];
let num = 0;
let jumpType = 1;
let hang = 1;
$(function() {
addItem (4);
promiseMethods('/navigation/list', 'post').then(res => {
console.log(res, 12121)
let { data } = res;
if (data&&data.length>0) {
if (data[0].displayType == 1) {
console.log('zhe?')
$('#optionsRadios1').attr('checked', true)
$('#optionsRadios2').removeAttr('checked')
} else {
$('#optionsRadios2').attr('checked', true)
$('#optionsRadios1').removeAttr('checked')
}
for (var i = 0; i < data.length; i++) {
let str = '';
str += `<div class="banner_item" data-id="${data[i].mid}">
<div class="img_show">
<div class="title">
图片展示:
</div>
<div class="ibox-content" style="border: none;">
<img id="viewImg${i}" class="imgBox" src="${data[i].picUrl}" alt="">
<div class="form-group">
<div class="file-loading">
<input id="fileinput${i}" type="file" name="file" data-browse-on-zone-click="true" data-theme="fas">
</div>
</div>
</div>
</div>
<div class="set_method" style="margin-bottom: 20px;">
<div class="jump">
<div class="title">
类型:
</div>
<div class="iptOrSelect" style="margin-right: 12px;">
<select id="jumpType${i}" onchange="changeJump(this)" value="${data[i].navigationType}" class="type form-control" data-first-title="请选择">
<option value="1">分类</option>
<option value="2">专题页</option>
<option value="3">商品单品</option>
</select>
</div>
</div>
<div class="ticket_name">
<div class="title titleDiv${i}">
选择分类:
</div>
<div class="typeSelect${i}" style="display:flex;flex:1">
<div class="iptOrSelect">
<select id="jumpSelect${i}" class="type form-control" data-first-title="请选择">
<option value="">请选择</option>
</select>
</div>
<div class="iptOrSelect">
<select id="jumpSelect${i}" class="type form-control" data-first-title="请选择">
<option value="">请选择</option>
</select>
</div>
</div>`
if (data[i].goblinGoods) {
str+= `<div class="input-group iptOrSelect shwoSelect${i}" style="display:none;">
<input id="searchIpt${i}" type="text" class="form-control storeList" onFocus="focusMethod(this)" value="${data[i].goblinGoods.spuId}" placeholder="${data[i].goblinGoods.name}">
<div class="input-group-btn">
<ul class="dropdown-menu dropdown-menu-right" role="menu">
</ul>
</div>
</div>`
} else {
str+=`<div class="input-group iptOrSelect shwoSelect${i}" style="display:none;">
<input id="searchIpt${i}" type="text" class="form-control storeList" onFocus="focusMethod(this)" value="" placeholder="">
<div class="input-group-btn">
<ul class="dropdown-menu dropdown-menu-right" role="menu">
</ul>
</div>
</div>`
}
str+= `<div class="link${i}" style="display:none;">
<input id="linkUrl${i}" type="text" class="layui-input form-control linkUrl" value="${data[i].activityUrl}" placeholder="请输入活动链接">
</div>
</div>
</div>
<div class="set_function">
<div class="set_function_time">
<div class="title">
标题:
</div>
<div class="select_tiem">
<input type="text" class="layui-input form-control titleIpt" id="startTime${i}" value="${data[i].title}" autocomplete="off" placeholder="请输入标题">
</div>
</div>
</div>
</div>`
$("#bannerList").append(str);
common(i)
// setTimeout(() => {
let type = data[i].navigationType;
showOrhide (type, i)
$("#jumpType"+i+" option[value="+type+"]").attr('selected','selected');
// }, 500);
}
} else {
addItem (4);
}
})
})
$("input[name=optionsRadios]").change(function(e){
$("#bannerList").empty();
if (e.target.value == 2) {
hang = 2;
addItem (8);
} else {
hang = 1;
addItem (4);
}
})
......@@ -181,24 +290,38 @@
类型:
</div>
<div class="iptOrSelect" style="margin-right: 12px;">
<select id="jumpSelect${i}" class="type form-control" data-first-title="请选择">
<option value="">请选择</option>
<select id="jumpType${i}" onchange="changeJump(this)" class="type form-control" data-first-title="请选择">
<option value="1">分类</option>
<option value="2">专题页</option>
<option value="3">商品单品</option>
</select>
</div>
</div>
<div class="ticket_name">
<div class="title">
<div class="title titleDiv${i}">
选择分类:
</div>
<div class="iptOrSelect">
<select id="jumpSelect${i}" class="type form-control" data-first-title="请选择">
<option value="">请选择</option>
</select>
<div class="typeSelect${i}" style="display:flex;flex:1">
<div class="iptOrSelect">
<select id="jumpSelect${i}" class="type form-control" data-first-title="请选择">
<option value="">请选择</option>
</select>
</div>
<div class="iptOrSelect">
<select id="jumpSelect${i}" class="type form-control" data-first-title="请选择">
<option value="">请选择</option>
</select>
</div>
</div>
<div class="iptOrSelect">
<select id="jumpSelect${i}" class="type form-control" data-first-title="请选择">
<option value="">请选择</option>
</select>
<div class="input-group iptOrSelect shwoSelect${i}" style="display:none;">
<input id="searchIpt${i}" type="text" class="form-control storeList" onFocus="focusMethod(this)" placeholder="请输入商品名称">
<div class="input-group-btn">
<ul class="dropdown-menu dropdown-menu-right" role="menu">
</ul>
</div>
</div>
<div class="link${i}" style="display:none;">
<input id="linkUrl${i}" type="text" class="layui-input form-control linkUrl" placeholder="请输入活动链接">
</div>
</div>
</div>
......@@ -208,17 +331,47 @@
标题:
</div>
<div class="select_tiem">
<input type="text" class="layui-input form-control" id="startTime${i}" autocomplete="off" placeholder="配置活动时间">
<input type="text" class="layui-input form-control titleIpt" id="startTime${i}" autocomplete="off" placeholder="请输入标题">
</div>
</div>
</div>
</div>`
$("#bannerList").append(str);
common(i)
}
}
function save () {
let itmeLength = $(".banner_item");
let arr = [];
let obj = {};
Array.prototype.forEach.call(itmeLength,function (item,index) {
if ($("jumpType"+index+"").val() == 2) {
obj['activityUrl'] = item.querySelector(".linkUrl").value;
obj['spuId'] = '';
} else if ($("jumpType"+index+"").val() == 3) {
obj['activityUrl'] = '';
obj['spuId'] = item.querySelector(".storeList").data-id;
}
obj['categoryType'] = '';
obj['createTime'] = '';
obj['delTag'] = '0';
obj['displayType'] = hang;
obj['indexs'] = index;
obj['mid'] = item.getAttribute('data-id') || 0;
obj['navigationId'] = '';
obj['navigationType'] = $("jumpType"+index+"").val();
obj['spuName'] = '';
obj['picUrl'] = item.querySelector(".imgBox").getAttribute('src');
obj['title'] = item.querySelector(".titleIpt").value;
obj['updateTime'] = '';
arr.push({...obj})
});//foreach js6章封装的方法
console.log(arr, '12121212')
promiseMethods('/navigation/createOrUpdate', 'post', JSON.stringify(arr), 'application/json').then(res => {
console.log(res, 12121)
})
refreshItem()
}
function common (num) {
......@@ -247,6 +400,80 @@
$("#viewImg"+num+"").attr('src', showPicture)
})
}
function changeJump (e) {
let index = $(e).attr('id').replace(/[^\d]/g,''); // 选中的是第几组
let jumpType = $(e).val(); // 选中的跳转类型
showOrhide (jumpType, index)
}
function showOrhide (jumpType, index) {
console.log(jumpType, index, 'sfsf')
switch(jumpType.toString()) {
case '1':
$('.shwoSelect'+index+'').hide();
$('.link'+index+'').hide();
$('.typeSelect'+index+'').show();
$(".titleDiv"+index+"").text('选择分类:');
break;
case '2':
$('.shwoSelect'+index+'').hide();
$('.link'+index+'').show();
$('.typeSelect'+index+'').hide();
$(".titleDiv"+index+"").text('活动链接:');
break;
case '3':
$(".titleDiv"+index+"").text('商品名称:');
$('.shwoSelect'+index+'').show();
$('.link'+index+'').hide();
$('.typeSelect'+index+'').hide();
break;
default:
// $(".titleDiv"+index+"").text('商品聚合:');
// $('.shwoSelect'+index+'').show();
// $('.link'+index+'').hide();
// $('.typeSelect'+index+'').hide();
}
}
function focusMethod (e) {
let index = $(e).attr('id').replace(/[^\d]/g,''); // 选中的是第几组
let url = '';
$(".storeList").bsSuggest({
idField: 'spuId', // data.value 的第几个数据,作为input输入框的内容
keyField: 'name', // data.value 的第几个数据,作为input输入框的内容
allowNoKeyword: false, //是否允许无关键字时请求数据
showBtn:false,
multiWord: true, //以分隔符号分割的多关键字支持
hideOnSelect: true,
getDataMethod: "url", //获取数据的方式,总是从 URL 获取
effectiveFields: ['name'],
url: '/compilations/goodsList?name=',
/*如果从 url 获取数据,并且需要跨域,则该参数必须设置*/
processData: function (json) { // url 获取数据时,对数据的处理,作为 getData 的回调函数
//字符串转化为 js 对象
let data = {};
data.value = json.data
return data
}
}).on('onDataRequestSuccess', function (e, result) {
console.log('onDataRequestSuccess: ',e, result);
}).on('onSetSelectValue', function (e, selectedData,selectedRawData ) { // 当前行的所有值都能拿到
console.log('211: ', e.target.value, selectedData, selectedRawData);
}).on('onUnsetSelectValue', function (e) {
console.log("onUnsetSelectValue", e);
});;
}
function promiseMethods(url,type,data,contentType) {
return new Promise((resolve,reject)=>{
$.ajax({
url,
type,
data,
contentType,
success:function(res) {
resolve(res);
}
})
})
}
</script>
</body>
</html>
\ No newline at end of file
......@@ -97,13 +97,13 @@
</div>
<div class="add_tags">
<div>
<input type="text" class="layui-input form-control" id="test1" style="margin-left: 10px;" placeholder="请选择时间"><button type="button" class="btn btn-success" onclick="addItems()">添加</button>
<input type="text" class="layui-input form-control" id="test1" style="margin-left: 10px;" placeholder="输入热门关键词"><button type="button" class="btn btn-success" onclick="addItems()">添加</button>
</div>
<p style="margin-left: 10px;">允许添加多个关键词,默认显示第一个</p>
</div>
<div class="hot_set">
热词设置:滚动
<p><input type="text" class="layui-input form-control" id="test1" style="margin-left: 10px;" placeholder="请选择时间">M</p>
<p><input type="text" class="layui-input form-control" id="time" style="margin-left: 10px;" placeholder="请选择时间">M</p>
</div>
<div class="footer_btn">
<button type="button" class="btn btn-success" onclick="save()">保存</button>
......@@ -122,25 +122,75 @@
<script th:inline="javascript">
var prefix2 = ctx + "local";
let num = 0;
function goArea (num) {
console.log(num)
switch(num) {
case 5:
$.modal.openTab('商品搜索', prefix2 + "/searchStore?id=" + 1212)
break;
}
}
let hotArr = [];
let mid = 0;
let createTime = '';
let hotWordId = '';
let updateTime = '';
$(function(){
promiseMethods('/hotWord/list', 'post').then(res => {
let data = res.data[0];
mid = data.mid;
createTime = data.createTime;
hotWordId = data.hotWordId;
updateTime = data.updateTime;
let hotStr = data.word.split(',');
console.log(hotStr, 'hotStr')
for(var i = 0; i < hotStr.length; i++) {
console.log(1, '1')
num++
let str = `<div class="tag" id="item${num}">${hotStr[i]}<span onclick="delTags('${num}')">x</span></div>`;
hotArr.push(hotStr[i])
$(".tags").append(str);
}
})
})
function addItems () {
if (!$("#test1").val()) {
return layer.msg('输入内容不能为空!')
}
num++
let str = `<div class="tag">${$("#test1").val()}<span onclick="delTags('${num}')">x</span></div>`;
let str = `<div class="tag" id="item${num}">${$("#test1").val()}<span onclick="delTags('${num}')">x</span></div>`;
hotArr.push($('#test1').val())
$(".tags").append(str);
$("#test1").val('');
}
function delTags(num) {
let name = $("#item"+num+"").text().slice(0,$("#item"+num+"").text().length-1)
hotArr.splice(hotArr.indexOf(name),1);
$("#item"+num+"").remove();
}
function save () {
refreshItem()
let data = {
"changeTime": $('#time').val() * 60,
"changeType": 1,
"createTime": createTime?createTime:"",
"delTag": 0,
"hotWordId": hotWordId? hotWordId : "",
"indexs": 1,
"mid": mid?mid:0,
"status": '',
"updateTime": updateTime ? updateTime : '',
"word": hotArr.toString()
}
console.log(data, 'data')
promiseMethods('/hotWord/updateOrCreate', 'post', JSON.stringify(data), 'application/json').then(res => {
console.log(res, 121212)
})
// refreshItem()
}
function promiseMethods(url,type,data,contentType) {
return new Promise((resolve,reject)=>{
$.ajax({
url,
type,
data,
contentType,
success:function(res) {
resolve(res);
}
})
})
}
</script>
</body>
......
......@@ -66,6 +66,19 @@
border-radius: 10px;
padding: 12px;
margin-bottom: 20px;
position: relative;
}
.banner_item .del {
position: absolute;
right: -8px;
top: -8px;
width: 20px;
height: 20px;
line-height: 18px;
border: 1px solid #ccc;
border-radius: 50%;
text-align: center;
cursor: pointer;
}
.img_show, .set_method, .set_function {
display: flex;
......@@ -112,7 +125,7 @@
选择照片:
</div>
<div class="tags">
<button type="button" class="btn btn-warning" style="margin-right: 12px;" onclick="addItem()">添加banner</button>
<button type="button" class="btn btn-warning" style="margin-right: 12px;" onclick="addItem(0)">添加banner</button>
<span id="tall">(最多允许添加10张图,建议宽度750像素)</span>
</div>
</div>
......@@ -135,6 +148,7 @@
</div>
<th:block th:include="include :: footer"/>
<th:block th:include="include :: bootstrap-fileinput-js" />
<th:block th:include="include :: bootstrap-suggest-js" />
<script th:inline="javascript">
var prefix2 = ctx + "local";
var platformUrl = [[${platformUrl}]];
......@@ -148,13 +162,89 @@
if (type == 2) {
$("#tall").html('至少添加8张图,建议尺寸1:1')
}
let data = {
type: 1
}
promiseMethods('/frontBanner/list', 'post', data).then(res => {
console.log(res, 121212121)
let { data } = res;
for (var i = 0; i < data.length; i++) {
let str = `<div class="banner_item" data-id="${data[i].bannerId}" data-index="${data[i].mid}">
<span class="del" onclick="delItem('${i+1}', '${index}')">x</span>
<div class="img_show">
<div class="title">
图片展示:
</div>
<div class="ibox-content" style="border: none;">
<img id="viewImg${num}" class="imgBox" src="" alt="">
<div class="form-group">
<div class="file-loading">
<input id="fileinput${num}" type="file" name="file" data-browse-on-zone-click="true" data-theme="fas">
</div>
</div>
</div>
</div>
<div class="set_method" style="margin-bottom: 20px;">
<div class="jump">
<div class="title">
跳转方式:
</div>
<div class="iptOrSelect" style="margin-right: 12px;">
<select id="jumpSelect${num}" onchange="changeJump(this)" class="type form-control" data-first-title="请选择">
<option value="1">票务</option>
<option value="2">商品</option>
<option value="3">H5</option>
</select>
</div>
</div>
<div class="ticket_name">
<div class="title">
<span class="change${num}">票务名称</span>:
</div>
<div class="input-group iptOrSelect shwoSelect${num}"">
<input id="ticketName${num}" type="text" class="form-control storeList" onFocus="focusMethod(this)" placeholder="请输入查询信息">
<div class="input-group-btn">
<ul class="dropdown-menu dropdown-menu-right" role="menu">
</ul>
</div>
</div>
<div class="iptOrSelect shwoH5${num}" style="display:none;">
<input id="ticketName${num}" type="text" class="layui-input form-control" placeholder="请输入活动链接">
</div>
</div>
</div>
<div class="set_function">
<div class="set_function_time">
<div class="title">
时间设置:
</div>
<div class="select_tiem">
<input type="text" class="layui-input form-control timeStart" id="startTime${num}" autocomplete="off" placeholder="配置活动时间">
</div>
</div>
<div class="set_function_time" style="width: 40%;">
<div class="title">
排序:
</div>
<div class="select_tiem">
<input id="px${num}" type="text" class="layui-input form-control px" placeholder="请输入顺序数字">
</div>
</div>
</div>
</div>`;
$("#bannerList").append(str);
common(num)
}
})
//
})
function addItem () {
function addItem (index) {
if (num == 10) {
return layer.msg('最多可添加10张图片')
}
num++
let str = `<div class="banner_item">
let str = `<div class="banner_item" data-id="" data-index="">
<span class="del" onclick="delItem('${num}', '${index}')">x</span>
<div class="img_show">
<div class="title">
图片展示:
......@@ -174,17 +264,26 @@
跳转方式:
</div>
<div class="iptOrSelect" style="margin-right: 12px;">
<select id="jumpSelect${num}" class="type form-control" data-first-title="请选择">
<option value="">请选择</option>
<select id="jumpSelect${num}" onchange="changeJump(this)" class="type form-control" data-first-title="请选择">
<option value="1">票务</option>
<option value="2">商品</option>
<option value="3">H5</option>
</select>
</div>
</div>
<div class="ticket_name">
<div class="title">
票务名称:
<span class="change${num}">票务名称</span>:
</div>
<div class="input-group iptOrSelect shwoSelect${num}"">
<input id="ticketName${num}" type="text" class="form-control storeList" onFocus="focusMethod(this)" placeholder="请输入查询信息">
<div class="input-group-btn">
<ul class="dropdown-menu dropdown-menu-right" role="menu">
</ul>
</div>
</div>
<div class="iptOrSelect">
<input id="ticketName${num}" type="text" class="layui-input form-control">
<div class="iptOrSelect shwoH5${num}" style="display:none;">
<input id="ticketName${num}" type="text" class="layui-input form-control" placeholder="请输入活动链接">
</div>
</div>
</div>
......@@ -194,7 +293,7 @@
时间设置:
</div>
<div class="select_tiem">
<input type="text" class="layui-input form-control" id="startTime${num}" autocomplete="off" placeholder="配置活动时间">
<input type="text" class="layui-input form-control timeStart" id="startTime${num}" autocomplete="off" placeholder="配置活动时间">
</div>
</div>
<div class="set_function_time" style="width: 40%;">
......@@ -202,7 +301,7 @@
排序:
</div>
<div class="select_tiem">
<input id="px${num}" type="text" class="layui-input form-control" placeholder="请输入顺序数字">
<input id="px${num}" type="text" class="layui-input form-control px" placeholder="请输入顺序数字">
</div>
</div>
</div>
......@@ -211,10 +310,84 @@
common(num)
}
function save () {
if (type == 2) {
if (num < 8) return layer.msg('请添加至少8张图')
let obj = {};
let itmeLength = $(".banner_item");
let data = []
Array.prototype.forEach.call(itmeLength,function (item,index,arr) {
obj.activityUrl = item.querySelector('#ticketName'+(index+1)+'').value;
obj.bannerId = item.getAttribute('data-id');
obj.bannerType = 1;
obj.createTime = '';
obj.delTag = '0';
obj.endTime = '';
obj.indexs = item.querySelector('.px').value;;
obj.jumpType = item.querySelector('#jumpSelect'+(index+1)+'').value;
obj.mid = item.getAttribute('data-index') || 0;
obj.picUrl = item.querySelector('.imgBox').getAttribute('src');
obj.startTime = item.querySelector('.timeStart').value;
obj.updateTime = '';
obj.ticketId = '';
obj.ticketName = '';
data.push({...obj})
});//foreach js6章封装的方法
console.log(data, 'data')
promiseMethods('/frontBanner/updateOrCreate', 'post', JSON.stringify(data), 'application/json').then(res => {
console.log(res)
})
// refreshItem()
}
function focusMethod(e) {
let index = $(e).attr('id').replace(/[^\d]/g,''); // 选中的是第几组
let url = '';
$(".storeList").bsSuggest({
allowNoKeyword: false, //是否允许无关键字时请求数据
showBtn:false,
multiWord: true, //以分隔符号分割的多关键字支持
hideOnSelect: true,
getDataMethod: "url", //获取数据的方式,总是从 URL 获取
url: ctx+'kylin/base/performance/status?status=(3,6)&title=',
/*如果从 url 获取数据,并且需要跨域,则该参数必须设置*/
processData: function (json) { // url 获取数据时,对数据的处理,作为 getData 的回调函数
//字符串转化为 js 对象
return json;
}
}).on('onDataRequestSuccess', function (e, result) {
console.log('onDataRequestSuccess: ',e, result);
}).on('onSetSelectValue', function (e, selectedData,selectedRawData ) { // 当前行的所有值都能拿到
console.log('211: ', e.target.value, selectedData, selectedRawData);
}).on('onUnsetSelectValue', function (e) {
console.log("onUnsetSelectValue", e);
});;
}
function delItem (num) {
console.log(num)
}
function changeJump(e) {
let index = $(e).attr('id').replace(/[^\d]/g,''); // 选中的是第几组
let jumpType = $(e).val(); // 选中的跳转类型
switch(jumpType) {
case '1':
$('.shwoH5'+index+'').hide();
$('.shwoSelect'+index+'').show();
$(".change"+index+"").text('票务名称');
break;
case '2':
$('.shwoH5'+index+'').hide();
$('.shwoSelect'+index+'').show();
$(".change"+index+"").text('商品名称');
break;
case '3':
$(".change"+index+"").text('活动链接');
$('.shwoH5'+index+'').show();
$('.shwoSelect'+index+'').hide();
break;
default:
$('.shwoH5'+index+'').hide();
$('.shwoSelect'+index+'').show();
$(".change"+index+"").text('商品集合');
}
refreshItem()
}
function common (num) {
layui.use('laydate', function(){
......@@ -250,6 +423,19 @@
$("#viewImg"+num+"").attr('src', showPicture)
})
}
function promiseMethods(url,type,data,contentType) {
return new Promise((resolve,reject)=>{
$.ajax({
url,
type,
data,
contentType,
success:function(res) {
resolve(res);
}
})
})
}
</script>
</body>
</html>
\ No newline at end of file
......@@ -38,6 +38,11 @@ public class GoblinGoodsTag implements Serializable {
*/
private Integer sort;
/**
* 标签所属[0-普通标签|1-专属标签]
*/
private String tagBelong;
/**
* 删除标记[0-未删除|1-删除]
*/
......
......@@ -222,12 +222,13 @@ create index idx_ggss_spu_id on goblin_goods_service_support (spu_id);
drop table if exists goblin_goods_tag;
create table goblin_goods_tag
(
mid bigint auto_increment primary key,
spu_id varchar(64) not null comment '商品id',
tag_id varchar(30) not null comment '标签id,对应 goblin_self_goods_tag.tag_id | goblin_self_extag.tag_id',
sort int default 0 comment '排序[数值越小,排序越前]',
del_flg char default '0' comment '删除标记[0-未删除|1-删除]',
comment varchar(255)
mid bigint auto_increment primary key,
spu_id varchar(64) not null comment '商品id',
tag_id varchar(30) not null comment '标签id,对应 goblin_self_tag.tag_id',
sort int default 0 comment '排序[数值越小,排序越前]',
tag_belong char default '0' comment '标签所属[0-普通标签|1-专属标签]',
del_flg char default '0' comment '删除标记[0-未删除|1-删除]',
comment varchar(255)
) engine = InnoDB comment '商品关联标签';
create index idx_ggt_tag_id on goblin_goods_tag (tag_id);
......
package com.liquidnet.service.goblin.controller.manage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinStoreGoodsCategoryVo;
import com.liquidnet.service.goblin.util.GoblinMongoUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ApiSupport(order = 149003)
@Api(tags = "店铺分类管理")
@Slf4j
@Validated
@RestController
@RequestMapping("store/mgt/category")
public class GoblinStoreMgtCategoryController {
@Autowired
GoblinMongoUtils goblinMongoUtils;
@ApiOperationSupport(order = 1)
@ApiOperation(value = "列表")
@GetMapping("list")
public ResponseDto<PagedResult<GoblinStoreGoodsCategoryVo>> list() {
return ResponseDto.success(null);
}
}
package com.liquidnet.service.goblin.controller.manage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinMgtCategorySpecVo;
import com.liquidnet.service.goblin.dto.vo.GoblinSelfTagVo;
import com.liquidnet.service.goblin.util.GoblinMongoUtils;
import com.liquidnet.service.goblin.util.GoblinRedisUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.util.List;
@ApiSupport(order = 149003)
@Api(tags = "附加数据")
@Slf4j
@Validated
@RestController
@RequestMapping("store/mgt/extra")
public class GoblinStoreMgtExtraController {
@Autowired
GoblinRedisUtils goblinRedisUtils;
@Autowired
GoblinMongoUtils goblinMongoUtils;
@ApiOperationSupport(order = 1)
@ApiOperation(value = "分类关联的规格信息")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "cateId", value = "分类ID"),
})
@GetMapping("cate-specs")
public ResponseDto<List<GoblinMgtCategorySpecVo>> categorySpecList(@RequestParam String cateId) {
if (StringUtils.isBlank(cateId)) return ResponseDto.success();
return ResponseDto.success(goblinMongoUtils.getCategorySpecVos(cateId));
}
@ApiOperationSupport(order = 2)
@ApiOperation(value = "标签信息", notes = "获取商品标签与音乐人、艺人、IP")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = false, dataType = "String", name = "keyword", value = "标签关键字"),
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "belong", value = "标签所属[0-普通标签|1-专属标签]", allowableValues = "0,1"),
})
@GetMapping("tags")
public ResponseDto<List<GoblinSelfTagVo>> tagList(@RequestParam String keyword,
@NotBlank(message = "标签所属参数无效")
@Pattern(regexp = "\\b(0|1)\\b", message = "标签所属[0-普通标签|1-专属标签]")
@RequestParam String belong) {
return ResponseDto.success(goblinMongoUtils.getSelfTagVos(belong, keyword));
}
}
......@@ -10,6 +10,7 @@ import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsActionParam;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsAddParam;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsEditSkuParam;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsFilterParam;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinMgtCategorySpecVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtGoodsInfoVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtGoodsListVo;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsInfoVo;
......@@ -104,11 +105,13 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
goblinMongoUtils.setGoodsInfoVo(goodsInfoVo);
goblinMongoUtils.setGoodsSkuInfoVos(goodsSkuInfoVoList);
String spuId = goodsInfoVo.getSpuId();
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
toMqSqls.add(SqlMapping.get("goblin_goods.insert"));
LinkedList<Object[]> initGoodsObjs = CollectionUtil.linkedListObjectArr();
initGoodsObjs.add(new Object[]{
goodsInfoVo.getSpuId(), goodsInfoVo.getSpuNo(), goodsInfoVo.getName(), goodsInfoVo.getSubtitle(), goodsInfoVo.getSellPrice(),
spuId, goodsInfoVo.getSpuNo(), goodsInfoVo.getName(), goodsInfoVo.getSubtitle(), goodsInfoVo.getSellPrice(),
goodsInfoVo.getPriceGe(), goodsInfoVo.getPriceLe(), goodsInfoVo.getIntro(), goodsInfoVo.getDetails(), goodsInfoVo.getCoverPic(),
goodsInfoVo.getVideo(), goodsInfoVo.getSpecMode(), goodsInfoVo.getStoreId(), goodsInfoVo.getCateFid(), goodsInfoVo.getCateSid(),
goodsInfoVo.getCateTid(), goodsInfoVo.getStoreCateFid(), goodsInfoVo.getStoreCateSid(), goodsInfoVo.getStoreCateTid(), goodsInfoVo.getBrandId(),
......@@ -126,9 +129,40 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
skuInfoVo.getStatus(), skuInfoVo.getShelvesStatus(), skuInfoVo.getSkuAppear(), skuInfoVo.getShelvesAt(), skuInfoVo.getCreatedBy(),
skuInfoVo.getCreatedAt(), skuInfoVo.getLogisticsTemplate()
}));
toMqSqls.add(SqlMapping.get("goblin_goods_image.insert"));
LinkedList<Object[]> initGoodsImageObjs = CollectionUtil.linkedListObjectArr();
if (CollectionUtils.isEmpty(goodsInfoVo.getImageList())) {
goodsInfoVo.getImageList().forEach(imageUrl -> initGoodsImageObjs.add(new Object[]{spuId, imageUrl}));
}
toMqSqls.add(SqlMapping.get("goblin_goods_tag.insert"));
LinkedList<Object[]> initGoodsTagObjs = CollectionUtil.linkedListObjectArr();
if (!CollectionUtils.isEmpty(goodsInfoVo.getTagVoList())) {
goodsInfoVo.getTagVoList().forEach(tagVo -> initGoodsTagObjs.add(new Object[]{spuId, tagVo.getTagId(), tagVo.getSort(), "0"}));
}
if (!CollectionUtils.isEmpty(goodsInfoVo.getExtagVoList())) {
goodsInfoVo.getExtagVoList().forEach(exTagVo -> initGoodsTagObjs.add(new Object[]{spuId, exTagVo.getTagId(), exTagVo.getSort(), "1"}));
}
toMqSqls.add(SqlMapping.get("goblin_goods_service_support.insert"));
LinkedList<Object[]> initGoodsServiceSupportObjs = CollectionUtil.linkedListObjectArr();
if (!CollectionUtils.isEmpty(goodsInfoVo.getServiceSupportVoList())) {
goodsInfoVo.getServiceSupportVoList().forEach(ssvo -> initGoodsServiceSupportObjs.add(new Object[]{spuId, ssvo.getSsid()}));
}
{// 规格记录
List<GoblinGoodsSpecVo> specVoList = goodsInfoVo.getSpecVoList();
String cateFid = goodsInfoVo.getCateFid();
String cateSid = goodsInfoVo.getCateSid();
String cateTid = goodsInfoVo.getCateTid();
String filterCateId = StringUtils.isBlank(cateTid) ? (StringUtils.isBlank(cateSid) ? cateFid : cateSid) : cateTid;
List<GoblinMgtCategorySpecVo> categorySpecVoList = goblinMongoUtils.getCategorySpecVos(filterCateId);
if (CollectionUtils.isEmpty(categorySpecVoList)) {// 根据分类ID未查取到规格信息,则新增
} else {// 根据分类ID查取到规格信息,则进一步比对判断是否新增
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_STORE.getKey(),
SqlMapping.gets(toMqSqls, initGoodsObjs, initGoodsSkuObjs));
}
}
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(),
SqlMapping.gets(toMqSqls, initGoodsObjs, initGoodsSkuObjs, initGoodsImageObjs, initGoodsTagObjs, initGoodsServiceSupportObjs));
}
@Override
......@@ -268,8 +302,21 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
String storeId = storeMgtGoodsActionParam.getStoreId();
List<String> spuIdList = storeMgtGoodsActionParam.getSpuIdList();
goblinMongoUtils.updateGoodsInfoVoByShelves(storeId, spuIdList, shelvesFlg, uid, now);
// TODO: 2022/1/7 zhanggb redis+sql
if (goblinMongoUtils.updateGoodsInfoVoByShelves(storeId, spuIdList, shelvesFlg, uid, now)) {
// TODO: 2022/1/7 zhanggb redis
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
toMqSqls.add(SqlMapping.get("goblin_goods.update_by_shelves"));
LinkedList<Object[]> updateGoodsObjs = CollectionUtil.linkedListObjectArr();
String shelvesStatus = shelvesFlg ? "3" : "1";
spuIdList.forEach(spuId -> updateGoodsObjs.add(new Object[]{shelvesStatus, now, uid, now, spuId, storeId}));
toMqSqls.add(SqlMapping.get("goblin_goods_sku.update_by_shelves"));
LinkedList<Object[]> updateGoodsSkuObjs = CollectionUtil.linkedListObjectArr();
spuIdList.forEach(spuId -> updateGoodsSkuObjs.add(new Object[]{shelvesStatus, now, uid, now, spuId, storeId}));
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(),
SqlMapping.gets(toMqSqls, updateGoodsObjs, updateGoodsSkuObjs));
}
}
@Override
......@@ -278,6 +325,19 @@ public class GoblinStoreMgtGoodsServiceImpl implements IGoblinstoreMgtGoodsServi
String storeId = storeMgtGoodsActionParam.getStoreId();
List<String> spuIdList = storeMgtGoodsActionParam.getSpuIdList();
goblinMongoUtils.delGoodsInfoVoBySpuIds(storeId, spuIdList, uid, now);
if (goblinMongoUtils.delGoodsInfoVoBySpuIds(storeId, spuIdList, uid, now)) {
// TODO: 2022/1/7 zhanggb redis
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
toMqSqls.add(SqlMapping.get("goblin_goods.update_by_del"));
LinkedList<Object[]> updateGoodsObjs = CollectionUtil.linkedListObjectArr();
spuIdList.forEach(spuId -> updateGoodsObjs.add(new Object[]{uid, now, uid, now, spuId, storeId}));
toMqSqls.add(SqlMapping.get("goblin_goods_sku.update_by_del"));
LinkedList<Object[]> updateGoodsSkuObjs = CollectionUtil.linkedListObjectArr();
spuIdList.forEach(spuId -> updateGoodsSkuObjs.add(new Object[]{uid, now, uid, now, spuId, storeId}));
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(),
SqlMapping.gets(toMqSqls, updateGoodsObjs, updateGoodsSkuObjs));
}
}
}
......@@ -5,6 +5,7 @@ import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.manage.GoblinStoreMgtGoodsFilterParam;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinMgtCategorySpecVo;
import com.liquidnet.service.goblin.dto.manage.vo.GoblinStoreMgtGoodsListVo;
import com.liquidnet.service.goblin.dto.vo.*;
import com.mongodb.BasicDBObject;
......@@ -40,8 +41,25 @@ public class GoblinMongoUtils {
@Autowired
MongoConverter mongoConverter;
/* ---------------------------------------- 分类数据源 ---------------------------------------- */
/* ---------------------------------------- 分类规格数据源 ---------------------------------------- */
public List<GoblinMgtCategorySpecVo> getCategorySpecVos(String cateId) {
return mongoTemplate.find(Query.query(Criteria.where("cateId").is(cateId).and("delFlg").is("0")),
GoblinMgtCategorySpecVo.class,GoblinMgtCategorySpecVo.class.getSimpleName());
}
/* ---------------------------------------- 标签数据源 ---------------------------------------- */
public List<GoblinSelfTagVo> getSelfTagVos(String belong, String keyword) {
Criteria criteria = Criteria.where("delFlg").is("0").and("tagBelong").is(belong);
if (StringUtils.isNotBlank(keyword)) {
criteria.and("tagName").regex("^.*" + keyword + ".*$");
}
return mongoTemplate.find(Query.query(criteria).skip(0).limit(20), GoblinSelfTagVo.class, GoblinSelfTagVo.class.getSimpleName());
}
public List<GoblinSelfTagVo> getSelfTagVos(List<String> tagIds) {
if (CollectionUtils.isEmpty(tagIds)) return ObjectUtil.getGoblinSelfTagVoArrayList();
......@@ -149,7 +167,7 @@ public class GoblinMongoUtils {
Criteria criteria = new Criteria();
if (StringUtils.isNotBlank(filterParam.getKeyword())) {
Pattern pattern = Pattern.compile("^.*" + filterParam.getKeyword() + ".*$", Pattern.CASE_INSENSITIVE);
criteria.orOperator(
criteria.andOperator(
Criteria.where("name").regex(pattern)
);
}
......
......@@ -9,10 +9,24 @@ goblin_store_certification.update_by_cert=UPDATE goblin_store_certification SET
goblin_store_certification.update_by_del=UPDATE goblin_store_certification SET del_flg=1,updated_by=?,updated_at=? WHERE store_id=?
#---- 商品信息
goblin_goods.insert=INSERT INTO goblin_goods (spu_id,spu_no,name,subtitle,sell_price, price_ge,price_le,intro,details,cover_pic, video,spec_mode,store_id,cate_fid,cate_sid, cate_tid,store_cate_fid,store_cate_sid,store_cate_tid,brand_id, shelves_handle,shelves_time,spu_validity,virtual_flg,status, shelves_status,spu_appear,shelves_at,created_by,created_at, logistics_template)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_goods.update_by_del=UPDATE goblin_goods SET del_flg=1,updated_by=?,updated_at=?,deleted_by=?,deleted_at=? WHERE store_id=?
goblin_goods.update_by_shelves=UPDATE goblin_goods SET shelves_status=?,shelves_at=?,updated_by=?,updated_at=? WHERE spu_id=? AND store_id=? AND sku_appear='0'
goblin_goods.update_by_del=UPDATE goblin_goods SET del_flg=1,updated_by=?,updated_at=?,deleted_by=?,deleted_at=? WHERE spu_id=? AND store_id=?
goblin_goods_sku.insert=INSERT INTO goblin_goods_sku (sku_id,spu_id,sku_no,name,subtitle, sell_price,sku_pic,sku_isbn,stock,sku_stock, warning_stock,price,price_member,weight,buy_factor, buy_roster,buy_limit,store_id,sku_validity,virtual_flg, status,shelves_status,sku_appear,shelves_at,created_by, created_at,logistics_template)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_goods_sku.update_by_del=UPDATE goblin_goods_sku SET del_flg=1,updated_by=?,updated_at=?,deleted_by=?,deleted_at=? WHERE store_id=?
goblin_goods_sku.update_by_shelves=UPDATE goblin_goods_sku SET shelves_status=?,shelves_at=?,updated_by=?,updated_at=? WHERE spu_id=? AND store_id=? AND sku_appear='0'
goblin_goods_sku.update_by_del=UPDATE goblin_goods_sku SET del_flg=1,updated_by=?,updated_at=?,deleted_by=?,deleted_at=? WHERE spu_id=? AND store_id=?
goblin_goods_image.insert=INSERT INTO goblin_goods_image (spu_id,url)VALUES(?,?)
goblin_goods_tag.insert=insert into goblin_goods_tag (spu_id,tag_id,sort,tag_belong)VALUES(?,?,?,?)
goblin_goods_service_support.insert=INSERT INTO goblin_goods_service_support (spu_id,ssid)VALUES(?,?)
goblin_goods_spu_spec_value.insert=INSERT INTO goblin_goods_spu_spec_value (spu_id,spec_id,spec_vid)VALUES(?,?,?)
goblin_goods_sku_spec_value.insert=INSERT INTO goblin_goods_sku_spec_value (spu_id,sku_id,spec_id,spec_vid)VALUES(?,?,?,?)
goblin_goods_category_spec.insert=insert into goblin_goods_category_spec (cate_id, spec_id)VALUES(?,?)
goblin_goods_spec.insert=INSERT INTO goblin_goods_spec (spec_id,spec_name,created_by,created_at)VALUES(?,?,?,?)
goblin_goods_spec_value.insert=INSERT INTO goblin_goods_spec_value (spec_id,spec_vid,spec_vname,created_by,created_at)VALUES(?,?,?,?,?)
#---- 商铺活动
goblin.store.market.insert=INSERT INTO goblin_store_marketing (`store_market_id`,`name`,`type`,`status`,`store_id`,`start_time`,`end_time`,`del_flag`,`is_pre`,`pre_time`,`created_at`) VALUES (?,?,?,?,?,?,?,?,?,?,?)
goblin.store.market.status=UPDATE goblin_store_marketing SET status=? , del_flag=? WHERE store_market_id =? and store_id =?
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment