| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495 | <template>	<view class="detail">		<view class="part1">			<!-- 轮播图 -->			<view class="uni-margin-wrap">				<swiper class="swiper" circular :indicator-dots="indicatorDots" :autoplay="autoplay"					:interval="interval" :duration="duration">					<swiper-item v-for="(item,index) in bannerList" :key="index">						<image :src="item" mode="" class="pictures"></image>					</swiper-item>				</swiper>			</view>			<van-divider />			<!-- 商品描述信息 -->			<view class="main">				<view class="left">					<view class="title">						{{prodList.prodName}}					</view>					<view class="discribe">						{{prodList.brief}}					</view>					<view class="price">						¥<text>{{prodList.price}}</text>					</view>				</view>				<view class="right">					<van-icon name="like-o" v-if="isCollect" size="24" @click="addCollect" />					<van-icon name="like" v-if="!isCollect" size="24" @click="addCollect" />					<text>收藏</text>				</view>			</view>		</view>		<van-divider hairline customStyle="border:12px solid #eee;" />		<!-- 已选 -->		<view class="choose" @click="showDialog">			<view class="left">				已选<text>{{defaultStr.skuName}}</text>			</view>			<view class="right">				...			</view>		</view>		<van-divider hairline customStyle="border:12px solid #eee;" />		<!-- 好评部分 -->		<van-cell is-link value="共0条">			<template #title>				<view class="van-cell-text">评价:好评{{evaluate.positiveRating}}%</view>			</template>		</van-cell>		<view class="evaluate">			<van-tag type="warning">全部:{{evaluate.number}}</van-tag>			<van-tag type="warning">好评:{{evaluate.praiseNumber}}</van-tag>			<van-tag type="warning">中评:{{evaluate.secondaryNumber}}</van-tag>			<van-tag type="warning">差评:{{evaluate.negativeNumber}}</van-tag>			<van-tag type="warning">有图:{{evaluate.picNumber}}</van-tag>		</view>		<!-- 内容页 -->		<view v-html="formatHtml(prodList.content)"></view>		<!-- 商品导航 -->		<van-goods-action>			<van-goods-action-icon icon="cart-o" text="购物车" @click="goToShop" />			<van-goods-action-icon icon="shop-o" text="店铺" />			<van-goods-action-button text="立即购买" @click="onClickButton" />		</van-goods-action>		<!-- 型号选择 -->		<van-action-sheet @click-overlay="submitBtn" @close="submitBtn" :show="show" title="选择产品类别">			<view class="choise" v-if="tagList[0].label != ''">				<view class="box" v-for="(item,index) in tagList" :key="index">					<view class="tit">						{{item.label}}					</view>					<view class="main">						<text class="size" v-for="(item1,index1) in item.option" :key="index1"							:class="{selected:selectTag[item.label] === item1 ? true : false}"							@click="selectTag1(item.label,item1)">							{{item1}}						</text>					</view>				</view>			</view>			<van-button :disabled="defaultStr.skuName ? false : true" type="danger" @click="submitBtn" square class="btn">确定</van-button>		</van-action-sheet>		<!-- 立即购买 -->		<van-action-sheet @click-overlay="cancelShow" :show="isshow">			<view class="cardMain">				<van-card :num="confirm.orderItem.prodCount" :price="defaultStr.price ? defaultStr.price : prodList.price" :desc="prodList.brief"					:title="defaultStr.skuName ? defaultStr.skuName : prodList.prodName"					:thumb="defaultStr.pic? defaultStr.pic : prodList.pic">					<template slot="footer">						<van-stepper :value="confirm.orderItem.prodCount" @change="onChange" />					</template>				</van-card>			</view>			<view class="choise news" v-if="tagList[0].label != ''">				<view class="box" v-for="(item,index) in tagList" :key="index">					<view class="tit">						{{item.label}}					</view>					<view class="newsMain">						<text class="size" v-for="(item1,index1) in item.option" :key="index1"							:class="{selected:selectTag[item.label] === item1 ? true : false}"							@click="selectTag1(item.label,item1)">							{{item1}}						</text>					</view>				</view>			</view>			<view class="footerBtn">				<view class="btn1" @click="addShop">加入购物车</view>				<view class="btn2">立即购买</view>			</view>		</van-action-sheet>	</view></template><script>	import {		prodInfo,		prodCommData,		confirmWay,		changeItem	} from '@/api/detail.js'	import {		formatHtml	} from "@/utils/util.js";	export default {		data() {			return {				ids: "",				indicatorDots: true,				autoplay: true,				interval: 2000,				duration: 500,				prodList: [], //商品信息数组				bannerList: [], //轮播数组				isCollect: true, //控制收藏显示				defalutList: [], //默认展示内容的数组				evaluate: [], //好评部分				show: false, //控制型号选择显示隐藏				typeList: [], //存储型号列表				tagList: [], //渲染型号列表				selectTag: {}, //选中的值				defaultStr: {}, //存放已选字段				isshow: false, //购买弹框				// 商品结单字段				confirm: {					basketIds: [						0					],					orderItem: {						prodId: 0,						skuId: 0,						prodCount: 1,						shopId: 0,						distributionCardNo: ""					},					addrId: 0,					userChangeCoupon: 0,					couponIds: [						0					]				},				// 购物车字段				shopList:{					basketId: 0,					prodId: 0,					skuId: 0,					shopId: 0,					count: 0,					distributionCardNo: ""				}				}		},		onLoad(options) {			this.ids = options.id;			// 获得详情页的商品信息			this.init();		},		methods: {			init() {				// 商品信息				prodInfo({					prodId: this.ids				}).then(res => {					this.prodList = res.data;					this.bannerList = this.prodList.imgs.split(',');					this.defalutList = res.data.skuList;					var popObject = {};					var defaultArr = [];					for (var i = 0; i < this.defalutList.length; i++) {						this.defaultStr = this.defalutList[0];						this.typeList.push(this.defalutList[i].properties)					}					for (var i = 0; i < this.typeList.length; i++) {						var popStr = this.typeList[i].split(";");						if (defaultArr.length == 0) {							defaultArr = popStr;						}						for (var j = 0; j < popStr.length; j++) {							var valueArr = popStr[j];							var valueStr = valueArr.split(":");							if (!popObject[valueStr[0]]) {								popObject[valueStr[0]] = new Set()							}							popObject[valueStr[0]].add(valueStr[1])							this.tagList = Object.entries(popObject).map(([key, value]) => {								return {									label: key,									option: Array.from(value).map(item => {										return item									})								}							});							console.log(this.tagList,'标签')							for (let x = defaultArr.length - 1; x >= 0; x--) {								let newStr = defaultArr[x];								let newArr = newStr.split(":");								this.$set(this.selectTag, newArr[0], newArr[1])							}						}					}				}).catch(err => {					console.log(err, '失败')				})				// 好评信息				prodCommData({					prodId: this.ids				}).then(res => {					this.evaluate = res.data;				}).catch(err => {					console.log(err, '失败')				})			},			// 控制收藏显示			addCollect() {				this.isCollect = !this.isCollect;			},			formatHtml(t) {				return formatHtml(t)			},			// 展示型号弹框			showDialog() {				this.show = true;			},			// 选中事件			selectTag1(popTitle, popValue) {				this.$set(this.selectTag, popTitle, popValue)				let str = "";				for (let item in this.selectTag) {					str = item + ":" + this.selectTag[item] + ";" + str;				}				let str1 = str.substring(0, str.length - 1)				for (var i = 0; i < this.defalutList.length; i++) {					if (this.defalutList[i].properties === str1) {						this.defaultStr = this.defalutList[i];						return;					}				}			},			//确定			submitBtn() {				console.log("执行")				this.show = false;			},			// 取消立即购买弹框			cancelShow() {				this.isshow = false;			},			// 立即购买			onClickButton() {				console.log(this.defalutList,'defalutList')				console.log(this.defaultStr,'defaultStr')				console.log(this.typeList,'typeList')				console.log(this.tagList,'tagList')				console.log(this.prodList,'prodList')				this.isshow = true;			},			// 修改商品中弹框数量			onChange(event) {				this.confirm.orderItem.prodCount = event.detail;			},			// 去购物车			goToShop() {				uni.switchTab({					url:"/pages/shop/shop"				})			},			// 加入购物车			addShop() {				this.shopList.basketId = 0;				this.shopList.prodId = this.prodList.prodId;				this.shopList.skuId = this.defaultStr.skuId;				this.shopList.shopId = this.prodList.shopId;				this.shopList.count = this.confirm.orderItem.prodCount;				console.log(this.shopList,'传参')				changeItem(this.shopList).then(res => {					console.log(res,'成功')					uni.showToast({						title:"添加成功",						icon:"success",						duration:2000					})					this.isshow = false;				}).catch(err => {					console.log(err,'失败')				})			}		}	}</script><style scoped lang='scss'>	.uni-margin-wrap {		width: 690rpx;		width: 100%;	}	.swiper {		height: 700rpx;	}	.swiper-item {		display: block;		height: 700rpx;		line-height: 700rpx;		text-align: center;	}	.pictures {		width: 100%;		height: 700rpx;	}	.main {		width: 96%;		height: 200rpx;		display: flex;		margin: 0 auto;		justify-content: space-between;		.left {			.title {				font-size: 38rpx;				font-weight: bold;			}			.discribe {				font-size: 27rpx;				margin-top: 10rpx;			}			.price {				font-size: 24rpx;				margin-top: 10rpx;				color: red;				text {					font-size: 38rpx;					font-weight: bold;				}			}		}		.right {			display: flex;			align-items: center;			width: 120rpx;			justify-content: space-around;			text {				font-size: 38rpx;			}		}	}	.choose {		width: 100%;		height: 100rpx;		display: flex;		justify-content: space-between;		align-items: center;		.left {			margin-left: 15rpx;			text {				font-size: 38rpx;				font-weight: bold;			}		}		.right {			margin-right: 15rpx;		}	}	.evaluate {		width: 100%;		height: 100rpx;		display: flex;		justify-content: space-around;		align-items: center;	}	::v-deep .van-tag {		color: red;		height: 60rpx;	}	.choise {		height: 550rpx;		.box {			width: 92%;			margin: 0 auto;			.tit {				font-size: 40rpx;			}			.main {				display: flex;				justify-content: space-around;				align-items: center;				height: 172rpx;				.size {					padding: 19rpx;					color: #f00;					border: 1px solid #f00;					height: 30rpx;					text-align: center;					line-height: 30rpx;				}			}		}	}	.btn {		::v-deep .van-button--normal {			width: 100%;			height: 100rpx;		}	}	.selected {		color: #fff !important;		background: #f00 !important;	}	.news {		height: 320rpx;	}	.footerBtn {		width: 90%;		height: 80rpx;		display: flex;		margin: 30rpx auto;		text-align: center;		line-height: 80rpx;		.btn1 {			flex: 1;			height: 100%;			color: #fff;			background: #595959;		}		.btn2 {			flex: 1;			height: 100%;			color: #fff;			background: #ff0000;		}	}		.newsMain {		display: flex;		justify-content: space-around;		align-items: center;		height: 100rpx;			.size {			padding: 19rpx;			color: #f00;			border: 1px solid #f00;			height: 30rpx;			text-align: center;			line-height: 30rpx;		}	}</style>
 |