多租户商城-商户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

363 lines
9.6 KiB

<template>
<div class="layout hom-layout" v-loading.fullscreen.lock="loading">
<draggable
class="dragArea list-group"
:list="componentsData"
group="pageEdit"
:move="checkMove"
@end="pageAdd"
@change="pageChange"
filter=".undraggable"
>
<div class="list-group-item" v-for="(item,index) in componentsData" :key="index" :class="[{'on':activeComponent == index,'undraggable':item.undraggable},'item-'+item.type]" @click="selectComponent(item,index)">
<component v-show="!item.isEmpty" :isNoData.sync='item.isEmpty' :is="componentMap[terminal-1].get(item.type)" :componentContent="item.componentContent" :terminal="terminal" :typeId="typeId" :shopId="shopId" @cleckLoading="cleckLoading"></component>
<div class="no-data" v-show="item.isEmpty">
<i class="iconfont icon-kong"></i>
<p>暂无数据<br>请在右边窗口编辑内容</p>
</div>
<div class="btns">
<span @click="delComponent(item,index)"><i class="iconfont icon-shanchu"></i></span>
</div>
</div>
</draggable>
</div>
</template>
<script>
import draggable from 'vuedraggable'
import componentMap from './canvasShow/componentMap'
import { mapGetters, mapMutations } from 'vuex'
export default {
// import testData from '@@/config/testData3'
name: 'canvasEditPage',
components: {
draggable
},
props: {
terminal: {
type: Number,
default: 4
},
typeId: {
type: Number,
default: 1
},
shopId: {
type: Number,
default: 0
}
},
data () {
return {
activeComponent: -1,
componentMap: componentMap,
loading: false
}
},
mounted () {
// this.setComponentsData(testData)
},
computed: {
...mapGetters([
'componentsData'
])
},
methods: {
...mapMutations({
setActiveComponent: 'SET_ACTIVECOMPONENT',
setComponentsData: 'SET_COMPONENTSDATA'
}),
// 画布添加或者移动了组件
pageChange (e) {
if (e.added) {
if(e.added.element.type == 'header'){
var headerArr = this.componentsData.filter(v=>{
return v.type === 'header'
})
if(headerArr.length >= 2){
this.componentsData.splice(e.added.newIndex, 1)
this.$message.warning('头部组件最多只能存在一个。')
} else if(headerArr.length === 1 && this.componentsData[0].type !== 'header'){
this.componentsData.splice(e.added.newIndex, 1)
this.componentsData.unshift(e.added.element)
}
this.activeComponent = 0
e.added.element.index = 0
this.setActiveComponent(e.added.element)
} else {
this.activeComponent = e.added.newIndex
e.added.element.index = e.added.newIndex
this.setActiveComponent(e.added.element)
}
}
if (e.moved) {
this.activeComponent = e.moved.newIndex
e.moved.element.index = e.moved.newIndex
this.setActiveComponent(e.moved.element)
}
this.$emit('showRightBox', true)
},
// 拖动检查
checkMove(e){
console.log(e,'checkMove')
//不允许停靠
if (e.relatedContext.element.type == 'header') return false;
//不允许拖拽
if (e.draggedContext.element.type == 'header') return false;
},
pageAdd(e){
console.log(e,'pageAdd')
return false
},
// 选中组件
selectComponent (item, index) {
this.activeComponent = index
item.index = index
this.setActiveComponent(item)
this.$emit('showRightBox', true)
},
// 删除组件
delComponent (item, index) {
this.$confirm('确定删除吗?', '提示', {
confirmButtonText: this.$t('common.sure'),
cancelButtonText: this.$t('common.cancel'),
type: 'warning'
}).then(() => {
this.activeComponent = -1
this.componentsData.splice(index, 1)
this.$emit('showRightBox', false)
}).catch(() => {
})
},
cleckLoading(){
if(typeof(uni) !== 'undefined'){
uni.getStorage({
key: 'sendNum',
success: function (res) {
let sendNum = res.data;
this.loading = parseInt(sendNum) !== 0
}
})
} else {
let sendNum = localStorage.getItem('sendNum')
this.loading = parseInt(sendNum) !== 0
}
},
// 检查组件是否为空
checkIsNoData(dataList) {
for(let i=0;i<dataList.length;i++){
const newVal = dataList[i].componentContent
let isEmpty = true
let _data = ''
switch (dataList[i].type){
case 'banner':
_data=newVal.bannerData
_data.forEach(function(value ){
if(value.bannerUrl){
isEmpty = false
}
})
break
case 'header':
case 'classify-header':
case 'notice':
case 'text':
case 'imageTextNav':
case 'imageText':
case 'imageTextList':
case 'brandList':
case 'categoryList':
case 'assistDiv':
case 'vip':
case 'live':
case 'videoBox':
isEmpty = false
break
case 'productList':
_data = newVal.productData
if((_data.sourceType=='1' && _data.productIdList.length > 0) || (_data.sourceType=='2' && _data.categoryId != 0)){
isEmpty = false
}
break
case 'custom':
_data=newVal.imgData
_data.forEach(function(value ){
if(value.src){
isEmpty = false
}
})
break
case 'groupList':
if(this.typeId === 1){
isEmpty = false
}
else {
if(newVal.shopGroupWorkId){
isEmpty = false
}
}
break
case 'spikeList':
if(newVal.shopSeckillId){
isEmpty = false
}
break
case 'discountList':
if(newVal.discountId){
isEmpty = false
}
break
case 'priceList':
if(newVal.priceId){
isEmpty = false
}
break
case 'coupon':
if(newVal.selectedCoupon.length > 0){
isEmpty = false
}
break
case 'newProduct':
_data = newVal.productData
if((_data.sourceType=='1' && _data.productIdList.length > 0) || (_data.sourceType=='2' && _data.categoryId != 0)){
isEmpty = false
}
break
case 'shop':
_data=newVal.imgTextData
_data.forEach(function(value ){
if(value.img){
isEmpty = false
}
})
break
}
dataList[i].isEmpty = isEmpty
this.$forceUpdate()
}
console.log(dataList)
},
},
// 监控组件是否为空
watch: {
'componentsData': {
handler(newVal, oldVal) {
this.checkIsNoData(newVal)
},
deep: true
}
}
}
</script>
<style lang="scss" scoped>
.hom-layout {
background-color: #fff;
::v-deep .sortable-chosen {
.contentBox {
display: none;
}
.cloneText {
display: block;
width: 100%;
height: 50px;
line-height: 50px;
font-size: 18px;
text-align: center;
background-color: $mainColor;
color: #fff;
}
}
.list-group {
min-height: calc(100vh - 50px);
}
.list-group-item {
position: relative;
cursor: move;
background-color: #fff;
min-height: 60px;
&.item-assistDiv,&.item-notice,&.item-text{
min-height: 0px;
}
.btns {
display: none;
}
&:hover {
&:after {
content: '';
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
border: 1px $mainColor dashed;
z-index: 2;
}
}
&.on {
&:after {
content: '';
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
border: 1px $mainColor solid;
z-index: 2;
}
.btns {
display: block;
position: absolute;
right: -13px;
top: 50%;
margin-top: -13px;
z-index: 3;
span {
display: block;
width: 26px;
height: 26px;
line-height: 26px;
text-align: center;
color: #666;
background-color: #fff;
box-shadow: 0 0 2px rgba(51, 51, 51, 0.2);
cursor: pointer;
}
}
}
}
}
.no-data {
width: 100%;
display: flex;
height: 300px;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
color: #999;
text-align: center;
font-size: 16px;
line-height: 1.8;
.iconfont {
font-size: 100px;
color: $mainColor;
margin-right: 50px;
}
}
</style>
<style lang="scss">
.warp {
width: 710px;
margin: 0 auto;
max-width: 100%;
&.terminal4 {
width: 1200px;
max-width: 100%;
}
}
.flex-box {
display: flex;
}
</style>