Files
2025-06-24 14:43:09 +08:00

864 lines
19 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]" v-if="groupProductList.length">
<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>
<view class="num" :style="[titleColor]">低至0元免费拿</view>
</view>
<view class="group-top-right" :style="[headerBtnColor]" @click="toMore">
更多
<text class="iconfont icon-you" :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.id,item.product)">
<view class="group-bottom-left">
<view class="img acea-row row-center row-middle">
<easy-loadimage :image-src="item.image" width="250rpx" height="250rpx"
:radius="dataConfig.contentStyle.val"></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.title}}
</view>
<view class="pink acea-row" v-if="typeShow.includes(1)">
<view class="people-box acea-row" :style="[groupTitleColor]">
<view class="people" :style="[groupTitleColor]">
<text class="iconfont icon-kanjiahuohua"></text>
<text>{{item.sales}}人砍价成功</text>
</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.minPrice}}</text>
</view>
<view class="num otNum regular" v-if="typeShow.includes(3)"
:style="[originalColor]"><text class="num-title"></text><text
class="icon-num ">{{item.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.id)">
<view class="group-bottom-left">
<view class="img acea-row row-center row-middle big-img">
<easy-loadimage :image-src="item.image" width="324rpx" height="324rpx"
:radius="dataConfig.contentStyle.val"></easy-loadimage>
</view>
</view>
<view class="two-item">
<view class="title acea-row">
<text class="line1" v-if="typeShow.includes(0)" :style="[nameColor]">
{{item.title}}
</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.minPrice}}</text>
</view>
<view class="otNum regular" v-if="typeShow.includes(3)" :style="[originalColor]">
{{item.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.id)">
<view class="group-bottom-left">
<view class="img acea-row row-center row-middle three-img">
<easy-loadimage class="loadimage" width="100%" height="100%" :image-src="item.image"
:radius="dataConfig.contentStyle.val"></easy-loadimage>
</view>
</view>
<view class="two-item">
<view class="title acea-row">
<text class="line1" v-if="typeShow.includes(0)" :style="[nameColor]">
{{item.title}}
</text>
</view>
<view class="two-item-bottom">
<view class="price">
<view class="pinkNum line1" v-if="typeShow.includes(2)" :style="[priceColor]">
<text class="num-icon"><text class="min-text">低至</text></text><text
:style="[{'font-size':item.minPrice.length>6?'30rpx':'36rpx'}]"
class="num semiBold">{{item.minPrice}}</text>
</view>
<view class="otNum regular" v-if="typeShow.includes(3)" :style="[originalColor]">
{{item.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.id)">
<view class="group-bottom-left">
<view class="img acea-row row-center row-middle four-img">
<easy-loadimage :image-src="item.image" width="214rpx" height="214rpx"
:radius="dataConfig.contentStyle.val"></easy-loadimage>
</view>
</view>
<view class="two-item">
<view class="title acea-row" v-if="typeShow.includes(0)" :style="[nameColor]">
<text class="line1">
{{item.title}}
</text>
</view>
<view class="two-item-bottom">
<view class="price">
<view class="people-size-box" v-if="typeShow.includes(1)" :style="[...peopleStyle]">
<view class="people-size">{{item.sales}}人已砍成功</view>
</view>
<view class="pinkNum" v-if="typeShow.includes(2)" :style="[priceColor]">
<text class="num-icon"></text><text
class="num semiBold">{{item.minPrice}}</text>
</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 {
toLogin
} from '@/libs/login.js';
import {
getBargainIndexApi
} from '@/api/activity.js';
import easyLoadimage from '@/components/base/easy-loadimage.vue';
import emptyPage from '@/components/emptyPage.vue'
import {
mapGetters
} from "vuex";
let app = getApp();
export default {
name: 'homeBargain',
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: [],
themeColor: this.$options.filters.filterTheme(app.globalData.theme)
}
},
computed: {
...mapGetters({
'userData': 'userInfo',
'uid': 'uid'
}),
//容器样式
//最外层盒子的样式
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})`,
},
{
'justify-content': 'space-between',
},
];
},
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.themeStyleConfig.tabVal ? this.dataConfig.priceColor.color[0].item : this
.themeColor,
};
},
//标签颜色
groupTitleColor() {
return {
color: this.dataConfig.themeStyleConfig.tabVal ?this.dataConfig.groupTitleColor.color[0].item: this
.themeColor,
};
},
peopleStyle() {
return [{
color: '#fff',
},
{
background: `linear-gradient(to right,${
this.dataConfig.themeStyleConfig.tabVal ? this.dataConfig.btnColor.color[0].item : '#FF7931'
}, ${this.dataConfig.themeStyleConfig.tabVal? this.dataConfig.btnColor.color[1].item : this.themeColor})`,
},
{
'align-self': 'baseline',
},
{
'border-radius': '14rpx',
},
];
},
//已拼颜色
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.themeStyleConfig.tabVal ? this.dataConfig.btnColor.color[0].item : '#FF7931'
}, ${this.dataConfig.themeStyleConfig.tabVal ? this.dataConfig.btnColor.color[1].item : this.themeColor})`,
},
{
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) {
if (this.uid) {
uni.navigateTo({
url: `/pages/activity/goods_bargain_details/index?id=${id}&startBargainUid=${this.uid}`
})
} else {
toLogin()
}
},
getInfo() {
let that = this;
getBargainIndexApi().then(function(res) {
that.groupProductList = res.data.productList;
that.groupInfo = {
totalPeople: res.data.totalPeople,
avatarList: res.data.avatarList
}
}).catch((res) => {
return that.$util.Tips({
title: res
});
})
},
scroll: function(e) {
this.old.scrollTop = e.detail.scrollTop
},
// 更多
toMore() {
uni.navigateTo({
url: '/pages/activity/goods_bargain/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;
}
}
.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: 100%;
height: 210rpx;
}
.loadimage {
width: 100%;
height: 100%;
}
.four-img {
width: 100%;
height: 100%;
}
.group-bottom-right {
flex: 1;
margin-left: 20rpx;
.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;
}
.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-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: 300rpx;
}
}
.two-item-bottom {
margin-top: 10rpx;
.pinkNum {
.num {
font-size: 36rpx;
}
}
.otNum {
font-size: 26rpx;
color: #999999;
}
.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: 180rpx;
}
}
.two-item-bottom {
margin-top: 10rpx;
.pinkNum {
.num {
width: 200rpx;
font-size: 36rpx;
}
}
.otNum {
font-size: 26rpx;
color: #999999;
}
.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: 16rpx;
.numPink {
color: #ffffff;
padding: 6rpx 12rpx;
border-radius: 32rpx;
font-size: 22rpx;
}
.line1 {
width: 210rpx;
}
}
.two-item-bottom {
margin-top: 10rpx;
.pinkNum {
margin-top: 12rpx;
.num {
font-size: 36rpx;
}
}
.otNum {
font-size: 26rpx;
}
.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%;
display: grid !important;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: auto;
}
}
.titleFont {
font-size: 32rpx;
}
.scroll_view {
white-space: nowrap;
.four-item {
display: inline-block;
color: #999999;
}
}
.num-icon {
font-weight: 500 !important;
}
.numPink {
background-color: rgba(255, 255, 255, 0.9);
}
.numPink-box {
border-radius: 8rpx;
}
.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;
}
.otNum {
text-decoration: line-through;
}
.people-size {
font-size: 20rpx;
padding: 4rpx 10rpx;
}
.huo {
width: 16rpx;
height: 20rpx;
vertical-align: baseline;
margin-right: 4rpx;
}
.icon-kanjiahuohua {
font-size: 24rpx;
}
.min-text {
font-size: 22rpx !important;
font-weight: 500;
}
.icon-you {
font-size: 24rpx;
}
.regular {
line-height: 17px !important;
}
</style>