hwms-shop-admin/src/components/mobilePage/home_shop.vue

367 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div :style="{marginTop:slider+'px'}">
<div class="page-shop" :style="{marginLeft:prConfig+'px',marginRight:prConfig+'px',background:bgColor}" :class="bgStyle?'':'shopOn'">
<div v-if="titleUrl" class="title-count">
<img :src="titleUrl">
</div>
<!--多行展示-->
<div class="mobile-page" v-if="isOne">
<div class="shop-list">
<div v-for="(item, index) in shopList" class="list" :key="index">
<img src="@/assets/images/store_avatar.png">
</div>
</div>
</div>
<!--单行展示-->
<div class="mobile-page" v-else>
<div class="home-shop" v-for="(item, index) in shopList" :key="index">
<div class="shop-info" :style="{background:bgColor.item}" :class="bgStyle?'':'shopOn'">
<img class="bgImg" src="@/assets/images/store_bg.png" :class="bgStyle?'':'shopOn'">
<div class="shop-title">
<img src="@/assets/images/store_avatar.png">
<div class="shop-name">{{item.name}}</div>
<div class="store-type" :style="{background:themeColor}">自营</div>
</div>
</div>
<div class="shop-product" :class="bgStyle?'':'shopOn'">
<div v-for="(itm, idx) in item.proList" class="item" :key="idx">
<img v-if="itm.image" :src="item.image">
<div class="empty-box"><span class="iconfont-diy icontupian"></span></div>
<div class="info">
<div v-if="titleShow" class="name line1">{{itm.store_name}}</div>
<div v-if="priceShow" class="price" :style="{color:themeColor}">HK$ <span>{{itm.price}}</span></div>
</div>
</div>
</div>
</div>
</div>
<div class="shop-more">更多店铺<span class="iconfont iconjinru"></span></div>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
name: 'home_shop',
cname: '品牌好店',
icon: 'icondianpujie',
configName: 'c_home_shop',
type:0,// 0 基础组件 1 营销组件 2工具组件
defaultName:'shopList', // 外面匹配名称
props: {
index: {
type: null
},
num: {
type: null
}
},
computed: {
...mapState('mobildConfig', ['defaultArray'])
},
watch: {
pageData: {
handler (nVal, oVal) {
this.setConfig(nVal)
},
deep: true
},
num: {
handler (nVal, oVal) {
let data = this.$store.state.mobildConfig.defaultArray[nVal]
this.setConfig(data)
},
deep: true
},
'defaultArray': {
handler (nVal, oVal) {
let data = this.$store.state.mobildConfig.defaultArray[this.num]
this.setConfig(data);
},
deep: true
}
},
data () {
return {
// 默认初始化数据禁止修改
defaultConfig: {
name:'shopList',
timestamp: this.num,
setUp: {
tabVal: "0"
},
logoConfig:{
type: 1,
header: '标题图片',
title: '最多可添加1张图片建议尺寸242*48px',
url: ''
},
numConfig: {
val:4,
title: '店铺数量'
},
tabConfig: {
title: '展示样式',
tabVal: 0,
type: 1,
tabList: [
{
name: '单行模式',
icon: 'icondanhang'
},
{
name: '多行模式',
icon: 'iconduohang'
}
]
},
titleShow: {
title: '是否显示商品名称',
val: true
},
priceShow: {
title: '是否显示价格',
val: true
},
bgStyle: {
title: '背景样式',
name: 'bgStyle',
type: 1,
list: [
{
val: '直角',
icon: 'iconPic_square'
},
{
val: '圆角',
icon: 'iconPic_fillet'
}
]
},
prConfig: {
title: '背景边距',
val: 0,
min: 0
},
themeColor: {
title: '主题风格',
name: 'themeColor',
default: [{
item: '#333333'
}],
color: [
{
item: '#333333'
}
]
},
bgColor: {
title: '背景颜色',
name: 'bgColor',
default: [{
item: '#fff'
}],
color: [
{
item: '#fff'
}
]
},
// 页面间距
mbConfig: {
title: '页面间距',
val: 0,
min: 0
}
},
boxStyle: '',
bgColor: '',
themeColor: '',
slider: 0,
isOne: 0,
pageData: {},
bgStyle:0,
prConfig:0,
titleUrl: "",
titleShow: true,
priceShow: true,
shopList:[],
}
},
mounted () {
this.$nextTick(() => {
this.pageData = this.$store.state.mobildConfig.defaultArray[this.num]
this.setConfig(this.pageData)
})
},
methods: {
// 对象转数组
objToArr(data) {
let obj = Object.keys(data);
let m = obj.map((key) => data[key]);
return m;
},
setConfig (data) {
if(!data) return;
if(data.mbConfig){
this.slider = data.mbConfig.val;
this.bgStyle = data.bgStyle.type;
this.prConfig = data.prConfig.val;
this.bgColor = data.bgColor.color[0].item;
this.themeColor = data.themeColor.color[0].item;
this.isOne = data.tabConfig.tabVal;
this.titleUrl = data.logoConfig.url;
this.shopList = (data.shopList && data.shopList.length > 0) ? data.shopList : this.shopList;
this.titleShow = data.titleShow.val;
this.priceShow = data.priceShow.val;
}
}
}
}
</script>
<style scoped lang="scss">
.shopOn{
border-radius: 0!important;
}
.page-shop{
border-radius: 8px;
}
.home-shop{
margin-bottom: 10px;
.shop-info{
position: relative;
width: 100%;
height: 100px;
border-radius: 8px 8px 0 0;
.bgImg{
width: 100%;
height: 100%;
border-radius: 8px 8px 0 0;
}
.shop-title{
position: absolute;
top: 10px;
left: 10px;
background: #fff;
font-weight: bold;
display: flex;
align-items: center;
max-width: 60%;
border-radius: 12px;
padding: 3px 9px;
.empty-box{
display: inline-block;
width: 18px;
height: 18px;
margin-right: 4px;
border-radius: 50%;
}
img{
width: 18px;
height: 18px;
margin-right: 4px;
border-radius: 50%;
}
.store-type{
font-size: 10px;
color: #fff;
background-color: #e93323;
padding: 0 5px;
line-height: 19px;
height: 19px;
margin-left: 20px;
border-radius: 14px;
}
.shop-name{
font-size: 14px;
}
}
}
.shop-product{
display: flex;
background: #fff;
padding: 10px 10px 0;
border-radius: 0 0 8px 8px;
.item{
width: 31.3%;
margin: 0 3.05% 10px 0;
&:nth-child(3n) {
margin-right: 0;
}
.empty-box{
width: 100%;
height: 107px;
.icontupian{
font-size: 30px;
}
}
.info{
padding: 8px 5px 0;
text-align: center;
.name{
font-size: 14px;
color: #282828;
}
.price{
font-size: 12px;
margin-top: 5px;
font-weight: bold;
span{
font-size: 15px;
}
}
}
}
}
}
.shop-list{
display: flex;
flex-wrap: wrap;
padding: 10px;
.list{
width: 23.5%;
margin: 0 2% 10px 0;
background-color: #FEFEFF;
border-radius: 6px;
height: 70px;
&:nth-child(4n){
margin-right: 0;
}
.empty-box,img{
width: 100%;
height: 70px;
}
}
}
.shop-more{
display: flex;
align-items: center;
justify-content: center;
background-color: #ffffff;
padding: 13px 0;
color: #999999;
font-size: 13px;
.iconfont{
font-size: 8px;
margin-left: 3px;
}
}
.title-count{
text-align: center;
padding: 10px 0;
img{
max-width: 100%;
width: 133px;
// height: 80px;
}
}
</style>