You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
404 lines
12 KiB
404 lines
12 KiB
<template>
|
|
<view>
|
|
<view class="isLoading bg-white flex flex-direction justify-center align-center" style="height: 100vh;width: 100vw;" v-if="showLoading">
|
|
<image src="/static/loading-white.gif" mode="widthFix" style="width:500upx"></image>
|
|
</view>
|
|
<view class="" v-else>
|
|
<template v-if="cartGoods.length==0">
|
|
<view class="flex flex-direction justify-center align-center" style="width: 100vw;height:80vh;">
|
|
<image :src="STATIC_URL+'null02.png'" style="width: 300rpx;" mode="widthFix"></image>
|
|
<view class="text-center" style="color: #AAAAAA;font-size: 26rpx;margin-top: 10rpx;">购物车空了,快去逛逛吧~</view>
|
|
</view>
|
|
</template>
|
|
<template v-else>
|
|
<view class="cart-top flex justify-between bg-white">
|
|
<view class=""></view>
|
|
<view class="" @tap="editCart">{{isEdit?'取消编辑':'编辑商品'}}</view>
|
|
</view>
|
|
<view class="" style="height: 80rpx;"></view>
|
|
<view class="cart-shop-box">
|
|
<view class="cart-shop-item bg-white" v-for="(shop,shopIndex) in cartGoods" :key="shopIndex">
|
|
<view class="shop-name-box flex align-center">
|
|
<text :class="shop.shopChecked?'cuIcon-roundcheckfill text-red':'cuIcon-round text-gray'" @tap="checkShop(shopIndex)"></text>
|
|
<image class="shop-logo" :src="IMAGE_URL+shop.brandLogo" mode="widthFix"></image>
|
|
<view class="shop-name">{{shop.brandName}}</view>
|
|
</view>
|
|
<view class="cart-goods-box">
|
|
<view class="cart-goods-item flex justify-between align-start" v-for="(goods,goodsIndex) in shop.children" :key="goodsIndex">
|
|
<view class="flex align-center" style="height: 200rpx;">
|
|
<text :class="goods.goodsChecked?'cuIcon-roundcheckfill text-red':'cuIcon-round text-gray'" @tap="checkGoods(shopIndex,goodsIndex)"></text>
|
|
</view>
|
|
<navigator :url="'/pages/goodsDetail/goodsDetail?id='+goods.goodsId" class="cart-goods-pic">
|
|
<u-lazy-load threshold="-100" :image="IMAGE_URL+goods.mainPhotoUrl" :index="index" loading-img="/static/null05.png" height="200" border-radius="10" error-img="/static/null05.png" img-mode="aspectFill"></u-lazy-load>
|
|
</navigator>
|
|
<view class="cart-goods-msg flex-sub">
|
|
<view class="msg-top flex flex-direction justify-between clear align-start">
|
|
<view class="">
|
|
<view class="cart-goods-name">{{goods.goodsName}}</view>
|
|
<text class="cart-goods-spec">{{goods.skuName}}</text>
|
|
</view>
|
|
<view class="text-red tip">赚{{goods.commission}}</view>
|
|
</view>
|
|
<view class="msg-bottom flex justify-between" style="line-height: 50rpx;padding-top: 15rpx;">
|
|
<view class="flex">
|
|
<text class="text-red" style="font-size: 30rpx;">¥{{goods.price}}</text>
|
|
<text style="text-decoration: line-through;font-size: 20rpx;margin-left: 5rpx;color: #898989;">¥{{goods.originalPrice}}</text>
|
|
</view>
|
|
<!-- 用change事件初次加载会请求多次 -->
|
|
<u-number-box v-model="goods.quantity" :min="1" :input-width="72" :size="24" @change="changeNum(goods.shoppingTrolleyId,goods.quantity)"></u-number-box>
|
|
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
|
|
<view class="cart-bottom bg-white flex justify-between align-center">
|
|
<view class="all-select-box flex align-center" @tap="selectAll">
|
|
<text :class="allChecked?'cuIcon-roundcheckfill text-red':'cuIcon-round text-gray'"></text>
|
|
<view style="font-size: 28rpx;margin-left: 10rpx;">全选</view>
|
|
</view>
|
|
<view class="flex align-center">
|
|
|
|
<view class="" style="margin-right: 30rpx;">
|
|
<template v-if="isEdit">
|
|
<view class="">已选择{{totalNum}}件商品</view>
|
|
</template>
|
|
<template v-else>
|
|
<view style="font-size: 28rpx;">合计:¥{{totalPrice}}</view>
|
|
<view class="text-red" style="font-size: 18rpx;">赚{{totalCommission}}</view>
|
|
</template>
|
|
</view>
|
|
<button v-if="isEdit" class="cu-btn text-white round bg-red" @tap="delGoods">删除</button>
|
|
<button v-else class="cu-btn text-white round bg-red" @tap="creatCartOrder">结算({{totalNum}})</button>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
return {
|
|
allChecked: false,
|
|
cartGoods: [],
|
|
IMAGE_URL: this.IMAGE_URL,
|
|
STATIC_URL:this.STATIC_URL,
|
|
isEdit: false,
|
|
totalPrice: 0,
|
|
totalNum: 0,
|
|
selectGoodsIds: [],
|
|
totalCommission: 0,
|
|
showLoading:true
|
|
};
|
|
},
|
|
onShow() {
|
|
this.getCartGoods()
|
|
},
|
|
methods: {
|
|
editCart() {
|
|
this.isEdit = !this.isEdit
|
|
},
|
|
changeNum(id, num) {
|
|
// console.log(id, num)
|
|
this.$u.post('/api/v1/goods/shopping_trolley/quantity/update', {
|
|
UserID: uni.getStorageSync("userInfo").id,
|
|
ShoppingTrolleyId: id,
|
|
Quantity: num
|
|
}).then(res => {
|
|
console.log(res.data);
|
|
if (res.data.code == "FAIL") {
|
|
this.$u.toast(res.data.msg);
|
|
return
|
|
}
|
|
this.getSelectedGoods()
|
|
});
|
|
},
|
|
getCartGoods() {
|
|
this.$u.post('/api/v1/goods/shopping_trolley/list', {
|
|
UserID: uni.getStorageSync("userInfo").id
|
|
}).then(res => {
|
|
console.log(res.data);
|
|
this.showLoading = false
|
|
if (res.data.code == "FAIL") {
|
|
this.$u.toast(res.data.msg);
|
|
return
|
|
}
|
|
this.cartGoods = res.data.data
|
|
if (this.cartGoods.length != 0) {
|
|
this.allChecked = false
|
|
|
|
for (let i = 0; i < this.cartGoods.length; i++) {
|
|
this.cartGoods[i].shopChecked = false
|
|
for (let j = 0; j < this.cartGoods[i].children.length; j++) {
|
|
this.cartGoods[i].children[j].goodsChecked = false
|
|
}
|
|
}
|
|
}
|
|
this.getSelectedGoods()
|
|
this.$forceUpdate()
|
|
console.log(this.cartGoods)
|
|
});
|
|
},
|
|
// 勾选店铺
|
|
checkShop(s_index) {
|
|
this.cartGoods[s_index].shopChecked = !this.cartGoods[s_index].shopChecked
|
|
for (let i = 0; i < this.cartGoods[s_index].children.length; i++) {
|
|
this.cartGoods[s_index].children[i].goodsChecked = this.cartGoods[s_index].shopChecked
|
|
}
|
|
|
|
let checkedCount = 0
|
|
for (let i = 0; i < this.cartGoods.length; i++) {
|
|
if (this.cartGoods[i].shopChecked) {
|
|
checkedCount++
|
|
} else {
|
|
this.allChecked = false
|
|
break
|
|
}
|
|
}
|
|
if (checkedCount == this.cartGoods.length) {
|
|
this.allChecked = true
|
|
}
|
|
this.getSelectedGoods()
|
|
this.$forceUpdate()
|
|
},
|
|
//勾选商品
|
|
checkGoods(s_index, g_index) {
|
|
this.cartGoods[s_index].children[g_index].goodsChecked = !this.cartGoods[s_index].children[g_index].goodsChecked
|
|
let checkedCount = 0
|
|
for (let i = 0; i < this.cartGoods[s_index].children.length; i++) {
|
|
if (!this.cartGoods[s_index].children[i].goodsChecked) {
|
|
this.cartGoods[s_index].shopChecked = this.allChecked = false
|
|
break
|
|
} else {
|
|
checkedCount++
|
|
}
|
|
}
|
|
if (checkedCount == this.cartGoods[s_index].children.length) {
|
|
this.cartGoods[s_index].shopChecked = true
|
|
let checkedCount = 0
|
|
for (let i = 0; i < this.cartGoods.length; i++) {
|
|
if (!this.cartGoods[i].shopChecked) {
|
|
this.allChecked = false
|
|
break
|
|
} else {
|
|
checkedCount++
|
|
}
|
|
}
|
|
if (checkedCount == this.cartGoods.length) {
|
|
this.allChecked = true
|
|
}
|
|
}
|
|
this.getSelectedGoods()
|
|
this.$forceUpdate()
|
|
},
|
|
// 勾选全部
|
|
selectAll() {
|
|
this.allChecked = !this.allChecked
|
|
for (let i = 0; i < this.cartGoods.length; i++) {
|
|
this.cartGoods[i].shopChecked = this.allChecked
|
|
for (let j = 0; j < this.cartGoods[i].children.length; j++) {
|
|
this.cartGoods[i].children[j].goodsChecked = this.allChecked
|
|
}
|
|
}
|
|
this.getSelectedGoods()
|
|
// this.$forceUpdate()
|
|
},
|
|
getSelectedGoods() {
|
|
let selectGoodsIds = []
|
|
let totalPrice = 0
|
|
let totalNum = 0
|
|
let totalCommission = 0
|
|
for (let i = 0; i < this.cartGoods.length; i++) {
|
|
for (let j = 0; j < this.cartGoods[i].children.length; j++) {
|
|
if (this.cartGoods[i].children[j].goodsChecked) {
|
|
selectGoodsIds.push(this.cartGoods[i].children[j].shoppingTrolleyId)
|
|
totalNum += this.cartGoods[i].children[j].quantity
|
|
totalPrice += (this.cartGoods[i].children[j].price) * (this.cartGoods[i].children[j].quantity)
|
|
totalCommission += (this.cartGoods[i].children[j].commission) * (this.cartGoods[i].children[j].quantity)
|
|
}
|
|
}
|
|
}
|
|
this.totalNum = totalNum
|
|
this.totalPrice = totalPrice.toFixed(2)
|
|
this.selectGoodsIds = selectGoodsIds
|
|
this.totalCommission = totalCommission.toFixed(2)
|
|
// console.log(selectGoodsIds)
|
|
},
|
|
delGoods() {
|
|
if (this.selectGoodsIds.length == 0) {
|
|
this.$u.toast("至少选择一件商品");
|
|
return
|
|
}
|
|
uni.showModal({
|
|
title: '提示',
|
|
content: '确认要删除选择的商品吗?',
|
|
success: (res) => {
|
|
if (res.confirm) {
|
|
console.log('用户点击确定');
|
|
this.$u.post('/api/v1/goods/shopping_trolley/remove', {
|
|
UserID: uni.getStorageSync("userInfo").id,
|
|
TrolleyGoodsIDs: this.selectGoodsIds
|
|
}).then(res => {
|
|
console.log(res.data);
|
|
if (res.data.code == "FAIL") {
|
|
this.$u.toast(res.data.msg);
|
|
return
|
|
}
|
|
uni.showToast({
|
|
title: "删除成功"
|
|
})
|
|
this.getCartGoods()
|
|
// this.posts = res.data.data
|
|
});
|
|
} else if (res.cancel) {
|
|
console.log('用户点击取消');
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
creatCartOrder() {
|
|
if (this.selectGoodsIds.length == 0) {
|
|
this.$u.toast("至少选择一件商品");
|
|
return
|
|
}
|
|
this.$u.post('/api/v1/order_preview/shopping_trolley/create', {
|
|
userId: uni.getStorageSync("userInfo").id,
|
|
ids: this.selectGoodsIds
|
|
}).then(res => {
|
|
console.log(res.data);
|
|
if (res.data.code == "FAIL") {
|
|
this.$u.toast(res.data.msg);
|
|
return
|
|
}
|
|
let preViewMsg = res.data.data
|
|
this.$store.commit('updatePreOrderMsg',preViewMsg);
|
|
uni.navigateTo({
|
|
url: "../confirmOrder/confirmOrder"
|
|
})
|
|
});
|
|
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
page {
|
|
background-color: #f3f3f3;
|
|
}
|
|
|
|
.cart-top {
|
|
position: fixed;
|
|
width: 100%;
|
|
padding: 0 30rpx;
|
|
line-height: 80rpx;
|
|
top: 0;
|
|
z-index: 1000;
|
|
}
|
|
|
|
.cart-shop-item {
|
|
margin: 20rpx;
|
|
padding: 0 20rpx;
|
|
border-radius: 15rpx;
|
|
|
|
&:last-child {
|
|
margin-bottom: 200rpx;
|
|
}
|
|
|
|
.shop-name-box {
|
|
height: 80rpx;
|
|
font-size: 28rpx;
|
|
color: #0A0001;
|
|
|
|
.shop-logo {
|
|
width: 44rpx;
|
|
border-radius: 10rpx;
|
|
margin: 0 10rpx;
|
|
}
|
|
}
|
|
|
|
.cart-goods-item {
|
|
padding-bottom: 20rpx;
|
|
|
|
.cart-goods-pic {
|
|
width: 200rpx;
|
|
height: 200rpx;
|
|
border-radius: 10rpx;
|
|
margin: 0 20rpx;
|
|
}
|
|
|
|
.msg-top {
|
|
height: 200rpx;
|
|
}
|
|
|
|
.cart-goods-name {
|
|
color: #0A0001;
|
|
font-size: 28rpx;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
display: -webkit-box;
|
|
-webkit-line-clamp: 2;
|
|
-webkit-box-orient: vertical;
|
|
line-height: 40rpx;
|
|
}
|
|
|
|
.cart-goods-spec {
|
|
padding: 0 10rpx;
|
|
background-color: #EFF1F6;
|
|
color: #666666;
|
|
font-size: 20rpx;
|
|
margin-top: 10rpx;
|
|
display: inline-block;
|
|
line-height: 40rpx;
|
|
border-radius: 10rpx;
|
|
}
|
|
|
|
.tip {
|
|
color: #CC1B4F;
|
|
font-size: 18rpx;
|
|
border-radius: 5rpx;
|
|
border: 1rpx solid #CC1B4F;
|
|
line-height: 28rpx;
|
|
padding: 0 8rpx;
|
|
}
|
|
|
|
input {
|
|
min-height: 36rpx;
|
|
}
|
|
}
|
|
}
|
|
|
|
.cart-bottom {
|
|
position: fixed;
|
|
bottom: 0;
|
|
width: 100%;
|
|
height: 100rpx;
|
|
padding: 0 30rpx;
|
|
box-shadow: 0 0 15rpx 1rpx rgba(0, 0, 0, 0.1);
|
|
z-index: 100;
|
|
|
|
button {
|
|
height: 76rpx;
|
|
width: 180rpx;
|
|
}
|
|
}
|
|
|
|
.u-checkbox__label.data-v-54acf820 {
|
|
word-wrap: break-word;
|
|
margin: 0 !important;
|
|
color: #606266;
|
|
font-size: 30rpx;
|
|
}
|
|
|
|
.cuIcon-roundcheckfill,
|
|
.cuIcon-round {
|
|
font-size: 40rpx;
|
|
}
|
|
</style>
|