baimacms/pages/detail/detail.vue

1657 lines
36 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>
<view class="detail-container">
<!-- 顶部渐变导航栏 -->
<view class="fixed-header" :style="{ opacity: navOpacity }">
<view class="header-content">
<text class="header-title">商品详情</text>
</view>
</view>
<!-- 悬浮返回按钮 -->
<view class="back-btn" :style="{ backgroundColor: 'rgba(0,0,0,' + bgOpacity + ')' }" @click="goBack">
<view class="back-icon-box" :style="{ borderColor: iconColor }"></view>
</view>
<scroll-view scroll-y class="scroll-content" :show-scrollbar="false" @scroll="handleScroll">
<!-- 真实内容 -->
<view v-if="isLoaded" class="animate-fade-in">
<!-- 主图轮播 -->
<view class="swiper-box">
<swiper class="main-swiper" circular @change="swiperChange">
<swiper-item v-for="(img, index) in product.images" :key="index">
<image :src="img" mode="aspectFill" class="swiper-img"></image>
</swiper-item>
</swiper>
<view class="swiper-indicator" v-if="product.images.length > 0">{{ currentSwiper + 1 }}/{{ product.images.length }}</view>
</view>
<!-- 活动横幅 -->
<view class="activity-banner" v-if="product.activity && product.activity.app_img">
<image :src="product.activity.app_img" mode="widthFix" class="banner-img"></image>
<view class="banner-time" v-if="product.activityTime">TIME: {{ product.activityTime }}</view>
</view>
<!-- 热销榜单提示 -->
<view class="hot-sale-bar" v-if="product.rankText">
<view class="hot-left">
<text class="trophy-icon">🏆</text>
<text class="hot-text">{{ product.rankText }}</text>
</view>
<view class="hot-divider">|</view>
<view class="hot-right">
<text>今日已有{{ product.todaySale }}人下单</text>
</view>
</view>
<!-- 价格与标题区 -->
<view class="info-section">
<view class="price-row">
<view class="price-left">
<text class="price-label">券后¥</text>
<text class="price-val">{{ product.price }}</text>
<text class="price-old">¥{{ product.oldPrice }}</text>
</view>
<view class="price-right">
已售 <text class="sales-red">{{ product.totalSale }}</text> 件
</view>
</view>
<view class="title-row">
<view class="title-content">
<image src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADQklEQVRYR+2XX4hUdRTHP+euGAsbLKiU9KDRRvhnvL+7E4v5YvYSZLIu6T5JBIJilH+eDERckUh90P5BFEFg9FAmlhj6pFugwj7s/d2ZnUgsWQUFldqFWBuEuUd+s3f0zrg7M46JL3sfZmB+v+85n985vznnXCF5lMxHIH3AS5XfHtN3AeScEG129sV9KMv0MTmra1bIiSj+l6CbngQA6H5Rlo0AS54MABcdQDPhvw589ZCQW4BnGmmaBNA+If9TI2PpdSXzDsg3jTRNAjAA8a9pY8LIYLXDpa9WO/NWgtPVf5oFqLGig0J+Vc2Jz4LUQDRyDzMAMxGYicBMBFqMgOvjuXIrvz9PNNVTHqhMLQO4Mivk9ibzxJ5myu5UdVGUzFnQsiHw3gC2AbMbF9GWdtwGjkD8/aRa9lSFcfI0S1eA9x2wsCUX04tCiNcLI39VNzUgm83Ob2truzM0NPT3/ZxmLIj/P0FcEXL3DtTT0zNnYmJCC4XCP2KMSefvgoj0hmF4S1n8LMzKA3MfEeJf8LKCvRQEwTxV/Rl4pZwAkV4HUDWSqeqxKIrWTaYjsxbk+CMCrBNyx5wN3/d/FJG3UvbOOYAHRjIRORCG4QfJDd8KfNIixLtC7gunDYJgv6rurLUzJUCyqc9aWx7DlMwmkLeTd4ZGKbkFXAT9VsiX50hjzFpgykjWAyiISH8Yhr+3ePqyLAiCxar6w3STdz0Apy+o6u4oilq6B77v94nIvnpj/3QAAyKyXFX/U9VZIuLG6yvANWC8QUQ6geeABSJyI9mrqjo8VbV0AOcrfwt3YuA9oBfYnog3xHF81fO83x4mFZ7nvRzHcQaojOYHgVPA56mIXHAAh4AdzrnL+djY2OXOzs6bwNOJw0Fr7SpjzHrA5bKZp99aezQIghOquiYRTHS3t88rFovPp+7E4XIpNsY4w5estbt8339dRE6nvYyPj7ePjo4WjTEngdXJ2oC1ttxDaorZL9baN7u6up7q6Ogopu04mCiKThpjPgRetNb23+sF3d3drw0PD58JgmCjqn6dFpZKpUX5fP4P3/c/FZH33Zq1tqqPVOqJqn4WRdHWbDb7QqlU+rMmXDustR9XfLm1uwCwZa9OY0IsAAAAAElFTkSuQmCC" class="title-platform-icon"></image>
<text class="title-text">{{ product.title }}</text>
</view>
</view>
<view class="tags-row">
<text class="tag-capsule" v-for="(tag, index) in product.labels" :key="index">{{ tag }}</text>
</view>
</view>
<!-- 优惠券模块 -->
<view class="coupon-section" v-if="product.couponVal">
<view class="coupon-card">
<view class="coupon-left">
<view class="coupon-amount">
<text class="amount-val">{{ product.couponVal }}</text>
<text class="amount-unit">元优惠券</text>
</view>
<view class="coupon-time">使用期限: {{ product.couponTime }}</view>
</view>
<!-- <view class="coupon-right">
<view class="get-btn" @click="goBuy">立即领券</view>
</view> -->
<!-- <view class="coupon-circle top"></view> -->
<!-- <view class="coupon-circle bottom"></view> -->
</view>
</view>
<!-- 品牌与店铺 -->
<view class="brand-shop-card" v-if="product.shopName">
<view class="brand-row" v-if="product.brandName">
<text class="row-label">品牌</text>
<view class="brand-content">
<image :src="product.brandLogo" mode="aspectFit" class="brand-logo-img" v-if="product.brandLogo"></image>
<text class="brand-name-text">{{ product.brandName }}</text>
</view>
</view>
<view class="shop-row">
<text class="row-label">店铺</text>
<view class="shop-main-content">
<view class="shop-name-row">
<view class="shop-title-box">
<text :class="product.platform === '天猫' ? 'tag-tmall-mini' : 'tag-taobao-mini'" v-if="product.platform">{{ product.platform === '天猫' ? 'T' : '' }}</text>
<text class="shop-name-text">{{ product.shopName }}</text>
</view>
<text class="row-arrow">></text>
</view>
<view class="score-detail-row">
<view class="score-item">
描述 <text class="val-red">{{ product.scores.desc }}</text> <text class="up-red"></text>
</view>
<view class="score-item">
服务 <text class="val-red">{{ product.scores.service }}</text> <text class="up-red"></text>
</view>
<view class="score-item">
物流 <text class="val-red">{{ product.scores.post }}</text> <text class="up-red"></text>
</view>
</view>
</view>
</view>
</view>
<!-- 粉丝福利购 -->
<view class="benefit-card" v-if="product.desc">
<view class="benefit-header">
<view class="benefit-title-box">
<image src="/static/img/fuli.png" class="benefit-icon"></image>
<text class="benefit-title">粉丝福利购</text>
</view>
</view>
<view class="benefit-content">
<text class="benefit-text">{{ product.desc }}</text>
</view>
</view>
<!-- 详情控制条 -->
<view class="detail-control-bar">
<view class="control-left">
<text class="red-line"></text>
<text class="control-title">详情</text>
</view>
<view class="control-right" @click="isExpanded = !isExpanded">
<text class="expand-text">{{ isExpanded ? '收起' : '展开' }}</text>
<view :class="['expand-arrow', isExpanded ? 'up' : 'down']"></view>
</view>
</view>
<!-- 图文详情 -->
<view class="detail-images" :class="{ 'collapsed': !isExpanded }">
<image v-for="(img, index) in product.detailImages" :key="index" :src="img" mode="widthFix" class="detail-img"></image>
</view>
<!-- 同类型产品推荐 -->
<view class="more-like com" v-if="similarProducts.length > 0">
<view class="top g-df-c">
<image src="https://web.cms.hykefu.cn/static/img/tongleituij.png" mode="widthFix" class="recommend-title-img"></image>
</view>
<view class="list">
<view class="list-container">
<view class="g-shop-list" v-for="(item, idx) in similarProducts" :key="idx" @click="goToDetail(item.id)">
<view class="shop-img">
<image :src="item.itempic" mode="aspectFill" lazy-load></image>
</view>
<view class="shop-box">
<view class="shop-title van-multi-ellipsis--l2">
<image :src="item.shoptype === 'B' ? 'https://img-haodanku-com.cdn.fudaiapp.com/FlyOSTvjC3LjrkUoJ0NPxx1qnGz4' : 'https://img-haodanku-com.cdn.fudaiapp.com/Fpx7_72-zY-n-zX_5_f2_f-f'" class="platform-icon"></image>
<text>{{ item.itemtitle }}</text>
</view>
<view class="shop-tag">
<text v-if="item.is_low_price === '1'">{{ item.low_price_day }}天最低价</text>
<text v-if="item.couponmoney">满{{ item.itemprice }}减{{ item.couponmoney }}</text>
</view>
<view class="flex-left flex-left-o">
<view class="discount-price"> 券后¥ <text class="price-num">{{ item.itemendprice }}</text></view>
<view class="g-coupon-label g-df-vc" v-if="item.couponmoney">
<span class="g-df-c">券</span>
<text>{{ item.couponmoney }}元</text>
</view>
</view>
<view class="flex-left flex-left-t">
<view class="sales-volume">已售{{ formatSales(item.itemsale) }}件</view>
</view>
</view>
</view>
</view>
</view>
<view class="end-tips">已为您加载完毕</view>
<view class="custom-copyright">©️粉丝福利购专属优惠商城</view>
</view>
<!-- 底部留白 -->
<view class="footer-placeholder"></view>
</view>
<!-- 骨架屏占位 -->
<view class="skeleton-wrap" v-else>
<view class="sk-swiper sk-animate"></view>
<view class="sk-info">
<view class="sk-price sk-animate"></view>
<view class="sk-title sk-animate"></view>
<view class="sk-title sk-short sk-animate"></view>
<view class="sk-tags">
<view class="sk-tag sk-animate"></view>
<view class="sk-tag sk-animate"></view>
</view>
</view>
<view class="sk-coupon sk-animate"></view>
<view class="sk-shop sk-animate"></view>
<view class="sk-detail sk-animate"></view>
</view>
</scroll-view>
<!-- 底部固定操作栏 -->
<view class="bottom-bar">
<view class="bar-left">
<view class="bar-btn" @click="goHome">
<text class="bar-icon">🏠</text>
<text class="bar-text">首页</text>
</view>
<view class="bar-btn">
<text class="bar-icon">📤</text>
<text class="bar-text">分享</text>
</view>
</view>
<view class="bar-right">
<view class="copy-btn" @click="copyTaoWord">复制口令购买</view>
<!-- <view class="buy-btn" @click="goBuy">领券购买</view> -->
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
statusBarHeight: 44,
currentSwiper: 0,
product: {
id: '',
images: [],
rank: 0,
todaySale: 0,
price: '',
oldPrice: '',
totalSale: '',
platform: '',
title: '',
labels: [],
couponVal: 0,
couponTime: '',
shopName: '',
brandName: '',
brandLogo: '',
scores: {
desc: '-',
service: '-',
post: '-'
},
activity: null,
activityTime: '',
detailImages: []
},
isLoaded: false,
navOpacity: 0,
bgOpacity: 0.4,
iconColor: '#ffffff',
isExpanded: true,
similarProducts: []
}
},
onLoad(options) {
this.product.id = options.id || '55493973';
this.keywordid = options.keywordid || '';
const sysInfo = uni.getSystemInfoSync();
this.statusBarHeight = sysInfo.statusBarHeight || 44;
this.getDetailData();
},
methods: {
getDetailData() {
const useSuperSearch = this.keywordid;
uni.request({
url: useSuperSearch
? `https://api.cmspro.haodanku.com/superSearch/getList?keyword=${this.keywordid}&cid=YsWZ21tx`
: `https://api.cmspro.haodanku.com/detail/itemInfo?id=${this.product.id}&cid=YsWZ21tx`,
success: (res) => {
if (res.data && res.data.code === 200) {
const d = useSuperSearch
? (Array.isArray(res.data.data) && res.data.data.length > 0 ? res.data.data[0] : null)
: res.data.data;
if (!d) return;
console.log('详情数据获取成功:', d);
// 格式化活动时间
const formatActDate = (ts) => {
const date = new Date(ts * 1000);
const m = date.getMonth() + 1;
const day = date.getDate();
const h = date.getHours().toString().padStart(2, '0');
const min = date.getMinutes().toString().padStart(2, '0');
return `${m}/${day} ${h}:${min}`;
};
// 格式化销量
let salesStr = d.itemsale;
if (d.itemsale >= 10000) {
salesStr = (d.itemsale / 10000).toFixed(1) + '万';
}
// 解析排行榜标签
let rank = 10; // 默认
let rankText = '近期热销榜';
try {
const labels = JSON.parse(d.rank_label);
if (labels && labels.length > 0) {
rankText = labels[0].title;
rank = labels[0].sort || 10;
}
} catch (e) {}
// 处理图片逻辑 (512345 模式: 将最后一张图追加到首位)
// 兼容taobao_image_qiniu 可能为空数组 [] 或不存在,回退到 itempic
let swiperImages = (Array.isArray(d.taobao_image_qiniu) && d.taobao_image_qiniu.length > 0)
? [...d.taobao_image_qiniu]
: (d.itempic ? [d.itempic] : []);
if (swiperImages.length > 0) {
swiperImages.unshift(swiperImages[swiperImages.length - 1]);
}
// 详情图兼容逻辑:优先 material_info -> 其次 taobao_image -> 再次 taobao_image_qiniu -> 最后主图
let detailImages = [];
if (d.material_info && d.material_info[0] && Array.isArray(d.material_info[0].image) && d.material_info[0].image.length > 0) {
detailImages = d.material_info[0].image.map(img => img.startsWith('http') ? img : `https://img-haodanku-com.cdn.fudaiapp.com/${img}`);
} else if (d.taobao_image && typeof d.taobao_image === 'string') {
detailImages = d.taobao_image.split(',');
} else if (Array.isArray(d.taobao_image_qiniu) && d.taobao_image_qiniu.length > 0) {
detailImages = d.taobao_image_qiniu;
} else if (typeof d.taobao_image_qiniu === 'string' && d.taobao_image_qiniu) {
detailImages = d.taobao_image_qiniu.split(',');
} else if (d.itempic) {
detailImages = [d.itempic];
}
const activityTime = d.activity_info ?
`${formatActDate(d.activity_info.start_time)}-${formatActDate(d.activity_info.end_time)}` : '';
this.product = {
id: d.id,
images: swiperImages,
rank: rank,
rankText: rankText,
todaySale: d.todaysale,
price: d.itemendprice,
oldPrice: d.itemprice,
totalSale: salesStr,
platform: d.shoptype === 'B' ? '天猫' : '淘宝',
title: d.itemtitle,
labels: d.label || [],
couponVal: d.couponmoney,
couponTime: (() => {
if (!d.couponlife) return '';
const year = new Date().getFullYear();
const life = d.couponlife.replace('有效期至:', '');
return life.split('-').map(t => `${year}.${t}`).join('-');
})(),
shopName: d.shopname,
brandName: d.fq_brand_name || (d.brand_info && d.brand_info.fq_brand_name) || '大牌',
brandLogo: (d.brand_info && d.brand_info.brand_logo) || d.shopicon || '',
scores: {
desc: (d.shop_score && d.shop_score.desc_score) || '-',
service: (d.shop_score && d.shop_score.serv_score) || '-',
post: (d.shop_score && d.shop_score.post_score) || '-'
},
desc: d.itemdesc,
detailImages: detailImages,
activity: d.activity_info,
activityTime: activityTime,
activityId: (d.activity_info && d.activity_info.activityid) || d.activityid || '',
commission: d.tkmoney,
taobaoId: d.itemid,
sonCategory: d.son_category
};
// 获取同类推荐 (使用 itemid 和 son_category)
this.getSimilarProducts(d.itemid, d.son_category);
this.isLoaded = true;
// 预加载淘口令和领券链接,避免 iOS 异步剪贴板限制
this.fetchTaoWord();
}
}
});
},
fetchTaoWord(callback) {
if (!this.product.taobaoId) return;
// 已获取过则直接回调,避免重复请求,同时保证 iOS 剪贴板在同步路径中
if (this.product.taoCode || this.product.couponUrl) {
if (callback) callback();
return;
}
uni.showLoading({ title: '加载中...', mask: true });
uni.request({
url: 'https://v2.api.haodanku.com/ratesurl',
method: 'POST',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
data: {
itemid: this.product.taobaoId,
title: this.product.title || '',
get_taoword: 1,
pid: 'mm_284380119_1881450385_111415850448',
tb_name: 'michuan2018',
relation_id: this.$store.getters.relationId || '',
apikey: '5417B681C5EA'
},
success: (res) => {
uni.hideLoading();
const body = res.data || {};
if (body.code === 1 && body.data) {
this.product.taoCode = body.data.taoword || '';
this.product.couponUrl = body.data.coupon_click_url || '';
if (callback) callback();
} else {
uni.showToast({ title: body.msg || '获取失败', icon: 'none' });
}
},
fail: () => {
uni.hideLoading();
uni.showToast({ title: '网络错误', icon: 'none' });
}
});
},
getSimilarProducts(itemId, sonCategory) {
uni.request({
url: `https://api.cmspro.haodanku.com/detail/getRecommendItems?itemid=${itemId}&son_category=${sonCategory}&cid=YsWZ21tx`,
success: (res) => {
if (res.data && res.data.code === 200) {
this.similarProducts = res.data.data.slice(0, 10);
}
}
});
},
formatSales(sale) {
if (sale >= 10000) {
return (sale / 10000).toFixed(1) + '万';
}
return sale;
},
goToDetail(id) {
// console.log(id)
uni.navigateTo({
url: `/pages/detail/detail?id=${id}`
});
},
goBack() {
uni.navigateBack();
},
copyTaoWord() {
this.fetchTaoWord(() => {
if (!this.product.taoCode) {
uni.showToast({ title: '暂无口令', icon: 'none' });
return;
}
uni.setClipboardData({
data: this.product.taoCode,
success: () => {
uni.showToast({ title: '淘口令已复制', icon: 'success' });
},
fail: () => {
uni.showToast({ title: '复制失败', icon: 'none' });
}
});
});
},
goBuy() {
this.fetchTaoWord(() => {
const url = this.product.couponUrl;
if (!url) {
uni.showToast({ title: '暂无领券链接', icon: 'none' });
return;
}
uni.setClipboardData({
data: url,
success: () => {
uni.showToast({ title: '链接已复制,请到浏览器打开', icon: 'none' });
}
});
// // #ifdef H5
// window.location.href = url;
// // #endif
// // #ifndef H5
// uni.setClipboardData({
// data: url,
// success: () => {
// uni.showToast({ title: '链接已复制,请到浏览器打开', icon: 'none' });
// }
// });
// // #endif
});
},
handleScroll(e) {
const scrollTop = e.detail.scrollTop;
// 0-150px 完成渐变
let ratio = scrollTop / 150;
if (ratio > 1) ratio = 1;
if (ratio < 0) ratio = 0;
this.navOpacity = ratio;
this.bgOpacity = 0.4 * (1 - ratio);
this.iconColor = ratio > 0.5 ? '#333333' : '#ffffff';
},
goHome() {
uni.redirectTo({
url: '/pages/index/index'
});
},
swiperChange(e) {
this.currentSwiper = e.detail.current;
}
}
}
</script>
<style>
.detail-container {
width: 100%;
height: 100vh;
background-color: #f8f8f8;
position: relative;
}
/* 渐现动画 */
.animate-fade-in {
animation: fadeIn 0.4s ease-out forwards;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10rpx); }
to { opacity: 1; transform: translateY(0); }
}
/* 骨架屏样式 */
.skeleton-wrap {
padding-bottom: 200rpx;
}
.sk-swiper {
width: 100%;
height: 750rpx;
background-color: #eee;
}
.sk-info {
background-color: #fff;
padding: 30rpx;
}
.sk-price {
width: 260rpx;
height: 60rpx;
border-radius: 8rpx;
margin-bottom: 30rpx;
}
.sk-title {
width: 100%;
height: 40rpx;
border-radius: 6rpx;
margin-bottom: 20rpx;
}
.sk-title.sk-short {
width: 60%;
}
.sk-tags {
display: flex;
margin-top: 30rpx;
}
.sk-tag {
width: 120rpx;
height: 32rpx;
margin-right: 20rpx;
border-radius: 4rpx;
}
.sk-coupon {
margin: 20rpx 30rpx;
height: 180rpx;
border-radius: 20rpx;
}
.sk-shop {
margin: 20rpx 30rpx;
height: 160rpx;
border-radius: 20rpx;
}
.sk-detail {
margin-top: 20rpx;
height: 800rpx;
background-color: #fff;
}
.sk-animate {
background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%);
background-size: 400% 100%;
animation: sk-loading 1.4s ease infinite;
}
@keyframes sk-loading {
0% { background-position: 100% 50%; }
100% { background-position: 0 50%; }
}
/* 返回按钮 */
/* 顶部渐变导航栏 */
.fixed-header {
position: fixed;
top: 0;
left: 0;
right: 0;
background-color: #ffffff;
z-index: 150;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
}
.header-content {
height: 88rpx;
display: flex;
align-items: center;
justify-content: center;
}
.header-title {
font-size: 32rpx;
color: #333;
font-weight: bold;
}
.back-btn {
position: fixed;
left: 30rpx;
width: 64rpx;
height: 64rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
z-index: 200;
margin-top: 10rpx;
transition: all 0.2s;
}
.back-icon-box {
width: 20rpx;
height: 20rpx;
border-left: 4rpx solid;
border-bottom: 4rpx solid;
transform: rotate(45deg);
margin-left: 8rpx;
transition: all 0.2s;
}
/* 详情控制条 */
.detail-control-bar {
margin-top: 20rpx;
background-color: #ffffff;
padding: 24rpx 30rpx;
display: flex;
align-items: center;
justify-content: space-between;
border-radius: 20rpx 20rpx 0 0;
}
.control-left {
display: flex;
align-items: center;
}
.red-line {
width: 6rpx;
height: 28rpx;
background-color: #ff416c;
border-radius: 3rpx;
margin-right: 16rpx;
}
.control-title {
font-size: 30rpx;
color: #333;
font-weight: bold;
margin-right: 20rpx;
}
.profit-tag {
font-size: 24rpx;
color: #ff416c;
background-color: rgba(255, 65, 108, 0.1);
padding: 4rpx 12rpx;
border-radius: 8rpx;
}
.control-right {
display: flex;
align-items: center;
}
.expand-text {
font-size: 26rpx;
color: #999;
margin-right: 8rpx;
}
.expand-arrow {
width: 12rpx;
height: 12rpx;
border-right: 2rpx solid #999;
border-bottom: 2rpx solid #999;
transform: rotate(45deg);
transition: transform 0.3s;
}
.expand-arrow.up {
transform: rotate(-135deg);
margin-top: 6rpx;
}
/* 图文详情 */
.detail-images {
background-color: #ffffff;
position: relative;
overflow: hidden;
transition: max-height 0.5s ease;
}
.detail-images.collapsed {
max-height: 1200rpx;
}
.detail-title {
display: none; /* 已被控制条取代 */
}
.detail-img {
width: 100%;
display: block;
}
.expand-mask {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 300rpx;
background: linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-end;
padding-bottom: 40rpx;
z-index: 10;
}
.mask-text {
font-size: 28rpx;
color: #ff416c;
font-weight: bold;
}
.mask-arrow {
width: 16rpx;
height: 16rpx;
border-right: 4rpx solid #ff416c;
border-bottom: 4rpx solid #ff416c;
transform: rotate(45deg);
margin-top: 10rpx;
}
/* 同类推荐推荐 (g-shop-list 1:1 风格) */
.more-like {
margin-top: 20rpx;
background-color: #ffffff;
padding-bottom: 40rpx;
}
.top.g-df-c {
display: flex;
justify-content: center;
padding: 30rpx 0;
}
.recommend-title-img {
width: 320rpx;
}
.list-container {
display: flex;
flex-wrap: wrap;
padding: 0 20rpx;
justify-content: space-between;
}
.g-shop-list {
width: 345rpx;
background-color: #fff;
border-radius: 16rpx;
overflow: hidden;
margin-bottom: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
}
.shop-img image {
width: 345rpx;
height: 345rpx;
}
.shop-box {
padding: 16rpx;
}
.shop-title {
font-size: 26rpx;
color: #333;
line-height: 1.4;
height: 72rpx;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.platform-icon {
width: 28rpx;
height: 28rpx;
vertical-align: middle;
margin-right: 8rpx;
margin-top: -4rpx;
}
.shop-tag {
display: flex;
flex-wrap: wrap;
margin-top: 12rpx;
height: 36rpx;
overflow: hidden;
}
.shop-tag text {
font-size: 20rpx;
color: #ff416c;
background-color: rgba(255, 65, 108, 0.08);
padding: 2rpx 10rpx;
border-radius: 4rpx;
margin-right: 10rpx;
}
.flex-left {
display: flex;
align-items: center;
margin-top: 16rpx;
}
.discount-price {
font-size: 24rpx;
color: #ff416c;
font-weight: bold;
}
.price-num {
font-size: 36rpx;
}
.g-coupon-label {
display: flex;
align-items: center;
margin-left: 12rpx;
border: 1rpx solid #ff416c;
border-radius: 4rpx;
overflow: hidden;
height: 30rpx;
}
.g-coupon-label .g-df-c {
background-color: #ff416c;
color: #fff;
font-size: 20rpx;
padding: 0 6rpx;
height: 100%;
display: flex;
align-items: center;
}
.g-coupon-label text {
color: #ff416c;
font-size: 20rpx;
padding: 0 8rpx;
}
.sales-volume {
font-size: 22rpx;
color: #999;
}
.end-tips {
text-align: center;
font-size: 24rpx;
color: #999;
padding: 40rpx 0;
}
.custom-copyright {
text-align: center;
font-size: 22rpx;
color: #969799;
padding-bottom: 20rpx;
}
.scroll-content {
height: 100%;
}
/* 轮播图 */
.swiper-box {
width: 100%;
height: 750rpx;
position: relative;
}
.main-swiper {
width: 100%;
height: 100%;
}
.swiper-img {
width: 100%;
height: 100%;
}
.swiper-indicator {
position: absolute;
right: 30rpx;
bottom: 30rpx;
background-color: rgba(0, 0, 0, 0.5);
color: #ffffff;
padding: 4rpx 20rpx;
border-radius: 20rpx;
font-size: 24rpx;
}
/* 活动横幅 (1:1 还原) */
.activity-banner {
position: relative;
width: 100%;
overflow: hidden;
}
.banner-img {
width: 100%;
display: block;
}
.banner-time {
position: absolute;
right: 30rpx;
top: 50%;
transform: translateY(-50%);
font-size: 22rpx;
color: rgba(255, 255, 255, 0.9);
font-weight: bold;
letter-spacing: 1rpx;
}
/* 热销榜 */
.hot-sale-bar {
display: flex;
justify-content: space-between;
align-items: center;
background: linear-gradient(to right, #fff1eb, #fbe9e7);
padding: 20rpx 30rpx;
}
.hot-left {
display: flex;
align-items: center;
}
.hot-text {
font-size: 26rpx;
color: #d84315;
margin-left: 10rpx;
font-weight: bold;
}
.hot-divider {
color: #e0e0e0;
font-size: 20rpx;
margin: 0 10rpx;
}
.hot-right {
font-size: 24rpx;
color: #bf360c;
opacity: 0.8;
}
/* 信息区 (1:1 还原) */
.info-section {
background-color: #ffffff;
padding: 30rpx;
margin-bottom: 20rpx;
}
.price-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24rpx;
}
.price-left {
display: flex;
align-items: baseline;
}
.price-label {
font-size: 26rpx;
color: #ff416c;
font-weight: bold;
}
.price-val {
font-size: 52rpx;
color: #ff416c;
font-weight: bold;
margin: 0 8rpx;
}
.price-old {
font-size: 24rpx;
color: #bbb;
text-decoration: line-through;
}
.price-right {
font-size: 26rpx;
color: #333;
}
.sales-red {
color: #ff416c;
font-weight: bold;
}
.title-row {
margin-bottom: 24rpx;
}
.title-content {
display: flex;
align-items: flex-start;
}
.title-platform-icon {
width: 32rpx;
height: 32rpx;
margin-right: 12rpx;
margin-top: 6rpx;
flex-shrink: 0;
}
.title-text {
font-size: 30rpx;
color: #333;
font-weight: bold;
line-height: 44rpx;
}
.tags-row {
display: flex;
flex-wrap: wrap;
}
.tag-capsule {
font-size: 22rpx;
color: #ff416c;
background-color: #fff0f3;
padding: 6rpx 20rpx;
border-radius: 30rpx;
margin-right: 16rpx;
margin-bottom: 10rpx;
}
/* 优惠券 */
.coupon-section {
padding: 0 30rpx;
margin-bottom: 20rpx;
}
.coupon-card {
height: 160rpx;
background: linear-gradient(to right, #ff715a, #ff416c);
border-radius: 16rpx;
display: flex;
position: relative;
overflow: hidden;
}
.coupon-left {
flex: 1;
padding: 30rpx;
display: flex;
flex-direction: column;
justify-content: center;
color: #ffffff;
}
.coupon-amount {
margin-bottom: 10rpx;
}
.amount-val {
font-size: 40rpx;
font-weight: bold;
}
.amount-unit {
font-size: 24rpx;
margin-left: 10rpx;
}
.coupon-time {
font-size: 20rpx;
opacity: 0.9;
}
.coupon-right {
width: 200rpx;
display: flex;
align-items: center;
justify-content: center;
border-left: 2rpx dashed rgba(255, 255, 255, 0.4);
}
.get-btn {
background-color: #ffffff;
color: #ff416c;
font-size: 26rpx;
padding: 10rpx 24rpx;
border-radius: 30rpx;
font-weight: bold;
}
.coupon-circle {
position: absolute;
width: 24rpx;
height: 24rpx;
background-color: #f8f8f8;
border-radius: 50%;
left: auto;
right: 188rpx;
}
.coupon-circle.top {
top: -12rpx;
}
.coupon-circle.bottom {
bottom: -12rpx;
}
/* 品牌与店铺卡片 (1:1 还原) */
.brand-shop-card {
background-color: #ffffff;
margin: 20rpx;
padding: 30rpx;
border-radius: 16rpx;
}
.brand-row, .shop-row {
display: flex;
align-items: flex-start;
}
.brand-row {
margin-bottom: 30rpx;
}
.row-label {
font-size: 26rpx;
color: #999;
width: 80rpx;
flex-shrink: 0;
margin-top: 4rpx;
}
.brand-content {
display: flex;
align-items: center;
}
.brand-logo-img {
width: 40rpx;
height: 40rpx;
margin-right: 16rpx;
}
.brand-name-text {
font-size: 28rpx;
color: #333;
font-weight: bold;
}
.shop-main-content {
flex: 1;
}
.shop-name-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12rpx;
}
.shop-title-box {
display: flex;
align-items: center;
}
.tag-tmall-mini {
background-color: #ff0036;
color: #ffffff;
font-size: 18rpx;
width: 28rpx;
height: 28rpx;
line-height: 28rpx;
text-align: center;
border-radius: 4rpx;
margin-right: 12rpx;
}
.tag-taobao-mini {
background-color: #ff5000;
color: #ffffff;
font-size: 18rpx;
width: 28rpx;
height: 28rpx;
line-height: 28rpx;
text-align: center;
border-radius: 4rpx;
margin-right: 12rpx;
}
.shop-name-text {
font-size: 28rpx;
color: #333;
font-weight: bold;
}
.row-arrow {
font-size: 24rpx;
color: #ccc;
}
.score-detail-row {
display: flex;
}
.score-item {
font-size: 24rpx;
color: #999;
margin-right: 30rpx;
}
.val-red {
color: #ff416c;
margin: 0 4rpx;
}
.up-red {
color: #ff416c;
font-size: 20rpx;
}
/* 粉丝福利购 (1:1 还原) */
.benefit-card {
background-color: #ffffff;
margin: 20rpx;
padding: 30rpx;
border-radius: 16rpx;
}
.benefit-header {
margin-bottom: 24rpx;
}
.benefit-title-box {
display: flex;
align-items: center;
}
.benefit-icon {
width: 36rpx;
height: 36rpx;
margin-right: 16rpx;
flex-shrink: 0;
}
.benefit-title {
font-size: 28rpx;
color: #333;
font-weight: bold;
}
.benefit-content {
background-color: #f7f7f7;
padding: 24rpx;
border-radius: 12rpx;
}
.benefit-text {
font-size: 26rpx;
color: #666;
line-height: 40rpx;
display: block;
}
/* 详情控制条 */
.detail-control-bar {
margin-top: 20rpx;
background-color: #ffffff;
padding: 24rpx 30rpx;
display: flex;
align-items: center;
justify-content: space-between;
border-radius: 20rpx 20rpx 0 0;
}
.control-left {
display: flex;
align-items: center;
}
.red-line {
width: 6rpx;
height: 28rpx;
background-color: #ff416c;
border-radius: 3rpx;
margin-right: 16rpx;
}
.control-title {
font-size: 30rpx;
color: #333;
font-weight: bold;
margin-right: 20rpx;
}
.profit-tag {
font-size: 24rpx;
color: #ff416c;
background-color: rgba(255, 65, 108, 0.1);
padding: 4rpx 12rpx;
border-radius: 8rpx;
}
.control-right {
display: flex;
align-items: center;
}
.expand-text {
font-size: 26rpx;
color: #999;
margin-right: 8rpx;
}
.expand-arrow {
width: 12rpx;
height: 12rpx;
border-right: 2rpx solid #999;
border-bottom: 2rpx solid #999;
transform: rotate(45deg);
transition: transform 0.3s;
}
.expand-arrow.up {
transform: rotate(-135deg);
margin-top: 6rpx;
}
/* 图文详情 */
.detail-images {
background-color: #ffffff;
position: relative;
overflow: hidden;
transition: max-height 0.5s ease;
}
.detail-images.collapsed {
max-height: 0;
}
.detail-img {
width: 100%;
display: block;
}
.expand-mask {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 300rpx;
background: linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-end;
padding-bottom: 40rpx;
z-index: 10;
}
.mask-text {
font-size: 28rpx;
color: #ff416c;
font-weight: bold;
}
.mask-arrow {
width: 16rpx;
height: 16rpx;
border-right: 4rpx solid #ff416c;
border-bottom: 4rpx solid #ff416c;
transform: rotate(45deg);
margin-top: 10rpx;
}
/* 同类推荐推荐 (g-shop-list 1:1 风格) */
.more-like {
margin-top: 20rpx;
background-color: #f8f8f8;
padding-bottom: 40rpx;
}
.top.g-df-c {
display: flex;
justify-content: center;
padding: 30rpx 0;
}
.recommend-title-img {
width: 320rpx;
}
.list-container {
display: flex;
flex-wrap: wrap;
padding: 0 20rpx;
justify-content: space-between;
}
.g-shop-list {
width: 345rpx;
background-color: #fff;
border-radius: 16rpx;
overflow: hidden;
margin-bottom: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05);
}
.shop-img image {
width: 345rpx;
height: 345rpx;
}
.shop-box {
padding: 16rpx;
}
.shop-title {
font-size: 26rpx;
color: #333;
line-height: 1.4;
height: 72rpx;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.platform-icon {
width: 28rpx;
height: 28rpx;
vertical-align: middle;
margin-right: 8rpx;
margin-top: -4rpx;
}
.shop-tag {
display: flex;
flex-wrap: wrap;
margin-top: 12rpx;
height: 36rpx;
overflow: hidden;
}
.shop-tag text {
font-size: 20rpx;
color: #ff416c;
background-color: rgba(255, 65, 108, 0.08);
padding: 2rpx 10rpx;
border-radius: 4rpx;
margin-right: 10rpx;
}
.flex-left {
display: flex;
align-items: center;
margin-top: 16rpx;
}
.discount-price {
font-size: 24rpx;
color: #ff416c;
font-weight: bold;
}
.price-num {
font-size: 36rpx;
}
.g-coupon-label {
display: flex;
align-items: center;
margin-left: 12rpx;
border: 1rpx solid #ff416c;
border-radius: 4rpx;
overflow: hidden;
height: 30rpx;
}
.g-coupon-label .g-df-c {
background-color: #ff416c;
color: #fff;
font-size: 20rpx;
padding: 0 6rpx;
height: 100%;
display: flex;
align-items: center;
}
.g-coupon-label text {
color: #ff416c;
font-size: 20rpx;
padding: 0 8rpx;
}
.sales-volume {
font-size: 22rpx;
color: #999;
}
.end-tips {
text-align: center;
font-size: 24rpx;
color: #999;
padding: 40rpx 0;
}
.custom-copyright {
text-align: center;
font-size: 22rpx;
color: #969799;
padding-bottom: 20rpx;
}
.footer-placeholder {
height: 120rpx;
}
/* 底部栏 */
.bottom-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 100rpx;
background-color: #ffffff;
display: flex;
padding: 10rpx 30rpx calc(10rpx + env(safe-area-inset-bottom));
align-items: center;
border-top: 1rpx solid #eeeeee;
z-index: 100;
}
.bar-left {
display: flex;
margin-right: 20rpx;
}
.bar-btn {
display: flex;
flex-direction: column;
align-items: center;
margin-right: 40rpx;
}
.bar-icon {
font-size: 36rpx;
margin-bottom: 4rpx;
}
.bar-text {
font-size: 20rpx;
color: #666;
}
.bar-right {
flex: 1;
display: flex;
height: 80rpx;
border-radius: 40rpx;
overflow: hidden;
}
.copy-btn {
flex: 1;
/* background-color: #ffbcba; */
background: linear-gradient(to right, #ff715a, #ff416c);
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
font-weight: bold;
}
.buy-btn {
flex: 1;
background: linear-gradient(to right, #ff715a, #ff416c);
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
font-weight: bold;
}
</style>