9 changed files with 1474 additions and 215 deletions
@ -0,0 +1,435 @@ |
|||||
|
<template> |
||||
|
<view class="bg"> |
||||
|
|
||||
|
<uni-popup ref="popup" type="bottom" border-radius="10px 10px 0 0" |
||||
|
:safe-area="true" @change="popChange"> |
||||
|
<view class="cart-container" v-if="showCart"> |
||||
|
<view class="header-container"> |
||||
|
<view class="select-area flex flex-items-center" @click.stop="selectAllGoods"> |
||||
|
<view class="select-cycle" v-show="!selectAll"></view> |
||||
|
<view class="select-cycle selected" v-show="selectAll"> |
||||
|
<image src="https://yjdtadmin.sz-trip.com/uploads/20240726/a3d19f85c743c71320b3f879e01f6355.png"> |
||||
|
</view> |
||||
|
<view style="padding-left: 26rpx;" >全选</view> |
||||
|
</view> |
||||
|
<view class="delete-area flex flex-items-center" @click.stop="clearAllGoods"> |
||||
|
<image src="https://yjdtadmin.sz-trip.com/uploads/20240726/dde92bdf8b89abb93bd00472de06a615.png"></image> |
||||
|
<view style="padding-left: 8rpx;" >清空</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="content-container"> |
||||
|
<view class="content-item" v-for="(item,i) in cartData" :key="i" :model="cartData"> |
||||
|
<view class="flex flex-items-center" @tap.stop="setItemSelect(item)"> |
||||
|
<view class="select-cycle" v-show="!item.isSelected"></view> |
||||
|
<view class="select-cycle selected" v-show="item.isSelected"> |
||||
|
<image src="https://yjdtadmin.sz-trip.com/uploads/20240726/a3d19f85c743c71320b3f879e01f6355.png"> |
||||
|
</view> |
||||
|
<view style="padding-left: 26rpx;flex:1"> |
||||
|
<view class="commodity box" > |
||||
|
<image class="img" :src="showImg(item.Specifications_image)" mode="aspectFill"></image> |
||||
|
<view class="title goods-text-area"> |
||||
|
<view class="commodity-info"> |
||||
|
<view class="text-overflowRows" style="font-weight: bold;">{{ item.good_name }}</view> |
||||
|
<view class="text-overflowRows" style="font-size: 27rpx;color: #999999;padding-top: 10rpx;">{{ item.Specifications_name }}</view> |
||||
|
</view> |
||||
|
<view class="flex flex-between"> |
||||
|
<view class="commodity-price"> |
||||
|
¥ <view style="font-size: 40rpx;">{{item.Specifications_money/100}}</view> |
||||
|
</view> |
||||
|
<view class="add-num-area"> |
||||
|
<image @click.stop="addBuyNum(item,-1,i)" |
||||
|
:src="(item.num==1?'https://yjdtadmin.sz-trip.com/uploads/20231225/634870627318043881f9c417e5ad5b52.png':'https://yjdtadmin.sz-trip.com/uploads/20240726/ea81cd01a1f32a0226d33d8e35119c96.png')" ></image> |
||||
|
<view>{{item.num}}</view> |
||||
|
<image @click.stop="addBuyNum(item,1,i)" src="https://yjdtadmin.sz-trip.com/uploads/20240726/5028bbc810386a1f301a556672711f19.png" ></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</uni-popup> |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
<slot name="content"></slot> |
||||
|
</view> |
||||
|
|
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: "cartData", |
||||
|
data() { |
||||
|
return { |
||||
|
cartData: [], |
||||
|
showCart: false, |
||||
|
selectAll: false, |
||||
|
canOpenpop: true, |
||||
|
allPrice: {allPrice:0, iNum:0, fNum:'00'} |
||||
|
} |
||||
|
}, |
||||
|
props:{ |
||||
|
paramData: { |
||||
|
type: Object, |
||||
|
}, |
||||
|
}, |
||||
|
|
||||
|
mounted() { |
||||
|
this.canOpenpop = true |
||||
|
this.refreshData() |
||||
|
uni.$on("updateDataByConnect",this.getDataByConnect) |
||||
|
}, |
||||
|
beforeUnmount () { |
||||
|
uni.$off("updateDataByConnect",this.getDataByConnect) |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
calNum () { |
||||
|
let res = 0 |
||||
|
this.cartData.forEach(v=>{ |
||||
|
res += v.num |
||||
|
}) |
||||
|
return res |
||||
|
}, |
||||
|
closePopup() { |
||||
|
this.$refs.popup.close() |
||||
|
this.paramData.showCart = this.showCart |
||||
|
this.$emit('changeParamData', this.paramData) |
||||
|
}, |
||||
|
openPop(){ |
||||
|
this.$refs.popup.open() |
||||
|
this.paramData.showCart = this.showCart |
||||
|
this.$emit('changeParamData', this.paramData) |
||||
|
}, |
||||
|
popChange (e) { |
||||
|
this.showCart = e.show |
||||
|
this.paramData.showCart = this.showCart |
||||
|
this.$emit('changeParamData', this.paramData) |
||||
|
}, |
||||
|
|
||||
|
getDataByConnect(data) { |
||||
|
if (data.msgType == "updateCartDataInfo") { |
||||
|
this.refreshData(data) |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
refreshData (data) { |
||||
|
let selectedData = [] |
||||
|
try { |
||||
|
selectedData = JSON.parse(uni.getStorageSync('cartDataInfo')); |
||||
|
} catch(e) { |
||||
|
selectedData = [] |
||||
|
} |
||||
|
|
||||
|
if (Array.isArray(data) && data.length>0) { |
||||
|
this.cartData = data |
||||
|
this.setAllSelect() |
||||
|
} else { |
||||
|
this.Post({},'/api/shopping/getShoppingList').then(res => { |
||||
|
if (res) { |
||||
|
this.cartData = (res.data || []).map(v=>{return {...v, isSelected:selectedData.includes(v.specifications_id)}}) |
||||
|
this.setAllSelect() |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 购物车操作 |
||||
|
setItemSelect(item) { |
||||
|
item.isSelected = !item.isSelected |
||||
|
// uni.setStorageSync('cartDataInfo', JSON.stringify(this.cartData)); |
||||
|
this.setAllSelect() |
||||
|
|
||||
|
}, |
||||
|
selectAllGoods(){ |
||||
|
let goods = this.cartData |
||||
|
if (this.selectAll) { |
||||
|
goods.forEach(v => v.isSelected = false) |
||||
|
this.selectAll = false |
||||
|
} else { |
||||
|
goods.forEach(v => v.isSelected = true) |
||||
|
this.selectAll = true |
||||
|
} |
||||
|
this.setAllSelect() |
||||
|
|
||||
|
}, |
||||
|
clearAllGoods(){ |
||||
|
let _this = this |
||||
|
Promise.all(this.cartData.map(v=>{ |
||||
|
return _this.Post({s_id: v.id},'/api/shopping/delShopping') |
||||
|
})).finally(res =>{ |
||||
|
this.cartData = [] |
||||
|
this.setAllSelect() |
||||
|
}) |
||||
|
}, |
||||
|
setAllSelect() { |
||||
|
let goods = this.cartData |
||||
|
if(goods.length>0&& goods.every(v => v.isSelected)){ |
||||
|
this.selectAll = true |
||||
|
} else { |
||||
|
this.selectAll = false |
||||
|
} |
||||
|
let selectedData = goods.filter(v=>v.isSelected).map(v=>v.specifications_id) |
||||
|
uni.setStorageSync('cartDataInfo', JSON.stringify(selectedData)); |
||||
|
this.calAllPrice() |
||||
|
}, |
||||
|
|
||||
|
addBuyNum(item, num,index){ |
||||
|
if (num == -1 && item.num == 1) { |
||||
|
this.Post({s_id: item.id},'/api/shopping/delShopping').then(res =>{ |
||||
|
this.cartData.splice(index,1) |
||||
|
this.setAllSelect() |
||||
|
}) |
||||
|
} else { |
||||
|
let numData = item.num + num |
||||
|
this.Post({s_id: item.id, num: numData},'/api/shopping/updateShopping').then(res =>{ |
||||
|
item.num += num |
||||
|
this.setAllSelect() |
||||
|
}) |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
calAllPrice () { |
||||
|
let selectedGoods = this.cartData.filter(v=>v.isSelected) |
||||
|
let totalPrice = 0 |
||||
|
selectedGoods.forEach(v=>{ |
||||
|
totalPrice += v.Specifications_money/100 * v.num |
||||
|
}) |
||||
|
totalPrice = totalPrice.toFixed(2) |
||||
|
console.log(totalPrice) |
||||
|
this.allPrice = {allPrice: totalPrice, iNum: totalPrice.split('.')[0], fNum: totalPrice.split('.')[1]} |
||||
|
|
||||
|
this.paramData.allPrice = totalPrice |
||||
|
this.paramData.iNum = this.allPrice.iNum |
||||
|
this.paramData.fNum = this.allPrice.fNum |
||||
|
this.paramData.num = this.calNum() |
||||
|
|
||||
|
this.$emit('changeParamData', this.paramData) |
||||
|
}, |
||||
|
|
||||
|
goCartOrder () { |
||||
|
if(this.cartData.every(v => !v.isSelected)){ |
||||
|
uni.showToast({ |
||||
|
title:'请先选中要购买的商品', |
||||
|
icon:'none', |
||||
|
}) |
||||
|
return |
||||
|
} |
||||
|
let orderData = this.cartData.filter(v=>v.isSelected).map(v=>{ |
||||
|
return { |
||||
|
goodsInfo: { |
||||
|
image: v.Specifications_image, |
||||
|
title:v.good_name, |
||||
|
}, |
||||
|
skuInfo: { |
||||
|
title:v.Specifications_name, |
||||
|
buyNum:v.num, |
||||
|
money: v.Specifications_money, |
||||
|
id: v.specifications_id, |
||||
|
}, |
||||
|
|
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
|
||||
|
let orderInfo = { |
||||
|
// is_post: goods.is_post || "1", |
||||
|
is_post: 1, // 购物车都是邮寄 |
||||
|
goods: orderData, |
||||
|
post: 0 |
||||
|
} |
||||
|
|
||||
|
uni.setStorageSync('teChanOrder', JSON.stringify(orderInfo)); //规格 |
||||
|
// uni.setStorageSync('teChanInfo', JSON.stringify(this.info)); //商品 |
||||
|
uni.navigateTo({ |
||||
|
url: '/subPackages/techan/order' |
||||
|
}); |
||||
|
}, |
||||
|
}, |
||||
|
|
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped lang="scss"> |
||||
|
*{ |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
.bg{ |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
.cart-container{ |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
background-color: white; |
||||
|
height: 933rpx; |
||||
|
padding-bottom: 184rpx; |
||||
|
border-radius: 20rpx 20rpx 0rpx 0rpx; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
position: absolute; |
||||
|
width: 100%; |
||||
|
bottom: 0; |
||||
|
z-index: 20; |
||||
|
|
||||
|
.header-container{ |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
padding: 40rpx 26rpx; |
||||
|
|
||||
|
.select-area{ |
||||
|
font-family: PingFang SC; |
||||
|
font-weight: bold; |
||||
|
font-size: 37rpx; |
||||
|
color: #000000; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.delete-area{ |
||||
|
font-family: PingFang SC; |
||||
|
font-weight: bold; |
||||
|
font-size: 27rpx; |
||||
|
color: #999999; |
||||
|
image{ |
||||
|
width: 26rpx; |
||||
|
height: 26rpx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.content-container{ |
||||
|
flex: 1; |
||||
|
height: 10rpx; |
||||
|
overflow-y: auto; |
||||
|
padding:0 26rpx 26rpx; |
||||
|
|
||||
|
.content-item{ |
||||
|
margin-bottom: 48rpx; |
||||
|
} |
||||
|
|
||||
|
.commodity { |
||||
|
display: flex; |
||||
|
.add-num-area{ |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
width: 160rpx; |
||||
|
|
||||
|
image{ |
||||
|
width: 49rpx; |
||||
|
height: 49rpx; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
.goods-text-area{ |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
justify-content: space-between; |
||||
|
} |
||||
|
.commodity-price{ |
||||
|
font-weight: 500; |
||||
|
font-size: 24rpx; |
||||
|
color: #F84A56; |
||||
|
display: flex; |
||||
|
align-items: baseline; |
||||
|
} |
||||
|
.commodity-info{ |
||||
|
font-family: PingFangSC; |
||||
|
font-weight: 500; |
||||
|
font-size: 32rpx; |
||||
|
color: #2C2C2C; |
||||
|
} |
||||
|
// align-items: center; |
||||
|
.img { |
||||
|
width: 217rpx; |
||||
|
height: 179rpx; |
||||
|
border-radius: 13rpx; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
.title { |
||||
|
flex: 1; |
||||
|
margin-left: 20rpx; |
||||
|
font-size: 32rpx; |
||||
|
font-family: PingFangSC-Medium, PingFang SC; |
||||
|
font-weight: 500; |
||||
|
color: #000000; |
||||
|
|
||||
|
.price-list { |
||||
|
display: flex; |
||||
|
margin-top: 18rpx; |
||||
|
align-items: center; |
||||
|
.price-r { |
||||
|
font-size: 32rpx; |
||||
|
font-family: PingFangSC-Regular, PingFang SC; |
||||
|
font-weight: 400; |
||||
|
color: #fc5109; |
||||
|
&:before { |
||||
|
content: '¥'; |
||||
|
display: inline-block; |
||||
|
color: #fc5109; |
||||
|
font-size: 24rpx; |
||||
|
} |
||||
|
} |
||||
|
.price-g { |
||||
|
font-size: 24rpx; |
||||
|
font-family: PingFangSC-Regular, PingFang SC; |
||||
|
font-weight: 400; |
||||
|
color: #b5bcc9; |
||||
|
text-decoration: line-through; |
||||
|
margin-left: 10rpx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
.num-box { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-left: 20rpx; |
||||
|
width: 160rpx; |
||||
|
justify-content: space-between; |
||||
|
.num { |
||||
|
text-align: center; |
||||
|
width: 50rpx; |
||||
|
} |
||||
|
.ctrl { |
||||
|
width: 46rpx; |
||||
|
height: 46rpx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.select-cycle{ |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
border-radius: 50%; |
||||
|
border: 1px solid #999999; |
||||
|
image{ |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
} |
||||
|
.select-cycle.selected { |
||||
|
border: none; |
||||
|
image{ |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
</style> |
Loading…
Reference in new issue