dl_mer_uniapp/components/homeIndex/group.vue
2025-03-04 16:03:38 +08:00

788 lines
20 KiB
Vue
Raw Permalink 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>
<view class="groupBox" :style="[...boxPadding]">
<view class="group" :style="[...boxStyle]">
<view class="group-top acea-row row-middle row-between" :style="[bgImgStyle]">
<view class="group-top-left acea-row">
<image v-if="selectStyle == 0" :src="logoUrl" alt="" class="logo">
<view v-else class="titleFont" :style="[...headerTitleConfig]">{{ titleConfig }}</view>
<view class="interval" :style="[lineColor]"></view>
<!-- <image src="" alt="" class="pinkHead" :style="[contentStyle]"> -->
<view class="avater-box" v-if="groupInfo.orderDoneUserImages&&groupInfo.orderDoneUserImages.length">
<image class="avater1" :src="groupInfo.orderDoneUserImages[0]"></image>
<image class="avater2" v-if="groupInfo.orderDoneUserImages.length>1" :src="groupInfo.orderDoneUserImages[1]"></image>
<image class="avater3" v-if="groupInfo.orderDoneUserImages.length>2" :src="groupInfo.orderDoneUserImages[2]"></image>
</view>
<view v-if="groupInfo.orderDoneUserImages" class="num ml-num" :class="groupInfo.orderDoneUserImages.length==1?'num1':groupInfo.orderDoneUserImages.length==2?'num2':groupInfo.orderDoneUserImages.length==3?'num3':''" :style="[titleColor]">{{groupInfo.totalAllOrderDone}}人拼团成功</view>
</view>
<view class="group-top-right" :style="[headerBtnColor]" @click="toMore">
更多
<text class="iconfont icon-xiangyou" :style="[headerBtnColor]"></text>
</view>
</view>
<!-- 样式一 -->
<view v-if="listStyle == 0" :style="[...boxBgStyle]" class="group-bottom">
<view v-for="(item, index) in groupProductList" :key="index" :style="[contentConfig]" >
<view class=" acea-row row-between" @click="toGroupDetail(item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].productId,item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].groupActivityId)">
<view class="group-bottom-left">
<view class="img acea-row row-center row-middle" :style="[contentStyle]">
<easy-loadimage :image-src="item.groupBuyActivityProductResponse.image" width="250rpx"
height="250rpx" :radius="10"></easy-loadimage>
</view>
</view>
<view class="group-bottom-right acea-row row-column row-between">
<view class="right-top">
<view class="title line2" v-if="typeShow.includes(0)" :style="[nameColor]">
{{item.groupBuyActivityProductResponse.productName}}
</view>
<view class="pink acea-row" v-if="typeShow.includes(1)">
<view class="people-box acea-row" :style="[groupTitleColor]">
<view class="people" :style="[groupTitleColor]">{{item.buyCount}}人团</view>
<view class="groupNum" :style="[groupTitleFontColor]">
已拼{{item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses.latestBuyCount||'0'}}份
</view>
</view>
</view>
</view>
<view class="right-bottom acea-row row-between">
<view class="price">
<view class="pinkNum" v-if="typeShow.includes(2)" :style="[priceColor]"><text
class="pinkNum-title">拼团价</text><text class="pinkNum-icon">¥</text><text
class="pinkNum-num semiBold">{{item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].activePrice}}</text>
</view>
<view class="num" v-if="typeShow.includes(3)" :style="[originalColor]"><text
class="num-title">单买价</text><text class="num-icon">¥</text><text
class="icon-num regular">{{item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0]['attrValue'][0].price}}</text>
</view>
</view>
<view class="btnBox" v-if="groupBtnShow">
<view class="btn" :style="[...btnColor]">去拼团</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 样式二 -->
<view class="group-bottom two acea-row row-between grid-list" v-if="listStyle == 1"
:style="[...boxBgStyle]">
<view v-for="(item, index) in groupProductList" :key="index" @click="toGroupDetail(item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].productId,item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].groupActivityId)">
<view class="group-bottom-left">
<view class="img acea-row row-center row-middle big-img" :style="[contentStyle]">
<easy-loadimage :image-src="item.groupBuyActivityProductResponse.image" width="324rpx"
height="324rpx" :radius="10"></easy-loadimage>
</view>
</view>
<view class="two-item">
<view class="title acea-row">
<view :style="[groupTitleColor]" class="numPink-box">
<view class="numPink" v-if="typeShow.includes(1)" :style="[groupTitleFontColor]">{{item.buyCount}}人团</view>
</view>
<text class="line1" v-if="typeShow.includes(0)" :style="[nameColor]">
{{item.groupBuyActivityProductResponse.productName}}
</text>
</view>
<view class="two-item-bottom acea-row row-between">
<view class="price">
<view class="pinkNum" v-if="typeShow.includes(2)" :style="[priceColor]">
<text class="num-icon">¥</text><text
class="num semiBold" >{{item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].activePrice}}</text>
</view>
<view class="otNum regular" v-if="typeShow.includes(3)" :style="[originalColor]">
¥{{item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0]['attrValue'][0].price}}
</view>
</view>
<view class="btnBox" v-if="groupBtnShow">
<view class="btn" :style="[...btnColor]">去拼团</view>
</view>
</view>
</view>
</view>
</view>
<!-- 样式三 -->
<view class="group-bottom three acea-row grid-three" v-if="listStyle == 2" :style="[...boxBgStyle]">
<view v-for="(item, index) in groupProductList" :key="index" class="three-box" @click="toGroupDetail(item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].productId,item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].groupActivityId)">
<view class="group-bottom-left">
<view class="img acea-row row-center row-middle three-img" :style="[contentStyle]">
<easy-loadimage :image-src="item.groupBuyActivityProductResponse.image" width="214rpx"
height="214rpx" :radius="10"></easy-loadimage>
</view>
</view>
<view class="two-item">
<view class="title acea-row">
<view :style="[groupTitleColor]" class="numPink-box numPink-box-special">
<view class="numPink" v-if="typeShow.includes(1)" :style="[groupTitleFontColor]">{{item.buyCount}}人团</view>
</view>
<text class="line1" v-if="typeShow.includes(0)" :style="[nameColor]">
{{item.groupBuyActivityProductResponse.productName}}
</text>
</view>
<view class="two-item-bottom">
<view class="price">
<view class="pinkNum" v-if="typeShow.includes(2)" :style="[priceColor]">
<text class="num-icon">¥</text><text
class="num semiBold">{{item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].activePrice}}</text>
</view>
<view class="otNum regular" v-if="typeShow.includes(3)" :style="[originalColor]">
¥{{item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0]['attrValue'][0].price}}
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 样式四 -->
<view class="group-bottom four acea-row " v-if="listStyle == 3" :style="[...boxBgStyle]">
<scroll-view scroll-x="true" class="scroll_view">
<view v-for="(item, index) in groupProductList" :key="index" class="four-item" :style="[fourStyle]" @click="toGroupDetail(item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].productId,item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].groupActivityId)">
<view class="group-bottom-left">
<view class="img acea-row row-center row-middle four-img" :style="[contentStyle]">
<easy-loadimage :image-src="item.groupBuyActivityProductResponse.image" width="240rpx"
height="240rpx" :radius="10"></easy-loadimage>
</view>
</view>
<view class="two-item">
<view class="title acea-row" v-if="typeShow.includes(0)" :style="[nameColor]">
<view :style="[groupTitleColor]" class="numPink-box numPink-box-special">
<view class="numPink" v-if="typeShow.includes(1)" :style="[groupTitleFontColor]">{{item.buyCount}}人团</view>
</view>
<text class="line1">
{{item.groupBuyActivityProductResponse.productName}}
</text>
</view>
<view class="two-item-bottom">
<view class="price">
<view class="pinkNum" v-if="typeShow.includes(2)" :style="[priceColor]">
<text class="num-icon">¥</text><text
class="num semiBold">{{item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0].activePrice}}</text>
</view>
<view class="otNum regular" v-if="typeShow.includes(3)" :style="[originalColor]">
¥{{item.groupBuyActivityProductResponse.groupBuyActivitySkuResponses[0]['attrValue'][0].price}}
</view>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
<emptyPage :mTop="'0'" v-if="groupProductList.length==0" title="暂无拼团商品,去看看其他商品吧~" :imgSrc="urlDomain+'crmebimage/presets/noActivity.png'"></emptyPage>
</view>
</view>
</template>
<script>
import {
getGroupIndexApi
} from '@/api/group.js'
import easyLoadimage from '@/components/base/easy-loadimage.vue';
import emptyPage from '@/components/emptyPage.vue'
export default {
name: 'homeGroup',
components: {
easyLoadimage,
emptyPage
},
props: {
dataConfig: {
type: Object,
default: () => {}
},
},
data() {
return {
urlDomain: this.$Cache.get("imgHost"),
listStyle: 0,
logoUrl: null,
typeShow: [0, 1, 2, 3],
groupBtnShow: true,
selectStyle: '',
titleConfig: '',
selectBgImg: '',
bgImgUrl: '',
headerTitleStyle: 0,
old: {
scrollTop: 0
},
groupInfo: {},
groupProductList: []
}
},
computed: {
//容器样式
//最外层盒子的样式
boxStyle() {
return [{
'border-radius': this.dataConfig.bgStyle.val ? 2 * this.dataConfig.bgStyle.val + 'rpx' : '0'
},
{
margin: 0 + ' ' + 2 * this.dataConfig.lrConfig.val + 'rpx' + ' ' + 0
},
{
background: `linear-gradient(to right,${this.dataConfig.bgColor.color[0].item}, ${this.dataConfig.bgColor.color[1].item})`,
},
];
},
//边距
boxPadding() {
return [{
padding: 2 * this.dataConfig.upConfig.val + 'rpx' + ' ' + '0rpx' + ' ' + 2 * this.dataConfig
.downConfig.val + 'rpx',
},
{
margin: 2 * this.dataConfig.mbConfig.val + 'rpx' + ' ' + 0 + ' ' + 0
},
]
},
//背景颜色
boxBgStyle() {
return [{
gap: this.listStyle != 3 ? `${2*this.dataConfig.contentConfig.val}rpx` : ''
},
{
background: `linear-gradient(to right,${this.dataConfig.contentBgColor.color[0].item}, ${this.dataConfig.contentBgColor.color[1].item})`,
},
];
},
fourStyle() {
return {
'margin-right': this.listStyle == 3 ? `${2*this.dataConfig.contentConfig.val}rpx` : ''
}
},
//标题颜色
titleColor() {
return {
color: this.dataConfig.titleColor.color[0].item,
};
},
//头部按钮颜色
headerBtnColor() {
return {
color: this.dataConfig.headerBtnColor.color[0].item,
};
},
//商品名称颜色
nameColor() {
return {
color: this.dataConfig.nameColor.color[0].item,
};
},
//商品原价颜色
originalColor() {
return {
color: this.dataConfig.originalColor.color[0].item,
};
},
//拼团价格颜色
priceColor() {
return {
color: this.dataConfig.priceColor.color[0].item,
};
},
//标签颜色
groupTitleColor() {
return {
background: this.dataConfig.groupTitleColor.color[0].item,
};
},
//已拼颜色
groupTitleFontColor() {
return {
color: this.dataConfig.groupTitleColor.color[0].item,
}
},
//分割线颜色
lineColor() {
return {
border: `1rpx solid ${this.dataConfig.lineColor.color[0].item}`,
};
},
//按钮颜色
btnColor() {
return [{
background: `linear-gradient(to right,${this.dataConfig.btnColor.color[0].item}, ${this.dataConfig.btnColor.color[1].item})`,
},
{
color: this.dataConfig.btnFontColor.color[0].item,
}
];
},
//图片圆角
contentStyle() {
return {
'border-radius': this.dataConfig.contentStyle.val ? 2 * this.dataConfig.contentStyle.val + 'rpx' : '0',
};
},
//样式一内容边距
contentConfig() {
return {
'paddingBottom': 2 * this.dataConfig.contentConfig.val + 'rpx',
};
},
//背景图片
bgImgStyle() {
return {
'background': this.selectBgImg == 0 ? `url(${this.bgImgUrl})` :
`linear-gradient(to right,${this.dataConfig.bgColor.color[0].item}, ${this.dataConfig.bgColor.color[1].item})`,
};
},
//标题文字格式
headerTitleConfig() {
return [{
'font-weight': this.headerTitleStyle == 0 ? 600 : ''
},
{
'font-style': this.headerTitleStyle == 2 ? 'italic' : 'normal'
},
{
color: this.dataConfig.headerTitleColor.color[0].item,
}
]
}
},
created() {
this.setConfig()
this.getInfo()
},
methods: {
//去拼团
toGroupDetail(id,groupActivityId){
uni.navigateTo({
url:`/pages/goods/goods_details/index?id=${id}&mt=2&gd=${groupActivityId}`
})
},
getInfo() {
getGroupIndexApi(6).then((res) => {
this.groupInfo = res.data
this.groupProductList = res.data.items
})
},
scroll: function(e) {
this.old.scrollTop = e.detail.scrollTop
},
// 更多
toMore() {
uni.navigateTo({
url: '/pages/activity/goods_group/index'
})
},
setConfig() {
this.listStyle = this.dataConfig.tabConfig.tabVal;
this.logoUrl = this.dataConfig.logoConfig.url;
this.typeShow = this.dataConfig.typeConfig.activeValue;
this.groupBtnShow = this.dataConfig.groupBtnConfig.tabVal == 0 ? true : false;
this.selectStyle = this.dataConfig.selectStyle.tabVal;
this.titleConfig = this.dataConfig.titleConfig.val;
this.selectBgImg = this.dataConfig.selectBgImg.tabVal;
this.bgImgUrl = this.dataConfig.bgImg.url;
this.headerTitleStyle = this.dataConfig.headerTitleStyle.tabVal;
},
}
}
</script>
<style lang="scss" scoped>
.groupBox {
overflow: hidden;
.group {
overflow: hidden;
.group-top {
width: 100%;
height: 100rpx;
padding: 0 24rpx;
background-size: cover !important;
.group-top-left {
align-items: center;
.ml10{
margin-top: 4rpx;
}
.logo {
width: 154rpx;
height: 32rpx;
object-fit: contain;
}
.interval {
width: 0rpx;
height: 28rpx;
margin-left: 20rpx;
margin-top: 4rpx;
opacity: 0.6;
}
.pinkHead {
width: 108rpx;
height: 36rpx;
}
.num {
height: 32rpx;
line-height: 32rpx;
font-size: 26rpx;
margin-left: 16rpx;
color: #FFFFFF;
margin-top: 6rpx;
}
.num1{
margin-left: 12rpx;
}
.num2{
margin-left: 41rpx;
}
.num3{
margin-left: 76rpx;
}
}
.group-top-right {
height: 32rpx;
line-height: 32rpx;
font-size: 24rpx;
.icon-xiangyou {
font-size: 24rpx;
}
}
}
.group-bottom {
width: 100%;
padding: 20rpx;
.img {
width: 240rpx;
// height: 240rpx;
background: #F3F9FF;
}
.big-img.img {
width: 100%;
height: 324rpx;
}
.three-img.img {
width: 210rpx;
height: 210rpx;
}
.four-img {
width: 240rpx;
height: 240rpx;
}
.group-bottom-right {
width: 400rpx;
.right-top {
.title {
font-size: 28rpx;
color: #333333;
}
.people-box {
border-radius: 8rpx;
}
.pink {
margin-top: 16rpx;
font-size: 22rpx;
border-radius: 8rpx;
.people {
color: #fff;
padding: 4rpx 12rpx;
border-radius: 8rpx 0 0 8rpx;
}
.groupNum {
background-color: rgba(255, 255, 255, 0.9);
padding: 4rpx 12rpx;
border-radius: 0 6rpx 6rpx 0;
margin-left: 2rpx;
}
}
}
.right-bottom {
.price {
.pinkNum {
.pinkNum-num {
font-weight: 600;
font-size: 36rpx;
}
}
.num {
color: #999999;
}
}
.btnBox {
// margin-top: 16rpx;
font-size: 22rpx;
display: flex;
align-items: end;
.btn {
padding: 12rpx 20rpx;
border-radius: 50rpx;
}
}
}
}
}
.group-bottom.two {
.two-item {
width: 100%;
.title {
margin-top: 20rpx;
.numPink {
color: #ffffff;
padding: 6rpx 12rpx;
border-radius: 4rpx;
font-size: 22rpx;
}
.line1 {
width: 210rpx;
}
}
.two-item-bottom {
margin-top: 10rpx;
.pinkNum {
.num {
font-weight: 600;
font-size: 36rpx;
}
}
.otNum {
font-size: 26rpx;
color: #999999;
text-decoration: line-through;
}
.btnBox {
margin-top: 16rpx;
font-size: 22rpx;
.btn {
padding: 12rpx 24rpx;
border-radius: 50rpx;
}
}
}
}
}
.group-bottom.three {
.three-box{
position: relative;
}
.numPink {
color: #ffffff;
padding: 6rpx 12rpx;
border-radius: 32rpx;
font-size: 22rpx;
z-index: 9;
}
.two-item {
width: 100%;
.title {
margin-top: 20rpx;
width: 100%;
.numPink {
color: #ffffff;
padding: 4rpx 12rpx;
border-radius: 32rpx;
font-size: 22rpx;
}
.line1 {
width: 210rpx;
}
}
.two-item-bottom {
margin-top: 10rpx;
.pinkNum {
.num {
font-weight: 600;
font-size: 36rpx;
}
}
.otNum {
font-size: 26rpx;
color: #999999;
text-decoration: line-through;
}
.btnBox {
margin-top: 16rpx;
font-size: 22rpx;
.btn {
padding: 12rpx 24rpx;
border-radius: 50rpx;
}
}
}
}
}
.group-bottom.four {
overflow: hidden;
flex-wrap: nowrap;
position: relative;
.four-item{
position: relative;
}
.numPink {
color: #ffffff;
padding: 6rpx 12rpx;
border-radius: 32rpx;
font-size: 22rpx;
z-index: 9;
}
.two-item {
width: 210rpx;
.title {
margin-top: 18rpx;
.numPink {
color: #ffffff;
padding: 6rpx 12rpx;
border-radius: 32rpx;
font-size: 22rpx;
}
.line1 {
width: 210rpx;
}
}
.two-item-bottom {
margin-top: 10rpx;
.pinkNum {
.num {
font-weight: 600;
font-size: 36rpx;
}
}
.otNum {
font-size: 26rpx;
text-decoration: line-through;
}
.btnBox {
margin-top: 16rpx;
font-size: 22rpx;
.btn {
padding: 12rpx 24rpx;
border-radius: 50rpx;
}
}
}
}
}
}
.price {
display: flex;
flex-direction: column;
justify-content: flex-end;
}
.grid-list {
display: grid !important;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: auto;
width: 100%;
}
.grid-three {
width: 100%;
.three-box {
width: 207rpx;
}
}
}
.titleFont {
font-size: 16px;
}
.scroll_view {
white-space: nowrap;
.four-item {
display: inline-block;
color: #999999;
}
}
.num-icon {
font-weight: 600 !important;
}
.numPink {
background-color: rgba(255, 255, 255, 0.9);
}
.numPink-box {
border-radius: 4rpx;
}
.numPink-box-special {
position: absolute;
left: 10rpx;
top: 10rpx;
border-radius: 32rpx;
}
.avater-box{
position: relative;
display: flex;
align-items: end;
margin-top: 4rpx;
image{
width: 36rpx;
height: 36rpx;
border-radius: 18rpx;
}
.avater1{
margin-left: 20rpx;
}
.avater2{
position: absolute;
margin-left: 48rpx;
}
.avater3{
position: absolute;
left: 78rpx;
}
}
.regular{
line-height: 34rpx !important;
font-weight: 400 !important;
}
</style>