deming/pageC/cart/index.vue
2020-07-03 17:44:58 +08:00

380 lines
9.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="cart">
<u-checkbox-group class="cart-main" @change="storeChange">
<view v-for="(store, s_index) in list" :key="s_index" class="cart-item">
<view class="store">
<u-checkbox v-model="store.checked" shape="circle" active-color="#FF780F" icon-size="35" :name="s_index" @change="storeaAloneChange"></u-checkbox>
<view class="name">
<image :src="store.store_avatar"></image>
<view>{{ store.store_name }}</view>
</view>
</view>
<view class="goods">
<u-checkbox-group @change="goodsChange($event, s_index)">
<view v-for="(goods, g_index) in store.goods" :key="g_index" class="goods-item">
<u-checkbox v-model="goods.checked" shape="circle" active-color="#FF780F" icon-size="35" :name="g_index" ></u-checkbox>
<image :src="goods.goods_image"></image>
<view class="info">
<view class="name u-line-2">{{ goods.goods_name }}</view>
<view class="cart-info">
<view class="price">{{ goods.goods_price }}</view>
<u-number-box :input-width="38" :input-height="39" :size="22" bg-color="#FFFFFF" :disabled-input=true color="#FF780F" :index="goods.cart_id" @minus="reduce" @plus="plus" v-model="goods.goods_num"></u-number-box>
</view>
</view>
</view>
</u-checkbox-group>
</view>
</view>
</u-checkbox-group>
<view class="balance">
<u-checkbox-group>
<u-checkbox v-model="checkedAll" shape="circle" active-color="#FF780F" icon-size="35" label-size="30" @change="totalChange">
全选
</u-checkbox>
</u-checkbox-group>
<view class="total-price" v-if="status == '编辑'">
<view class="title">合计</view>
<view class="value">{{ totalPrice }}</view>
</view>
<view class="cart-btn" v-if="status == '编辑'" @click="settlementOrder">结算</view>
<view class="delete-btn" v-if="status == '完成'" @click="deleteGoods">删除</view>
<u-toast ref="uToast" />
</view>
</view>
</template>
<script>
export default {
data() {
return {
status: '编辑',
list: [],
checkedAll: false,
checkedGoods: [],
totalPrice: '0.00',
}
},
watch: {
list: {
handler(cart){
let checkedGoods = [];
cart.forEach(store => {
let temp = store.goods.filter(goods => {
return goods.checked;
})
checkedGoods = checkedGoods.concat(temp);
})
// console.log(checkedGoods);
this.checkedGoods = checkedGoods;
this.calculatePrice();
},
deep: true
}
},
onShow() {
this.getCartList();
},
methods: {
// 计算价格
calculatePrice() {
// console.log(this.checkedGoods);
let temp = 0;
this.checkedGoods.forEach(item => {
temp += item.goods_num * (item.goods_price * 100) / 100;
})
this.totalPrice = temp.toFixed(2);
},
// 结算
settlementOrder() {
// 拼接后端需要的数据形式
let id = [], temp = '';
this.checkedGoods.forEach(item => {
temp = item.cart_id + '|' + item.goods_num;
id.push(temp);
temp = '';
})
// console.log(id);
this.$u.api.settlementOrder({ cart_id: id }).then(res => {
if(res.errCode == 0) {
this.$u.route({
url: '/pageC/cart/ConfirmOrder',
params: {
info: JSON.stringify(res.data),
}
})
}
})
},
getCartList() {
this.$u.api.getCartTreeList().then(res => {
if (res.errCode == 0) {
let list = res.data.store_cart_list;
list.forEach((item, l_index) => {
// 判断有无 checked 属性,如果有取值再赋值, 没有给默认值 false
Object.assign(item, { checked: this.list.length ? this.list[l_index].checked : false });
item.goods.forEach((goods, g_index) => {
Object.assign(goods, { checked: this.list.length ? this.list[l_index].goods[g_index].checked : false });
})
})
// console.log(list);
this.list = list;
}
})
},
deleteGoods() {
if(!this.checkedGoods.length) return false;
let id = [];
this.checkedGoods.forEach(item => {
id.push(item.cart_id);
})
// console.log(id);
this.$u.api.deleteCart({ id }).then(res => {
if (res.errCode == 0) {
if(!res.data.msg) {
this.getCartList();
} else {
this.$refs.uToast.show({
title: res.data.msg,
type: 'error',
})
}
}
})
},
reduce(e) {
this.cartUpdateNumber(e.index, e.value);
},
plus(e) {
this.cartUpdateNumber(e.index, e.value);
},
async cartUpdateNumber(id, number) {
await this.$u.api.cartUpdateNumber({
cart_id: id,
quantity: number,
}).then(res => {
this.getCartList();
}).catch(() => {
this.geCartList();
})
},
totalChange(e) {
// 切换所有商品的状态
this.list.forEach(store => {
store.checked = e.value;
store.goods.forEach(goods => {
goods.checked = store.checked;
})
})
},
storeChange() {
// 判断所有商家状态
let checked = true;
this.list.forEach(item => {
if(!item.checked) checked = false;
})
this.checkedAll = checked;
},
storeaAloneChange(e) {
// 切换当前商家的商品状态
this.list[e.name].goods.forEach(goods => {
goods.checked = e.value;
})
},
goodsChange(...value) {
// console.log(value)
// 判断商品是否全选
let checked = true;
this.list[value[1]].goods.forEach(item => {
if(!item.checked) checked = false;
})
this.list[value[1]].checked = checked;
this.storeChange();
}
},
onNavigationBarButtonTap(btn) {
// console.log(btn);
if(btn.index == 0){
let pages = getCurrentPages();
let page = pages[pages.length - 1];
// #ifdef APP-PLUS
let currentWebview = page.$getAppWebview();
let titleObj = currentWebview.getStyle().titleNView;
console.log(JSON.stringify(titleObj.buttons[0]));
if (!titleObj.buttons) {
return;
}
if(titleObj.buttons[0].text == '编辑'){
titleObj.buttons[0].text = "完成";
}else{
titleObj.buttons[0].text = "编辑";
}
currentWebview.setStyle({
titleNView: titleObj
});
this.status = titleObj.buttons[0].text;
// #endif
}
}
};
</script>
<style lang="scss" scoped>
.cart {
padding-bottom: 100rpx;
.cart-main {
display: block;
.cart-item {
padding: 40rpx 30rpx;
.store {
display: flex;
align-items: center;
margin-bottom: 20rpx;
.u-checkbox {
margin-right: 20rpx;
}
.name {
display: flex;
align-items: center;
> image {
width: 60rpx;
height: 60rpx;
border-radius: 50%;
// border: 1rpx solid #000;
margin-right: 15rpx;
}
> view {
font-size: 28rpx;
color: rgba(51,51,51,1);
}
}
}
.goods {
.u-checkbox-group {
display: flex;
flex-direction: column;
.goods-item {
display: flex;
align-items: center;
&:not(:last-child) {
margin-bottom: 20rpx;
}
> image {
margin: 0 30rpx 0 20rpx;
width: 180rpx;
height: 160rpx;
border-radius: 10rpx;
background-color: aqua;
flex-shrink: 0;
}
.info {
width: 418rpx;
height: 160rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
.name {
font-size: 30rpx;
color: rgba(51,51,51,1);
}
.cart-info {
display: flex;
align-items: center;
justify-content: space-between;
.price {
font-size: 30rpx;
font-weight: 500;
color: rgba(255,49,49,1);
}
.u-numberbox {
border: 1rpx solid rgba(217,215,215,1);
border-radius:4px;
/deep/ .u-number-input {
margin: 0;
color: #333 !important;
border: 1rpx #D9D7D7 solid {
top: 0px;
bottom: 0px;
}
}
}
// .num {
// display: flex;
// width: 118rpx;
// height: 39rpx;
// border: 1rpx solid rgba(217,215,215,1);
// border-radius:4px;
// .reduce, .increase {
// flex: 1;
// font-size: 11rpx;
// color: #FF780F;
// line-height: 39rpx;
// text-align: center;
// }
// .value {
// flex: 1;
// font-size: 22rpx;
// color:rgba(51,51,51,1);
// line-height: 39rpx;
// text-align: center;
// border: 1rpx #D9D7D7 solid {
// top: 0px;
// bottom: 0px;
// }
// }
// }
}
}
}
}
}
}
}
.balance {
position: fixed;
bottom: 0;
left: 0;
z-index: 9;
width: 100%;
height: 98rpx;
background: rgba(255,255,255,1);
display: flex;
align-items: center;
padding: 30rpx;
.total-price {
margin-left: auto;
font-size: 30rpx;
display: flex;
align-items: center;
.title {
color: #333333;
}
.value {
color: #FF3131;
}
}
.cart-btn {
margin-left: 50rpx;
justify-items: flex-end;
width: 160rpx;
height: 60rpx;
background: rgba(255,120,15,1);
border-radius: 30rpx;
font-size: 30rpx;
color: rgba(255,255,255,1);
line-height: 60rpx;
text-align: center;
}
.delete-btn {
margin-left: auto;
width: 160rpx;
height: 60rpx;
background: rgba(255,49,49,1);
border-radius: 30rpx;
font-size: 30rpx;
color: rgba(255,255,255,1);
line-height: 60rpx;
text-align: center;
}
}
}
</style>