Task:点击购物车图标加入购物车
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<view>
|
<view>
|
||||||
<view class="product-window" :class="attr.cartAttr === true ? 'on' : ''">
|
<view class="product-window" :class="attr.cartAttr === true ? 'on' : ''" :style="{paddingBottom: paddingBottom}">
|
||||||
<view class="textpic acea-row row-between-wrapper">
|
<view class="textpic acea-row row-between-wrapper">
|
||||||
<view class="pictrue" @click="previewImg(attrObj.productSelect.image)">
|
<view class="pictrue" @click="previewImg(attrObj.productSelect.image)">
|
||||||
<image :src="attrObj.productSelect.image" class="image" />
|
<image :src="attrObj.productSelect.image" class="image" />
|
||||||
@@ -59,6 +59,14 @@
|
|||||||
>+</view>
|
>+</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<view class="v12-px-2 v12-mt-3" v-if="showOk">
|
||||||
|
<u-button
|
||||||
|
shape="circle"
|
||||||
|
color="#C52733"
|
||||||
|
@click="$emit('ok')"
|
||||||
|
:disabled="(attr.productSelect.stock === 0 && attr.cartAttr)"
|
||||||
|
>加入购物车</u-button>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="mask" @touchmove.prevent :hidden="attr.cartAttr === false" @click="closeAttr"></view>
|
<view class="mask" @touchmove.prevent :hidden="attr.cartAttr === false" @click="closeAttr"></view>
|
||||||
</view>
|
</view>
|
||||||
@@ -67,6 +75,14 @@
|
|||||||
export default {
|
export default {
|
||||||
name: "ProductWindow",
|
name: "ProductWindow",
|
||||||
props: {
|
props: {
|
||||||
|
paddingBottom: {
|
||||||
|
type: String,
|
||||||
|
default: '140rpx'
|
||||||
|
},
|
||||||
|
showOk: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
attr: {
|
attr: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => {
|
default: () => {
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
<view class="price">
|
<view class="price">
|
||||||
<text class="price-txt price-red">¥{{ item[priceKey] }}</text>
|
<text class="price-txt price-red">¥{{ item[priceKey] }}</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="btn">
|
<view class="btn" @click.stop="$emit('add', item)">
|
||||||
<image
|
<image
|
||||||
:src="webUrl + '/home/icon-cart.png'"
|
:src="webUrl + '/home/icon-cart.png'"
|
||||||
class="img"
|
class="img"
|
||||||
|
|||||||
@@ -0,0 +1,376 @@
|
|||||||
|
import {
|
||||||
|
getCartCount,
|
||||||
|
getProductCode,
|
||||||
|
getProductDetail,
|
||||||
|
postCartAdd,
|
||||||
|
getProductSkuBySelected
|
||||||
|
} from '@/api/store'
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isWenwan: 0,
|
||||||
|
qualifications: [],
|
||||||
|
source: '',
|
||||||
|
isOpen: false,
|
||||||
|
attrTxt: '',
|
||||||
|
attrValue: '',
|
||||||
|
id: null,
|
||||||
|
productValueArr: [],
|
||||||
|
attr: {
|
||||||
|
cartAttr: false,
|
||||||
|
cart_num: 1,
|
||||||
|
defaultSku: [],
|
||||||
|
defaultSkuIndex: [],
|
||||||
|
productAttr: [],
|
||||||
|
productSelect: {
|
||||||
|
cart_num: 1,
|
||||||
|
earnPoints: 0,
|
||||||
|
image: '',
|
||||||
|
otPrice: 0,
|
||||||
|
price: 0,
|
||||||
|
stock: 0,
|
||||||
|
store_name: '',
|
||||||
|
unique: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cart_num: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getSkuActiveStatus(selectedSku) {
|
||||||
|
getProductSkuBySelected({ id: this.id, selectedSku }).then(res => {
|
||||||
|
const { success, data } = res
|
||||||
|
if (success) {
|
||||||
|
for (const key in data) {
|
||||||
|
if (data[key]) {
|
||||||
|
this.attr.productAttr.map(item => {
|
||||||
|
if (item.attrName === key) {
|
||||||
|
item.attrValue.map(subItem => {
|
||||||
|
data[key].map(dataItem => {
|
||||||
|
if (dataItem.sku === subItem.attr) {
|
||||||
|
subItem.canUsed = dataItem.canUsed
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(this.$refs);
|
||||||
|
this.$refs.attrWindow.reRender(this.attr)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
productCon() {
|
||||||
|
getProductDetail(this.id).then(res => {
|
||||||
|
const { data } = res
|
||||||
|
this.storeInfo = {...data.storeInfo}
|
||||||
|
if(data.storeInfo.stock === 0) {
|
||||||
|
uni.showToast({
|
||||||
|
title: "产品库存不足,请选择其他商品",
|
||||||
|
icon: "none",
|
||||||
|
duration: 5000
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.isWenwan = data.isWenwan
|
||||||
|
this.qualifications = data.qualifications || []
|
||||||
|
// 给 attr 赋值,将请求回来的规格赋值给 attr
|
||||||
|
if (this.source !== 'pre' && this.source !== 'day' && this.source !== 'kill' && this.source !== 'spe') {
|
||||||
|
// this.$set(this.attr, 'productAttr', data.productAttr)
|
||||||
|
this.attr.productAttr = data.productAttr || []
|
||||||
|
this.productValueArr = []
|
||||||
|
for (const key in data.productValue) {
|
||||||
|
this.productValueArr.push({
|
||||||
|
attrItemkey: key,
|
||||||
|
...data.productValue[key]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 初始化认为所有的规格都是可以选的
|
||||||
|
this.attr.productAttr.map(item => {
|
||||||
|
item.attrValue.map(subItem => {
|
||||||
|
subItem.canUsed = true
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.attr.defaultSku = data.defaultSku
|
||||||
|
this.attr.defaultSkuIndex = data.defaultSkuIndex
|
||||||
|
this.DefaultSelect()
|
||||||
|
// 是否单一规格
|
||||||
|
const onlyOne = Object.keys(data.productValue).length === 1
|
||||||
|
|
||||||
|
if(onlyOne) {
|
||||||
|
this.handleOk()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.attr.cartAttr = !this.isOpen ? true : false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getAttrItemData(attr) {
|
||||||
|
let result = {}
|
||||||
|
this.productValueArr.map(item => {
|
||||||
|
if (item.attrItemkey === attr) {
|
||||||
|
result = item
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return result
|
||||||
|
},
|
||||||
|
// 默认选中属性
|
||||||
|
DefaultSelect() {
|
||||||
|
const productAttr = this.attr.productAttr
|
||||||
|
const productAttrLength = productAttr.length
|
||||||
|
this.attr.productAttr.map((item, index) => {
|
||||||
|
item.attrValue.map((subItem, subIndex) => {
|
||||||
|
if (this.attr.defaultSkuIndex[index] === subIndex) {
|
||||||
|
subItem.check = true
|
||||||
|
} else {
|
||||||
|
subItem.check = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
const skuKey = (this.attr.defaultSku || []).join(',')
|
||||||
|
if (!skuKey) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const productSelect = this.getAttrItemData(skuKey)
|
||||||
|
this.attrValue = skuKey
|
||||||
|
this.attrTxt = '已选择'
|
||||||
|
if (productSelect && productAttrLength) {
|
||||||
|
// this.$set(
|
||||||
|
// this.attr.productSelect,
|
||||||
|
// 'store_name',
|
||||||
|
// this.storeInfo.storeName
|
||||||
|
// )
|
||||||
|
// this.$set(this.attr.productSelect, 'image', productSelect.image)
|
||||||
|
// this.$set(this.attr.productSelect, 'price', productSelect.price)
|
||||||
|
// this.$set(this.attr.productSelect, 'otPrice', productSelect.otPrice)
|
||||||
|
// this.$set(this.attr.productSelect, 'stock', productSelect.stock)
|
||||||
|
// this.$set(this.attr.productSelect, 'unique', productSelect.unique)
|
||||||
|
// this.$set(this.attr.productSelect, 'earnPoints', productSelect.earnPoints)
|
||||||
|
// this.$set(this.attr.productSelect, 'cart_num', 1)
|
||||||
|
// this.$set(this, 'attrValue', value.sort().join(',')) // 作废
|
||||||
|
// this.$set(this, 'attrValue', skuKey)
|
||||||
|
// this.$set(this, 'attrTxt', '已选择')
|
||||||
|
this.attr.productSelect = {
|
||||||
|
image: productSelect.image,
|
||||||
|
price: productSelect.price,
|
||||||
|
otPrice: productSelect.otPrice,
|
||||||
|
stock: productSelect.stock,
|
||||||
|
earnPoints: productSelect.earnPoints,
|
||||||
|
unique: productSelect.unique,
|
||||||
|
store_name: this.storeInfo.storeName,
|
||||||
|
cart_num: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getSkuActiveStatus(skuKey)
|
||||||
|
} else if (!productSelect && productAttrLength) {
|
||||||
|
// this.$set(
|
||||||
|
// this.attr.productSelect,
|
||||||
|
// 'store_name',
|
||||||
|
// this.storeInfo.storeName
|
||||||
|
// )
|
||||||
|
// this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
|
||||||
|
// this.$set(this.attr.productSelect, 'price', this.storeInfo.price)
|
||||||
|
// this.$set(this.attr.productSelect, 'otPrice', this.storeInfo.otPrice)
|
||||||
|
// this.$set(this.attr.productSelect, 'stock', 0)
|
||||||
|
// this.$set(this.attr.productSelect, 'earnPoints', 0)
|
||||||
|
// this.$set(this.attr.productSelect, 'unique', '')
|
||||||
|
// this.$set(this.attr.productSelect, 'cart_num', 0)
|
||||||
|
// this.$set(this, 'attrValue', '')
|
||||||
|
// this.$set(this, 'attrTxt', '请选择')
|
||||||
|
this.attr.productSelect = {
|
||||||
|
image: this.storeInfo.image,
|
||||||
|
price: this.storeInfo.price,
|
||||||
|
otPrice: this.storeInfo.otPrice,
|
||||||
|
stock: 0,
|
||||||
|
earnPoints: 0,
|
||||||
|
unique: '',
|
||||||
|
store_name: this.storeInfo.storeName,
|
||||||
|
cart_num: 1
|
||||||
|
}
|
||||||
|
} else if (!productSelect && !productAttrLength) {
|
||||||
|
// this.$set(
|
||||||
|
// this.attr.productSelect,
|
||||||
|
// 'store_name',
|
||||||
|
// this.storeInfo.storeName
|
||||||
|
// )
|
||||||
|
// this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
|
||||||
|
// this.$set(this.attr.productSelect, 'price', this.storeInfo.price)
|
||||||
|
// this.$set(this.attr.productSelect, 'otPrice', this.storeInfo.otPrice)
|
||||||
|
// this.$set(this.attr.productSelect, 'stock', this.storeInfo.stock)
|
||||||
|
// this.$set(this.attr.productSelect, 'earnPoints', 0)
|
||||||
|
// this.$set(
|
||||||
|
// this.attr.productSelect,
|
||||||
|
// 'unique',
|
||||||
|
// this.storeInfo.unique || ''
|
||||||
|
// )
|
||||||
|
// this.$set(this.attr.productSelect, 'cart_num', 1)
|
||||||
|
this.attr.productSelect = {
|
||||||
|
image: this.storeInfo.image,
|
||||||
|
price: this.storeInfo.price,
|
||||||
|
otPrice: this.storeInfo.otPrice,
|
||||||
|
stock: this.storeInfo.stock,
|
||||||
|
earnPoints: 0,
|
||||||
|
unique: this.storeInfo.unique || '',
|
||||||
|
store_name: this.storeInfo.storeName,
|
||||||
|
cart_num: 1
|
||||||
|
}
|
||||||
|
// this.$set(this, 'attrValue', '')
|
||||||
|
// this.$set(this, 'attrTxt', '请选择')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 点击加入购物车按钮
|
||||||
|
addToCart(item, id = 'id') {
|
||||||
|
console.log(item, 'addToCart --------- item');
|
||||||
|
this.id = item[id]
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.productCon()
|
||||||
|
})// if(this.attr.cartAttr && !this.isOpen){
|
||||||
|
// return this.isOpen = true
|
||||||
|
// }
|
||||||
|
console.log(this.$refs.attrWindow, '--222--');
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
handleOk() {
|
||||||
|
const productSelect = this.getAttrItemData(this.attrValue)
|
||||||
|
// 如果有属性,没有选择,提示用户选择
|
||||||
|
const hasNo = (this.attr.productAttr.length && productSelect === undefined && this.isOpen) || productSelect.stock === 0
|
||||||
|
if (hasNo) {
|
||||||
|
uni.showToast({
|
||||||
|
title: "产品库存不足,请选择其他商品",
|
||||||
|
icon: "none",
|
||||||
|
duration: 5000
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const q = {
|
||||||
|
productId: this.id,
|
||||||
|
cartNum: this.attr.productSelect.cart_num,
|
||||||
|
new: 0,
|
||||||
|
uniqueId: this.attr.productSelect !== undefined ? this.attr.productSelect.unique : ''
|
||||||
|
}
|
||||||
|
postCartAdd(q).then(res => {
|
||||||
|
this.isOpen = false
|
||||||
|
this.attr.cartAttr = false
|
||||||
|
uni.showToast({
|
||||||
|
title: "添加购物车成功",
|
||||||
|
icon: "none",
|
||||||
|
duration: 2000
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ChangeCartNum(changeValue) {
|
||||||
|
// changeValue:是否 加|减
|
||||||
|
// 获取当前变动属性
|
||||||
|
const productSelect = this.getAttrItemData(this.attrValue)
|
||||||
|
// 如果没有属性,赋值给商品默认库存
|
||||||
|
if (productSelect === undefined && !this.attr.productAttr.length) {
|
||||||
|
productSelect = this.attr.productSelect
|
||||||
|
}
|
||||||
|
// 无属性值即库存为0;不存在加减
|
||||||
|
if (productSelect === undefined) return
|
||||||
|
let stock = productSelect.stock || 0
|
||||||
|
let num = this.attr.productSelect
|
||||||
|
if (changeValue) {
|
||||||
|
num.cart_num++
|
||||||
|
if (num.cart_num > stock) {
|
||||||
|
if(stock < 1) {
|
||||||
|
this.$set(this.attr.productSelect, 'cart_num', 1)
|
||||||
|
this.$set(this, 'cart_num', 1)
|
||||||
|
} else {
|
||||||
|
this.$set(this.attr.productSelect, 'cart_num', stock)
|
||||||
|
this.$set(this, 'cart_num', stock)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (num.cart_num < 1) {
|
||||||
|
this.$set(this.attr.productSelect, 'cart_num', 1)
|
||||||
|
this.$set(this, 'cart_num', 1)
|
||||||
|
} else {
|
||||||
|
this.$set(this.attr.productSelect, 'cart_num', num.cart_num)
|
||||||
|
this.$set(this, 'cart_num', num.cart_num)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
num.cart_num--
|
||||||
|
if (num.cart_num < 1) {
|
||||||
|
this.$set(this.attr.productSelect, 'cart_num', 1)
|
||||||
|
this.$set(this, 'cart_num', 1)
|
||||||
|
} else {
|
||||||
|
this.$set(this.attr.productSelect, 'cart_num', num.cart_num)
|
||||||
|
this.$set(this, 'cart_num', num.cart_num)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 关闭属性
|
||||||
|
changeattr(msg) {
|
||||||
|
// 修改了规格
|
||||||
|
this.attr.cartAttr = msg
|
||||||
|
this.$set(this.attr.productSelect, 'cart_num', 1)
|
||||||
|
this.isOpen = false
|
||||||
|
},
|
||||||
|
// 打开属性插件
|
||||||
|
selecAttrTap() {
|
||||||
|
this.attr.cartAttr = true
|
||||||
|
this.isOpen = true
|
||||||
|
},
|
||||||
|
ChangeAttr(res) {
|
||||||
|
const { index, subIndex, value } = res
|
||||||
|
// 修改了规格
|
||||||
|
const productSelect = this.getAttrItemData(value)
|
||||||
|
if (productSelect) {
|
||||||
|
this.attr.productAttr[index].attrValue.map((subItem, subIdx) => {
|
||||||
|
subItem.check= false
|
||||||
|
if (subIndex === subIdx) {
|
||||||
|
subItem.check = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.$set(this.attr.productSelect, 'image', productSelect.image)
|
||||||
|
this.$set(this.attr.productSelect, 'price', productSelect.price)
|
||||||
|
this.$set(this.attr.productSelect, 'otPrice', productSelect.otPrice)
|
||||||
|
this.$set(this.attr.productSelect, 'stock', productSelect.stock)
|
||||||
|
this.$set(this.attr.productSelect, 'unique', productSelect.unique)
|
||||||
|
this.$set(this.attr.productSelect, 'earnPoints', productSelect.earnPoints)
|
||||||
|
this.$set(this.attr.productSelect, 'cart_num', 1)
|
||||||
|
this.$set(this, 'attrValue', value)
|
||||||
|
this.$set(this, 'attrTxt', '已选择')
|
||||||
|
this.getSkuActiveStatus(value)
|
||||||
|
} else {
|
||||||
|
this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
|
||||||
|
this.$set(this.attr.productSelect, 'price', this.storeInfo.price)
|
||||||
|
this.$set(this.attr.productSelect, 'otPrice', this.storeInfo.otPrice)
|
||||||
|
this.$set(this.attr.productSelect, 'stock', 0)
|
||||||
|
this.$set(this.attr.productSelect, 'unique', '')
|
||||||
|
this.$set(this.attr.productSelect, 'earnPoints', 0)
|
||||||
|
this.$set(this.attr.productSelect, 'cart_num', 0)
|
||||||
|
this.$set(this, 'attrValue', '')
|
||||||
|
this.$set(this, 'attrTxt', '请选择')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
changeFun(opt) {
|
||||||
|
if (typeof opt !== 'object') opt = {}
|
||||||
|
let action = opt.action || ''
|
||||||
|
let value = opt.value === undefined ? '' : opt.value
|
||||||
|
this.cart_num = 1
|
||||||
|
this[action] && this[action](value)
|
||||||
|
},
|
||||||
|
// queryCartCount (isAnima) {
|
||||||
|
// const isLogin = this.isLogin
|
||||||
|
// if (isLogin) {
|
||||||
|
// getCartCount({
|
||||||
|
// numType: 0
|
||||||
|
// }).then(res => {
|
||||||
|
// this.CartCount = res.data.count
|
||||||
|
// //加入购物车后重置属性
|
||||||
|
// if (isAnima) {
|
||||||
|
// this.animated = true
|
||||||
|
// setTimeout(function () {
|
||||||
|
// this.animated = false
|
||||||
|
// }, 500)
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,6 +21,7 @@
|
|||||||
<view class="flex jc-between ai-center">
|
<view class="flex jc-between ai-center">
|
||||||
<text class="price">¥{{ item.price }}</text>
|
<text class="price">¥{{ item.price }}</text>
|
||||||
<image
|
<image
|
||||||
|
@click.stop="$emit('add', item)"
|
||||||
:src="webUrl + '/home/icon-cart.png'"
|
:src="webUrl + '/home/icon-cart.png'"
|
||||||
class="btn"
|
class="btn"
|
||||||
/>
|
/>
|
||||||
|
|||||||
+16
-2
@@ -248,6 +248,7 @@
|
|||||||
v-else
|
v-else
|
||||||
:item="item"
|
:item="item"
|
||||||
@view="goGoodsCon(item)"
|
@view="goGoodsCon(item)"
|
||||||
|
@add="addToCart(item)"
|
||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -284,6 +285,7 @@
|
|||||||
v-else
|
v-else
|
||||||
:item="item"
|
:item="item"
|
||||||
@view="goGoodsCon(item)"
|
@view="goGoodsCon(item)"
|
||||||
|
@add="addToCart(item)"
|
||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -323,6 +325,15 @@
|
|||||||
@click="setTopHandle"
|
@click="setTopHandle"
|
||||||
/>
|
/>
|
||||||
</u-back-top>
|
</u-back-top>
|
||||||
|
<ProductWindow
|
||||||
|
ref="attrWindow"
|
||||||
|
:attr="attr"
|
||||||
|
:cartNum="cart_num"
|
||||||
|
:showOk="true"
|
||||||
|
@changeFun="changeFun"
|
||||||
|
@ok="handleOk"
|
||||||
|
paddingBottom="200rpx"
|
||||||
|
/>
|
||||||
<xdd-tabbar :curr-index="0" />
|
<xdd-tabbar :curr-index="0" />
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@@ -334,6 +345,8 @@ import { getCouponReceive } from '@/api/user'
|
|||||||
import { getHomeData, getShareImage } from '@/api/public'
|
import { getHomeData, getShareImage } from '@/api/public'
|
||||||
import { sharpBannar } from '@/api/goods'
|
import { sharpBannar } from '@/api/goods'
|
||||||
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
||||||
|
import ProductWindow from '@/components/ProductWindow'
|
||||||
|
import goCartMixin from '@/mixins/goCartMixins'
|
||||||
import {
|
import {
|
||||||
getCurAddress,
|
getCurAddress,
|
||||||
getLocationPromise,
|
getLocationPromise,
|
||||||
@@ -344,9 +357,10 @@ export default {
|
|||||||
name: 'IndexPage',
|
name: 'IndexPage',
|
||||||
components: {
|
components: {
|
||||||
XddTabbar,
|
XddTabbar,
|
||||||
XddProductItem
|
XddProductItem,
|
||||||
|
ProductWindow
|
||||||
},
|
},
|
||||||
mixins: [pageListenMixins],
|
mixins: [pageListenMixins, goCartMixin],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
|||||||
+14
-3
@@ -56,7 +56,7 @@
|
|||||||
<information :landmarkDataId="landmarkDataId"></information>
|
<information :landmarkDataId="landmarkDataId"></information>
|
||||||
</view>
|
</view>
|
||||||
<view v-if="actived === 4">
|
<view v-if="actived === 4">
|
||||||
<goods :goods="goods" v-if="goods.length > 0"></goods>
|
<goods :goods="goods" v-if="goods.length > 0" @add='addToCart($event, "productId")'></goods>
|
||||||
<!-- <image
|
<!-- <image
|
||||||
v-if="isCompleteLoadGood"
|
v-if="isCompleteLoadGood"
|
||||||
:src="webUrl + '/home/no-data-bg.png'"
|
:src="webUrl + '/home/no-data-bg.png'"
|
||||||
@@ -76,6 +76,14 @@
|
|||||||
:show-avatar="false"
|
:show-avatar="false"
|
||||||
/>
|
/>
|
||||||
<shareImg ref="shareImg"></shareImg>
|
<shareImg ref="shareImg"></shareImg>
|
||||||
|
<ProductWindow
|
||||||
|
ref="attrWindow"
|
||||||
|
:attr="attr"
|
||||||
|
:cartNum="cart_num"
|
||||||
|
:showOk="true"
|
||||||
|
@changeFun="changeFun"
|
||||||
|
@ok="handleOk"
|
||||||
|
/>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -87,10 +95,12 @@ import {
|
|||||||
} from "@/api/product"
|
} from "@/api/product"
|
||||||
import goods from "./components/goods.vue"
|
import goods from "./components/goods.vue"
|
||||||
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
||||||
|
import goCartMixin from '@/mixins/goCartMixins'
|
||||||
import projects from './components/projects.vue'
|
import projects from './components/projects.vue'
|
||||||
import culture from "./components/culture.vue"
|
import culture from "./components/culture.vue"
|
||||||
import information from "./components/information.vue"
|
import information from "./components/information.vue"
|
||||||
import shareImg from "./components/shareImg.vue"
|
import shareImg from "./components/shareImg.vue"
|
||||||
|
import ProductWindow from '@/components/ProductWindow'
|
||||||
export default {
|
export default {
|
||||||
name: 'LandMarkPage',
|
name: 'LandMarkPage',
|
||||||
components: {
|
components: {
|
||||||
@@ -98,9 +108,10 @@ export default {
|
|||||||
projects,
|
projects,
|
||||||
culture,
|
culture,
|
||||||
information,
|
information,
|
||||||
shareImg
|
shareImg,
|
||||||
|
ProductWindow
|
||||||
},
|
},
|
||||||
mixins: [pageListenMixins],
|
mixins: [pageListenMixins, goCartMixin],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
actived: 1,
|
actived: 1,
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
<image :src="webUrl+'/20210806121714655368.png'" mode="" style="width: 36rpx;height: 36rpx;"></image>
|
<image :src="webUrl+'/20210806121714655368.png'" mode="" style="width: 36rpx;height: 36rpx;"></image>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-if="couponListLimit2ToShow.length > 0 || attr.productSelect.earnPoints" class="v12-mt-1 v12-mb-3">
|
<view v-if="couponListLimit2ToShow.length > 0 || attr.productSelect.earnPoints" class="v12-mt-1 v12-mb-1">
|
||||||
<view class="cell flex jc-between ai-center">
|
<view class="cell flex jc-between ai-center">
|
||||||
<view v-if="couponListLimit2ToShow.length > 0" class="v12-justify-start">
|
<view v-if="couponListLimit2ToShow.length > 0" class="v12-justify-start">
|
||||||
<view
|
<view
|
||||||
@@ -43,13 +43,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view
|
|
||||||
v-if="attr.productSelect.earnPoints"
|
|
||||||
:class="couponListLimit2ToShow.length > 0 ? 'earn-points' : ''"
|
|
||||||
class="value value2 v12-font-24 v12-primary-text"
|
|
||||||
>
|
|
||||||
预计获得{{ attr.productSelect.earnPoints }}积分
|
|
||||||
</view>
|
|
||||||
<view
|
<view
|
||||||
v-if="couponListLimit2ToShow.length > 0"
|
v-if="couponListLimit2ToShow.length > 0"
|
||||||
class="value value2 v12-font-24 v12-primary-text"
|
class="value value2 v12-font-24 v12-primary-text"
|
||||||
@@ -60,6 +54,13 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<view
|
||||||
|
v-if="attr.productSelect.earnPoints"
|
||||||
|
:class="couponListLimit2ToShow.length > 0 ? 'earn-points' : ''"
|
||||||
|
class="value value2 v12-font-24 v12-primary-text"
|
||||||
|
>
|
||||||
|
预计获得{{ attr.productSelect.earnPoints }}积分
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="introduce bold">{{ storeInfo.storeName }}</view>
|
<view class="introduce bold">{{ storeInfo.storeName }}</view>
|
||||||
<rich-text class="subInfo" :nodes="storeInfo.storeInfo" v-if="storeInfo.storeInfo"/>
|
<rich-text class="subInfo" :nodes="storeInfo.storeInfo" v-if="storeInfo.storeInfo"/>
|
||||||
@@ -1009,6 +1010,7 @@ export default {
|
|||||||
// 产品详情接口
|
// 产品详情接口
|
||||||
productCon() {
|
productCon() {
|
||||||
const from = this.location
|
const from = this.location
|
||||||
|
|
||||||
if (this.$deviceType == 'app') {
|
if (this.$deviceType == 'app') {
|
||||||
from.from = 'app'
|
from.from = 'app'
|
||||||
}
|
}
|
||||||
@@ -1332,6 +1334,8 @@ export default {
|
|||||||
goCat(news) {
|
goCat(news) {
|
||||||
const that = this
|
const that = this
|
||||||
const productSelect = this.getAttrItemData(this.attrValue)
|
const productSelect = this.getAttrItemData(this.attrValue)
|
||||||
|
console.log(this.attr);
|
||||||
|
|
||||||
// 打开属性
|
// 打开属性
|
||||||
if (that.attrValue) {
|
if (that.attrValue) {
|
||||||
// 默认选中了属性,但是没有打开过属性弹窗还是自动打开让用户查看默认选中的属性
|
// 默认选中了属性,但是没有打开过属性弹窗还是自动打开让用户查看默认选中的属性
|
||||||
@@ -2070,7 +2074,8 @@ export default {
|
|||||||
}
|
}
|
||||||
.earn-points {
|
.earn-points {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
padding: 0 0 0 12rpx;
|
// padding: 0 0 0 12rpx;
|
||||||
|
margin-bottom: 10rpx;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -76,7 +76,10 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class="vip-money">¥{{ force2Decimal(item.otPrice) }}</view>
|
<view class="vip-money">¥{{ force2Decimal(item.otPrice) }}</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="sale">已售{{ item.sales }}件</view>
|
<view class="" @click.stop="addToCart(item)">
|
||||||
|
<image class="logo" :src="webUrl+'/orderIcon/组 355.png'" mode="" style="margin-right:0; width: 34rpx; height:34rpx"/>
|
||||||
|
</view>
|
||||||
|
<!-- <view class="sale">已售{{ item.sales }}件</view> -->
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -160,26 +163,36 @@
|
|||||||
v-if="searchType === 'good' && loadend && list.length === 0"
|
v-if="searchType === 'good' && loadend && list.length === 0"
|
||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
|
<ProductWindow
|
||||||
|
ref="attrWindow"
|
||||||
|
:attr="attr"
|
||||||
|
:cartNum="cart_num"
|
||||||
|
:showOk="true"
|
||||||
|
@changeFun="changeFun"
|
||||||
|
@ok="handleOk"
|
||||||
|
/>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getProducts, getHotels } from '@/api/store'
|
import { getProducts, getHotels } from '@/api/store'
|
||||||
|
import ProductWindow from '@/components/ProductWindow'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import NP from 'number-precision'
|
import NP from 'number-precision'
|
||||||
import NoGoodData from '@/components/good/NoData'
|
import NoGoodData from '@/components/good/NoData'
|
||||||
import Recommend from '@/components/Recommend'
|
import Recommend from '@/components/Recommend'
|
||||||
|
import goCartMixin from '@/mixins/goCartMixins'
|
||||||
export default {
|
export default {
|
||||||
name: 'GoodsList',
|
name: 'GoodsList',
|
||||||
components: {
|
components: {
|
||||||
NoGoodData,
|
NoGoodData,
|
||||||
|
ProductWindow,
|
||||||
Recommend
|
Recommend
|
||||||
},
|
},
|
||||||
data: function () {
|
mixins: [goCartMixin],
|
||||||
|
data () {
|
||||||
return {
|
return {
|
||||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
|
||||||
list: [],
|
list: [],
|
||||||
query: {
|
query: {
|
||||||
page: 1,
|
page: 1,
|
||||||
|
|||||||
@@ -571,7 +571,7 @@
|
|||||||
<text class="v12-font-bold v12-primary-text v12-font-24">¥</text>
|
<text class="v12-font-bold v12-primary-text v12-font-24">¥</text>
|
||||||
<text class="v12-font-bold v12-primary-text v12-font-28">{{ item.productPrice }}</text>
|
<text class="v12-font-bold v12-primary-text v12-font-28">{{ item.productPrice }}</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="btn">
|
<view class="btn" @click.stop="addToCart(item, 'productId')">
|
||||||
<image
|
<image
|
||||||
:src="webUrl + '/home/icon-cart.png'"
|
:src="webUrl + '/home/icon-cart.png'"
|
||||||
class="img"
|
class="img"
|
||||||
@@ -632,6 +632,14 @@
|
|||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
</u-popup>
|
</u-popup>
|
||||||
|
<ProductWindow
|
||||||
|
ref="attrWindow"
|
||||||
|
:attr="attr"
|
||||||
|
:cartNum="cart_num"
|
||||||
|
:showOk="true"
|
||||||
|
@changeFun="changeFun"
|
||||||
|
@ok="handleOk"
|
||||||
|
/>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -653,6 +661,8 @@ import {
|
|||||||
getShareImg,
|
getShareImg,
|
||||||
getSaleList
|
getSaleList
|
||||||
} from '@/api/qianxian'
|
} from '@/api/qianxian'
|
||||||
|
import ProductWindow from '@/components/ProductWindow'
|
||||||
|
import goCartMixin from '@/mixins/goCartMixins'
|
||||||
import {formatDateTime} from '@/utils'
|
import {formatDateTime} from '@/utils'
|
||||||
import {getUrlParam} from '@/utils/common.js'
|
import {getUrlParam} from '@/utils/common.js'
|
||||||
import imgBox from '@/components/imageTypeSet/imagebox.vue'
|
import imgBox from '@/components/imageTypeSet/imagebox.vue'
|
||||||
@@ -663,9 +673,10 @@ import { pageListenMixins } from '@/mixins/pageListenMixins'
|
|||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
imgBox,
|
imgBox,
|
||||||
XddProductItem
|
XddProductItem,
|
||||||
|
ProductWindow
|
||||||
},
|
},
|
||||||
mixins: [pageListenMixins],
|
mixins: [pageListenMixins, goCartMixin],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
saleActived: null,
|
saleActived: null,
|
||||||
|
|||||||
@@ -159,7 +159,7 @@
|
|||||||
<text class="v12-font-32">¥</text>
|
<text class="v12-font-32">¥</text>
|
||||||
<text class="v12-font-36">{{ item.price }}</text>
|
<text class="v12-font-36">{{ item.price }}</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="cart-img">
|
<view class="cart-img" @click.stop="addToCart(item, 'productId')">
|
||||||
<image
|
<image
|
||||||
class="cart-img"
|
class="cart-img"
|
||||||
:src="webUrl + '/orderIcon/组 355.png'"
|
:src="webUrl + '/orderIcon/组 355.png'"
|
||||||
@@ -177,11 +177,25 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<ProductWindow
|
||||||
|
ref="attrWindow"
|
||||||
|
:attr="attr"
|
||||||
|
:cartNum="cart_num"
|
||||||
|
:showOk="true"
|
||||||
|
@changeFun="changeFun"
|
||||||
|
@ok="handleOk"
|
||||||
|
/>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getRank, getFoods, getRecipe } from "@/api/health";
|
import { getRank, getFoods, getRecipe } from "@/api/health";
|
||||||
|
import ProductWindow from '@/components/ProductWindow'
|
||||||
|
import goCartMixin from '@/mixins/goCartMixins'
|
||||||
export default {
|
export default {
|
||||||
|
components: {
|
||||||
|
ProductWindow
|
||||||
|
},
|
||||||
|
mixins: [goCartMixin],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
|||||||
Reference in New Issue
Block a user