8 changed files with 1738 additions and 228 deletions
@ -0,0 +1,694 @@ |
|||||
|
<template> |
||||
|
<view class="pending-page" :class="{'store-scene': isStoreScene}"> |
||||
|
<view class="hero"> |
||||
|
<view class="top-bar" @tap="back"> |
||||
|
<view class="back-btn" :style="navPaddingStyle"> |
||||
|
<uni-icons type="left" size="27" color="#fff"></uni-icons> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="hero-copy"> |
||||
|
<view class="hero-kicker">{{isStoreScene ? '校园团购' : '校园外卖'}}</view> |
||||
|
<view class="hero-title">{{isStoreScene ? '正在等你来拼团' : '附近饭搭子开团中'}}</view> |
||||
|
<view class="hero-sub">{{isStoreScene ? '同学们发起的到店团,凑齐就一起省' : '公开拼饭局都在这里,点进店铺直接参团'}}</view> |
||||
|
</view> |
||||
|
<view class="hero-badge"> |
||||
|
<image src="/static/images/img/loading.gif" mode="aspectFit"></image> |
||||
|
<text>待成团</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="search-card"> |
||||
|
<view class="search-box"> |
||||
|
<uni-icons type="search" size="18" :color="searchIconColor"></uni-icons> |
||||
|
<input type="text" v-model="query.keyWord" confirm-type="search" placeholder="搜索商品或商家" |
||||
|
@confirm="searchGroup" /> |
||||
|
<view class="search-btn" @tap="searchGroup">搜索</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="list-wrap"> |
||||
|
<view class="empty-card" v-if="groupList.length === 0 && loadStatus !== 'loading'"> |
||||
|
<view class="empty-icon">拼</view> |
||||
|
<view class="empty-title">暂时没有待成团</view> |
||||
|
<view class="empty-sub">换个关键词试试,或者稍后再来看看同学们的新团</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="group-card" v-for="(item,index) in groupList" :key="item.id" @tap="joinGroup(item)"> |
||||
|
<view class="rank-pill">热拼 {{index + 1}}</view> |
||||
|
<view class="shop-row"> |
||||
|
<view class="shop-img"> |
||||
|
<image :src="item.uiShopIcon" mode="aspectFill"></image> |
||||
|
<view class="scene-mark">{{isStoreScene ? '团' : '饭'}}</view> |
||||
|
</view> |
||||
|
<view class="shop-info"> |
||||
|
<view class="shop-name">{{item.uiShopName}}</view> |
||||
|
<view class="product-name">{{item.uiProductName}}</view> |
||||
|
<view class="tag-row"> |
||||
|
<text>{{item.uiShopType}}</text> |
||||
|
<text>{{item.uiTargetMembers}}人成团</text> |
||||
|
<text>还差{{item.uiMissingMembers}}人</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="product-row"> |
||||
|
<image :src="item.uiProductImage" mode="aspectFill"></image> |
||||
|
<view class="product-copy"> |
||||
|
<view class="price-row"> |
||||
|
<text class="group-label">拼团价</text> |
||||
|
<text class="price">¥{{item.uiGroupPrice}}</text> |
||||
|
</view> |
||||
|
<view class="progress-bar"> |
||||
|
<view class="progress-inner" :style="item.uiProgressStyle"></view> |
||||
|
</view> |
||||
|
<view class="progress-copy">{{item.uiCurrentMembers}}人已拼 · 点击参与这一团</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="card-bottom"> |
||||
|
<view class="time-copy">{{item.uiExpireText}}</view> |
||||
|
<view class="join-btn">{{isStoreScene ? '参与到店团' : '参与拼饭局'}}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<uni-load-more :status="loadStatus" v-if="groupList.length > 0" /> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
scene: 'takeaway', |
||||
|
menuButtonInfo: { |
||||
|
top: 0 |
||||
|
}, |
||||
|
loadStatus: 'more', |
||||
|
navPaddingStyle: '', |
||||
|
totalPages: 1, |
||||
|
query: { |
||||
|
regionId: '', |
||||
|
status: 0, |
||||
|
isFace: 0, |
||||
|
merchantType: 1, |
||||
|
pageNumber: 1, |
||||
|
pageSize: 10, |
||||
|
keyWord: '' |
||||
|
}, |
||||
|
groupList: [] |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
isStoreScene() { |
||||
|
return this.scene === 'storeGroup' |
||||
|
}, |
||||
|
searchIconColor() { |
||||
|
return this.isStoreScene ? '#f0642f' : '#08735d' |
||||
|
} |
||||
|
}, |
||||
|
onLoad(option) { |
||||
|
this.scene = option && option.scene ? option.scene : 'takeaway' |
||||
|
this.query.merchantType = this.isStoreScene ? 2 : 1 |
||||
|
this.initRegion() |
||||
|
}, |
||||
|
onShow() { |
||||
|
this.menuButtonInfo = uni.getMenuButtonBoundingClientRect() |
||||
|
this.navPaddingStyle = 'padding-top: ' + this.menuButtonInfo.top + 'px;' |
||||
|
}, |
||||
|
onReachBottom() { |
||||
|
if (this.loadStatus === 'loading' || this.query.pageNumber >= this.totalPages) return |
||||
|
this.query.pageNumber += 1 |
||||
|
this.getGroupList() |
||||
|
}, |
||||
|
methods: { |
||||
|
initRegion() { |
||||
|
const area = uni.getStorageSync('area') |
||||
|
if (!area) { |
||||
|
this.tui.toast('请先选择区域') |
||||
|
return |
||||
|
} |
||||
|
try { |
||||
|
const areaInfo = typeof area === 'string' ? JSON.parse(area) : area |
||||
|
this.query.regionId = areaInfo.id || '' |
||||
|
} catch (e) { |
||||
|
this.query.regionId = '' |
||||
|
} |
||||
|
if (!this.query.regionId) { |
||||
|
this.tui.toast('请先选择区域') |
||||
|
return |
||||
|
} |
||||
|
this.getGroupList() |
||||
|
}, |
||||
|
searchGroup() { |
||||
|
this.query.pageNumber = 1 |
||||
|
this.totalPages = 1 |
||||
|
this.groupList = [] |
||||
|
this.getGroupList() |
||||
|
}, |
||||
|
getGroupList() { |
||||
|
if (!this.query.regionId) return |
||||
|
this.loadStatus = 'loading' |
||||
|
this.tui.request('/mall/admin/orderGroup/page', 'POST', this.query, false, false).then((res) => { |
||||
|
if (res.code == 200) { |
||||
|
const result = res.result || {} |
||||
|
const list = Array.isArray(result.records) ? result.records.map(item => this.formatGroupItem(item)) : [] |
||||
|
if (this.query.pageNumber === 1) { |
||||
|
this.groupList = list |
||||
|
} else { |
||||
|
this.groupList = [...this.groupList, ...list] |
||||
|
} |
||||
|
this.totalPages = result.pages || result.totalPages || 1 |
||||
|
this.loadStatus = this.query.pageNumber >= this.totalPages ? 'nomore' : 'more' |
||||
|
} else { |
||||
|
this.loadStatus = 'nomore' |
||||
|
this.tui.toast(res.message) |
||||
|
} |
||||
|
}).catch(() => { |
||||
|
this.loadStatus = 'nomore' |
||||
|
}) |
||||
|
}, |
||||
|
joinGroup(item) { |
||||
|
const shopItem = item.shopItem || {} |
||||
|
if (!shopItem.id) { |
||||
|
this.tui.toast('商家信息缺失,暂时无法参团') |
||||
|
return |
||||
|
} |
||||
|
const sceneQuery = this.isStoreScene ? '&orderScene=storeGroup' : '' |
||||
|
const shopItemStr = encodeURIComponent(JSON.stringify(shopItem)) |
||||
|
uni.navigateTo({ |
||||
|
url: '/package2/group/groupBuySingle?type=shop&item=' + shopItemStr + |
||||
|
'&groupId=' + item.id + |
||||
|
'&targetMembers=' + (item.targetMembers || 2) + |
||||
|
'&isFaceToFace=0' + sceneQuery |
||||
|
}) |
||||
|
}, |
||||
|
getShopIcon(item) { |
||||
|
return (item.shopItem && item.shopItem.shopIcon) || item.productPicture || '/static/images/img/shangpintu.png' |
||||
|
}, |
||||
|
formatGroupItem(item) { |
||||
|
return { |
||||
|
...item, |
||||
|
uiShopIcon: this.getShopIcon(item), |
||||
|
uiProductImage: item.productPicture || this.getShopIcon(item), |
||||
|
uiShopName: this.getShopName(item), |
||||
|
uiProductName: item.productName || '同学发起的拼团', |
||||
|
uiShopType: this.getShopType(item), |
||||
|
uiTargetMembers: item.targetMembers || 2, |
||||
|
uiCurrentMembers: item.currentMembers || 0, |
||||
|
uiMissingMembers: this.missingMembers(item), |
||||
|
uiGroupPrice: this.formatPrice(item.groupPrice), |
||||
|
uiExpireText: this.formatExpireText(item), |
||||
|
uiProgressStyle: this.buildProgressStyle(item) |
||||
|
} |
||||
|
}, |
||||
|
getShopName(item) { |
||||
|
return (item.shopItem && item.shopItem.shopName) || item.shopName || '未知商家' |
||||
|
}, |
||||
|
getShopType(item) { |
||||
|
const shopItem = item.shopItem || {} |
||||
|
return shopItem.shopTypeTitle || (shopItem.shopTakeaway && shopItem.shopTakeaway.type) || (this.isStoreScene ? '团购' : '美食') |
||||
|
}, |
||||
|
missingMembers(item) { |
||||
|
const target = Number(item.targetMembers || 2) |
||||
|
const current = Number(item.currentMembers || 0) |
||||
|
return Math.max(target - current, 0) |
||||
|
}, |
||||
|
buildProgressStyle(item) { |
||||
|
const target = Number(item.targetMembers || 2) |
||||
|
const current = Number(item.currentMembers || 0) |
||||
|
const percent = target > 0 ? Math.min(100, Math.max(12, Math.round(current / target * 100))) : 12 |
||||
|
return 'width: ' + percent + '%;' |
||||
|
}, |
||||
|
formatPrice(price) { |
||||
|
const num = Number(price || 0) |
||||
|
return num ? num.toFixed(2) : '--' |
||||
|
}, |
||||
|
formatExpireText(item) { |
||||
|
if (!item.expireTime) return '24小时内成团' |
||||
|
const expire = new Date(item.expireTime).getTime() |
||||
|
const diff = expire - Date.now() |
||||
|
if (isNaN(expire) || diff <= 0) return '即将结束' |
||||
|
const hours = Math.floor(diff / 3600000) |
||||
|
const minutes = Math.floor((diff % 3600000) / 60000) |
||||
|
return hours > 0 ? '剩余约' + hours + '小时' + minutes + '分' : '剩余约' + minutes + '分' |
||||
|
}, |
||||
|
back() { |
||||
|
uni.navigateBack() |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.pending-page { |
||||
|
min-height: 100vh; |
||||
|
padding-bottom: 140rpx; |
||||
|
background: |
||||
|
radial-gradient(circle at 12% 8%, rgba(197, 255, 153, 0.5), transparent 34%), |
||||
|
radial-gradient(circle at 90% 18%, rgba(175, 255, 231, 0.48), transparent 36%), |
||||
|
linear-gradient(180deg, #f6ffea 0%, #f7fff9 42%, #fff9ef 100%); |
||||
|
color: #06382f; |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
|
||||
|
.store-scene { |
||||
|
background: |
||||
|
radial-gradient(circle at 82% 120rpx, rgba(255, 241, 210, 0.86) 0, rgba(255, 241, 210, 0) 260rpx), |
||||
|
radial-gradient(circle at 10% 260rpx, rgba(255, 190, 185, 0.3) 0, rgba(255, 190, 185, 0) 240rpx), |
||||
|
linear-gradient(180deg, #ffd0b8 0%, #ffe6d6 260rpx, #fff7ef 560rpx, #fffaf6 100%); |
||||
|
color: #3f2618; |
||||
|
} |
||||
|
|
||||
|
.hero { |
||||
|
min-height: 360rpx; |
||||
|
padding: 0 26rpx 36rpx; |
||||
|
box-sizing: border-box; |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
background: linear-gradient(135deg, #0f8b6b 0%, #87eabf 58%, #fff0c8 100%); |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
.store-scene .hero { |
||||
|
background: linear-gradient(115deg, rgba(255, 132, 80, 0.98) 0%, rgba(255, 185, 113, 0.94) 56%, rgba(255, 236, 218, 0.9) 100%); |
||||
|
} |
||||
|
|
||||
|
.hero::after { |
||||
|
content: ''; |
||||
|
width: 420rpx; |
||||
|
height: 420rpx; |
||||
|
border-radius: 50%; |
||||
|
background: rgba(255, 255, 255, 0.22); |
||||
|
position: absolute; |
||||
|
right: -170rpx; |
||||
|
top: -130rpx; |
||||
|
} |
||||
|
|
||||
|
.top-bar { |
||||
|
height: 98rpx; |
||||
|
position: relative; |
||||
|
z-index: 2; |
||||
|
} |
||||
|
|
||||
|
.back-btn { |
||||
|
width: 68rpx; |
||||
|
height: 68rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
.hero-copy { |
||||
|
position: relative; |
||||
|
z-index: 2; |
||||
|
width: 66%; |
||||
|
padding-top: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.hero-kicker { |
||||
|
display: inline-block; |
||||
|
padding: 8rpx 18rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: rgba(255, 255, 255, 0.34); |
||||
|
font-size: 22rpx; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.hero-title { |
||||
|
margin-top: 18rpx; |
||||
|
font-size: 48rpx; |
||||
|
line-height: 58rpx; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.hero-sub { |
||||
|
margin-top: 12rpx; |
||||
|
font-size: 24rpx; |
||||
|
line-height: 36rpx; |
||||
|
font-weight: 800; |
||||
|
color: rgba(255, 255, 255, 0.86); |
||||
|
} |
||||
|
|
||||
|
.hero-badge { |
||||
|
width: 190rpx; |
||||
|
height: 190rpx; |
||||
|
border-radius: 42rpx; |
||||
|
position: absolute; |
||||
|
right: 32rpx; |
||||
|
bottom: 42rpx; |
||||
|
z-index: 2; |
||||
|
background: rgba(255, 255, 255, 0.42); |
||||
|
box-shadow: 0 22rpx 44rpx rgba(0, 45, 29, 0.16); |
||||
|
text-align: center; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.hero-badge image { |
||||
|
width: 120rpx; |
||||
|
height: 120rpx; |
||||
|
margin-top: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.hero-badge text { |
||||
|
display: block; |
||||
|
font-size: 23rpx; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.search-card { |
||||
|
width: 94%; |
||||
|
margin: -32rpx auto 22rpx; |
||||
|
padding: 16rpx; |
||||
|
border-radius: 34rpx; |
||||
|
background: rgba(255, 255, 255, 0.76); |
||||
|
box-shadow: 0 18rpx 42rpx rgba(20, 115, 88, 0.12); |
||||
|
box-sizing: border-box; |
||||
|
position: relative; |
||||
|
z-index: 3; |
||||
|
} |
||||
|
|
||||
|
.store-scene .search-card { |
||||
|
box-shadow: 0 18rpx 42rpx rgba(178, 102, 48, 0.12); |
||||
|
} |
||||
|
|
||||
|
.search-box { |
||||
|
height: 72rpx; |
||||
|
padding: 0 16rpx; |
||||
|
border-radius: 28rpx; |
||||
|
background: #fff; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.search-box input { |
||||
|
flex: 1; |
||||
|
min-width: 0; |
||||
|
height: 72rpx; |
||||
|
margin-left: 12rpx; |
||||
|
font-size: 24rpx; |
||||
|
color: #243d36; |
||||
|
} |
||||
|
|
||||
|
.search-btn { |
||||
|
width: 86rpx; |
||||
|
height: 44rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: linear-gradient(90deg, #dcff9c, #baffec); |
||||
|
color: #08735d; |
||||
|
font-size: 22rpx; |
||||
|
font-weight: 900; |
||||
|
line-height: 44rpx; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.store-scene .search-btn { |
||||
|
background: linear-gradient(135deg, #ff7444 0%, #ffae53 100%); |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
.list-wrap { |
||||
|
width: 94%; |
||||
|
margin: 0 auto; |
||||
|
} |
||||
|
|
||||
|
.empty-card, |
||||
|
.group-card { |
||||
|
border-radius: 34rpx; |
||||
|
background: rgba(255, 255, 255, 0.86); |
||||
|
box-shadow: 0 18rpx 44rpx rgba(19, 91, 70, 0.12); |
||||
|
border: 1rpx solid rgba(255, 255, 255, 0.86); |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
|
||||
|
.store-scene .empty-card, |
||||
|
.store-scene .group-card { |
||||
|
box-shadow: 0 16rpx 34rpx rgba(178, 102, 48, 0.12); |
||||
|
border-color: rgba(255, 221, 188, 0.72); |
||||
|
} |
||||
|
|
||||
|
.empty-card { |
||||
|
min-height: 460rpx; |
||||
|
padding-top: 110rpx; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.empty-icon { |
||||
|
width: 100rpx; |
||||
|
height: 100rpx; |
||||
|
margin: 0 auto 22rpx; |
||||
|
border-radius: 34rpx; |
||||
|
background: linear-gradient(135deg, #e8ffb8, #b8ffe9); |
||||
|
color: #08735d; |
||||
|
font-size: 34rpx; |
||||
|
font-weight: 900; |
||||
|
line-height: 100rpx; |
||||
|
} |
||||
|
|
||||
|
.store-scene .empty-icon { |
||||
|
background: linear-gradient(135deg, #ff9a72 0%, #ffd38a 100%); |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
.empty-title { |
||||
|
font-size: 30rpx; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.empty-sub { |
||||
|
width: 78%; |
||||
|
margin: 14rpx auto 0; |
||||
|
color: rgba(0, 35, 28, 0.56); |
||||
|
font-size: 24rpx; |
||||
|
line-height: 38rpx; |
||||
|
} |
||||
|
|
||||
|
.group-card { |
||||
|
margin-bottom: 22rpx; |
||||
|
padding: 20rpx 18rpx 18rpx; |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.rank-pill { |
||||
|
position: absolute; |
||||
|
right: 18rpx; |
||||
|
top: 18rpx; |
||||
|
z-index: 2; |
||||
|
padding: 5rpx 13rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: rgba(219, 255, 157, 0.72); |
||||
|
color: #08735d; |
||||
|
font-size: 18rpx; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.store-scene .rank-pill { |
||||
|
background: #fff0dc; |
||||
|
color: #e96632; |
||||
|
} |
||||
|
|
||||
|
.shop-row { |
||||
|
display: flex; |
||||
|
} |
||||
|
|
||||
|
.shop-img { |
||||
|
width: 168rpx; |
||||
|
height: 168rpx; |
||||
|
flex-shrink: 0; |
||||
|
border-radius: 30rpx; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
background: #f4fff3; |
||||
|
box-shadow: 0 14rpx 28rpx rgba(20, 75, 57, 0.14); |
||||
|
} |
||||
|
|
||||
|
.shop-img image { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.scene-mark { |
||||
|
width: 42rpx; |
||||
|
height: 42rpx; |
||||
|
border-radius: 50%; |
||||
|
background: rgba(255, 255, 255, 0.92); |
||||
|
color: #ff5a35; |
||||
|
font-size: 22rpx; |
||||
|
font-weight: 900; |
||||
|
line-height: 42rpx; |
||||
|
text-align: center; |
||||
|
position: absolute; |
||||
|
left: 10rpx; |
||||
|
top: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.shop-info { |
||||
|
flex: 1; |
||||
|
min-width: 0; |
||||
|
padding-left: 20rpx; |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
|
||||
|
.shop-name { |
||||
|
padding-right: 92rpx; |
||||
|
font-size: 33rpx; |
||||
|
line-height: 42rpx; |
||||
|
font-weight: 900; |
||||
|
white-space: nowrap; |
||||
|
overflow: hidden; |
||||
|
text-overflow: ellipsis; |
||||
|
} |
||||
|
|
||||
|
.product-name { |
||||
|
margin-top: 10rpx; |
||||
|
color: rgba(0, 35, 28, 0.58); |
||||
|
font-size: 24rpx; |
||||
|
line-height: 34rpx; |
||||
|
white-space: nowrap; |
||||
|
overflow: hidden; |
||||
|
text-overflow: ellipsis; |
||||
|
} |
||||
|
|
||||
|
.store-scene .product-name { |
||||
|
color: #876247; |
||||
|
} |
||||
|
|
||||
|
.tag-row { |
||||
|
margin-top: 16rpx; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.tag-row text { |
||||
|
display: inline-block; |
||||
|
margin: 0 8rpx 8rpx 0; |
||||
|
padding: 5rpx 10rpx; |
||||
|
border-radius: 12rpx; |
||||
|
background: rgba(184, 255, 225, 0.62); |
||||
|
color: #08735d; |
||||
|
font-size: 20rpx; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.store-scene .tag-row text { |
||||
|
background: #fff0dc; |
||||
|
color: #d65f2c; |
||||
|
} |
||||
|
|
||||
|
.product-row { |
||||
|
margin-top: 18rpx; |
||||
|
padding: 14rpx; |
||||
|
border-radius: 26rpx; |
||||
|
background: rgba(255, 250, 237, 0.72); |
||||
|
display: flex; |
||||
|
} |
||||
|
|
||||
|
.store-scene .product-row { |
||||
|
background: #fff7ee; |
||||
|
} |
||||
|
|
||||
|
.product-row image { |
||||
|
width: 110rpx; |
||||
|
height: 110rpx; |
||||
|
border-radius: 22rpx; |
||||
|
background: #fff; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.product-copy { |
||||
|
flex: 1; |
||||
|
min-width: 0; |
||||
|
padding-left: 16rpx; |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
|
||||
|
.price-row { |
||||
|
height: 42rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.group-label { |
||||
|
margin-right: 10rpx; |
||||
|
padding: 4rpx 9rpx; |
||||
|
border-radius: 10rpx; |
||||
|
background: #fff0dc; |
||||
|
color: #b4572d; |
||||
|
font-size: 19rpx; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.price { |
||||
|
color: #f0441f; |
||||
|
font-size: 30rpx; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.progress-bar { |
||||
|
height: 14rpx; |
||||
|
margin-top: 16rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: rgba(214, 239, 210, 0.8); |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.progress-inner { |
||||
|
height: 100%; |
||||
|
border-radius: 999rpx; |
||||
|
background: linear-gradient(90deg, #a6ffea 0%, #e3ff96 100%); |
||||
|
} |
||||
|
|
||||
|
.store-scene .progress-inner { |
||||
|
background: linear-gradient(90deg, #ff7444 0%, #ffd16e 100%); |
||||
|
} |
||||
|
|
||||
|
.progress-copy { |
||||
|
margin-top: 10rpx; |
||||
|
color: rgba(0, 35, 28, 0.52); |
||||
|
font-size: 21rpx; |
||||
|
font-weight: 800; |
||||
|
} |
||||
|
|
||||
|
.store-scene .progress-copy { |
||||
|
color: #8f715b; |
||||
|
} |
||||
|
|
||||
|
.card-bottom { |
||||
|
height: 58rpx; |
||||
|
margin-top: 16rpx; |
||||
|
padding-top: 12rpx; |
||||
|
border-top: 1rpx solid rgba(20, 90, 70, 0.08); |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.time-copy { |
||||
|
flex: 1; |
||||
|
color: rgba(0, 35, 28, 0.58); |
||||
|
font-size: 22rpx; |
||||
|
font-weight: 800; |
||||
|
} |
||||
|
|
||||
|
.store-scene .time-copy { |
||||
|
color: #8f715b; |
||||
|
} |
||||
|
|
||||
|
.join-btn { |
||||
|
width: 160rpx; |
||||
|
height: 50rpx; |
||||
|
border-radius: 999rpx; |
||||
|
background: linear-gradient(90deg, rgba(227, 255, 150, 1), rgba(166, 255, 234, 1)); |
||||
|
color: #08735d; |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 900; |
||||
|
line-height: 50rpx; |
||||
|
text-align: center; |
||||
|
box-shadow: 0 12rpx 24rpx rgba(13, 114, 82, 0.16); |
||||
|
} |
||||
|
|
||||
|
.store-scene .join-btn { |
||||
|
background: linear-gradient(135deg, #ff7444 0%, #ff9f38 100%); |
||||
|
color: #fff; |
||||
|
box-shadow: 0 12rpx 24rpx rgba(255, 126, 39, 0.24); |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue