|
@@ -2,31 +2,30 @@
|
|
|
<uni-popup ref="popup" background-color="#fff" mode="bottom" @change="change">
|
|
|
<view class="s-box padding-sm">
|
|
|
<view class="s-img">
|
|
|
- <image mode="aspectFit" class="wh-full" :src="cardMsg.src"></image>
|
|
|
+ <image mode="aspectFit" class="wh-full"
|
|
|
+ :src="caMsg.img[0].url ? caMsg.img[0].url : cardMsg.imgList[0].url"></image>
|
|
|
</view>
|
|
|
<view class="g-info">
|
|
|
- <view class="s-name">{{cardMsg.goods_name}}</view>
|
|
|
- <view class="s-price">{{cardMsg.goods_price}}</view>
|
|
|
+ <view class="s-name">{{caMsg.skuName ? caMsg.skuName : cardMsg.spuName}}</view>
|
|
|
+ <view class="s-price">{{caMsg.retailPrice ? caMsg.retailPrice : cardMsg.minPrice}}</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
- <uni-section title="规格">
|
|
|
- <view class="spec-box padding-lr-sm">
|
|
|
- <view class="spec-item padding-lr-sm" :class="{'on-spec': spec.selected}" :key="spec.id"
|
|
|
- @click="selectSpec1(spec)" v-for="spec in specs1">{{ spec.name }}</view>
|
|
|
+ <scroll-view style="height: 270px;" scroll-y>
|
|
|
+ <view v-for="(item, index) in specs" :key="index">
|
|
|
+ <uni-section :title="item.name">
|
|
|
+ <view class="spec-box padding-lr-sm">
|
|
|
+ <view class="spec-item padding-lr-sm" v-for="(spe, cindex) in item.values"
|
|
|
+ :class="{'on-spec': spe.selected}" :key="cindex" @click="selectSpec1(item, spe)">
|
|
|
+ {{ spe.label }}
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </uni-section>
|
|
|
</view>
|
|
|
- </uni-section>
|
|
|
- <uni-section title="口味">
|
|
|
- <view class="spec-box padding-lr-sm">
|
|
|
- <view class="spec-item padding-lr-sm" :class="{'on-spec': spec.selected}" :key="spec.id"
|
|
|
- @click="selectSpec2(spec)" v-for="spec in specs2">{{ spec.name }}</view>
|
|
|
- </view>
|
|
|
- </uni-section>
|
|
|
- <uni-section title="购买数量">
|
|
|
- <view class="purchase-num padding-lr-sm">
|
|
|
- <view class="num">剩余562件</view>
|
|
|
- <uni-number-box v-model="vModelValue" @change="changeValue(value)" />
|
|
|
- </view>
|
|
|
- </uni-section>
|
|
|
+ </scroll-view>
|
|
|
+ <view class="purchase-num padding-lr-sm">
|
|
|
+ <uni-section title="购买数量"></uni-section>
|
|
|
+ <uni-number-box v-model="vModelValue" @change="changeValue(value)" />
|
|
|
+ </view>
|
|
|
<view class="btn-box">
|
|
|
<view class="btn reset" @click="toShop">加入购物车</view>
|
|
|
<view class="btn confirm" @click="toBuy">立即购买</view>
|
|
@@ -49,97 +48,105 @@
|
|
|
shopMsg: {
|
|
|
id: '',
|
|
|
spec: '',
|
|
|
- specs: '',
|
|
|
num: ''
|
|
|
},
|
|
|
- specs1: [{
|
|
|
- id: 1,
|
|
|
- name: '规格1',
|
|
|
- selected: false
|
|
|
- },
|
|
|
- {
|
|
|
- id: 2,
|
|
|
- name: '规格2',
|
|
|
- selected: false
|
|
|
- },
|
|
|
- {
|
|
|
- id: 3,
|
|
|
- name: '规格3',
|
|
|
- selected: false
|
|
|
- },
|
|
|
- {
|
|
|
- id: 4,
|
|
|
- name: '规格4',
|
|
|
- selected: false
|
|
|
- },
|
|
|
- {
|
|
|
- id: 5,
|
|
|
- name: '规格5',
|
|
|
- selected: false
|
|
|
- }
|
|
|
- ],
|
|
|
- specs2: [{
|
|
|
- id: 1,
|
|
|
- name: '大份1',
|
|
|
- selected: false
|
|
|
- },
|
|
|
- {
|
|
|
- id: 2,
|
|
|
- name: '大份2',
|
|
|
- selected: false
|
|
|
- },
|
|
|
- {
|
|
|
- id: 3,
|
|
|
- name: '大份3',
|
|
|
- selected: false
|
|
|
- },
|
|
|
- {
|
|
|
- id: 4,
|
|
|
- name: '大份4',
|
|
|
- selected: false
|
|
|
- },
|
|
|
- {
|
|
|
- id: 5,
|
|
|
- name: '大份5',
|
|
|
- selected: false
|
|
|
- }
|
|
|
- ]
|
|
|
+ specs: [], // 总查询数据
|
|
|
+ speL: [],
|
|
|
+ intSkuId: [], // 选择唯一的id
|
|
|
+ caMsg: [], // 根据id查出来的数据
|
|
|
}
|
|
|
},
|
|
|
+ mounted() {
|
|
|
+ console.log('specPopup mounted:', this.cardMsg)
|
|
|
+ },
|
|
|
methods: {
|
|
|
changeValue(e) {
|
|
|
console.log('vModelValue', e)
|
|
|
-
|
|
|
},
|
|
|
change(e) {
|
|
|
if (!e.show) { // 当弹出层关闭时
|
|
|
// 重置规格选择
|
|
|
- this.specs1.forEach(spec => {
|
|
|
- spec.selected = false;
|
|
|
- });
|
|
|
- this.specs2.forEach(spec => {
|
|
|
- spec.selected = false;
|
|
|
- });
|
|
|
-
|
|
|
+ if (this.specs.length > 0) {
|
|
|
+ this.specs.forEach(e => {
|
|
|
+ e.values.forEach(s => {
|
|
|
+ s.selected = false
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+ this.speL = []
|
|
|
// 重置购买数量
|
|
|
this.vModelValue = 1;
|
|
|
}
|
|
|
},
|
|
|
- selectSpec1(item) {
|
|
|
- console.log('点击了规格:', item);
|
|
|
- item.selected = !item.selected;
|
|
|
- this.shopMsg.spec = item.name
|
|
|
- // 在这里添加您的点击处理逻辑
|
|
|
- },
|
|
|
- selectSpec2(item) {
|
|
|
- console.log('点击了大份:', item);
|
|
|
- item.selected = !item.selected;
|
|
|
- this.shopMsg.specs = item.name
|
|
|
- // 在这里添加您的点击处理逻辑
|
|
|
+ async selectSpec1(item, spec) {
|
|
|
+ // 首先,取消选择所有其他选项
|
|
|
+ item.values.forEach(value => {
|
|
|
+ value.selected = false;
|
|
|
+ })
|
|
|
+ // 然后,选择当前点击的选项
|
|
|
+ spec.selected = true;
|
|
|
+ if (spec.selected) {
|
|
|
+ this.speL.push(spec)
|
|
|
+ }
|
|
|
+ console.log('speL', this.speL)
|
|
|
+
|
|
|
+ const seleList = this.speL.filter(item => item.selected == true)
|
|
|
+ // 计算选中规格项的skuIds数组的交集
|
|
|
+ if (seleList.length > 0) {
|
|
|
+ let intersection = seleList[0].skuIds;
|
|
|
+
|
|
|
+ // 遍历数组中的每个对象
|
|
|
+ for (let i = 1; i < seleList.length; i++) {
|
|
|
+ // 使用filter和includes方法找到交集
|
|
|
+ intersection = intersection.filter(skuId => {
|
|
|
+ return seleList[i].skuIds.includes(skuId);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果交集不为空,取第一个元素作为唯一字符串
|
|
|
+ const uniqueString = intersection.length > 0 ? intersection[0] : '';
|
|
|
+
|
|
|
+ // 更新组件中的intSkuId
|
|
|
+ this.intSkuId = uniqueString;
|
|
|
+ } else {
|
|
|
+ // 如果没有选中的规格项,返回空字符串
|
|
|
+ this.intSkuId = '';
|
|
|
+ }
|
|
|
+ console.log('intSkuId', this.intSkuId)
|
|
|
+ // 确定每一个都有选择后发起请求
|
|
|
+ const isSelected = this.specs.every(spec => spec.values.some(value => value.selected))
|
|
|
+ if (isSelected) {
|
|
|
+ // 如果所有规格都至少有一个选项被选中
|
|
|
+ console.log('所有规格都已选择');
|
|
|
+ const res = await this.$request('get', `/item/sku/${this.intSkuId}`)
|
|
|
+ console.log('res================', res.data)
|
|
|
+ this.caMsg = res.data
|
|
|
+ } else {
|
|
|
+ // 否则,打印一个错误信息
|
|
|
+ console.log('还有规格未选择');
|
|
|
+ }
|
|
|
},
|
|
|
- open() {
|
|
|
- console.log('cardMsg', this.cardMsg)
|
|
|
+ async open() {
|
|
|
this.$refs.popup.open('bottom')
|
|
|
+ console.log('cardMsg', this.cardMsg)
|
|
|
+ const spuId = this.cardMsg.spuId
|
|
|
+ const res = await this.$request('get', `/item/sku/queryPropMapping?spuId=${spuId}`)
|
|
|
+ console.log('res.data', res.data)
|
|
|
+ this.specs = res.data.filter(item => item.values && item.values.length > 0);
|
|
|
+ // this.specs.forEach(item => Object.assign(item, {
|
|
|
+ // selected: false
|
|
|
+ // }))
|
|
|
+ this.specs.forEach(item => {
|
|
|
+ Object.assign(item, {
|
|
|
+ values: item.values.map(value => ({
|
|
|
+ ...value,
|
|
|
+ ids: item.id,
|
|
|
+ selected: false
|
|
|
+ }))
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ console.log('this.spec', this.specs)
|
|
|
},
|
|
|
toShop() {
|
|
|
this.shopMsg.id = this.cardMsg.id
|
|
@@ -248,10 +255,6 @@
|
|
|
justify-content: space-between;
|
|
|
align-items: center;
|
|
|
border-bottom: solid 1px #EEE;
|
|
|
- padding-bottom: 30upx;
|
|
|
-
|
|
|
- .num {
|
|
|
- font-size: 12px;
|
|
|
- }
|
|
|
+ padding-bottom: 20upx;
|
|
|
}
|
|
|
</style>
|