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.
 
 
 
 
 
 

288 lines
6.0 KiB

<template>
<div class="shop app_content">
<!-- 导航栏 -->
<div class="header_body">
<header-nav :leftArrow="false" titelText="购物车"></header-nav>
</div>
<!-- 中间 -->
<div class="shop-center">
<lodding-card :isLodding="isLodding">
<van-pull-refresh v-model="refreshLoad" @refresh="onRefresh" class="refresh_box">
<div class="refresh_content" v-if="data?.cartList.length">
<div class="goods_box" v-for="(item, index) in data?.cartList" :key="index">
<van-swipe-cell class="swipe_cell">
<div class="card_box">
<van-checkbox style="margin-left: 0.27rem" v-model="item.checked"
@change="oneCheckbox(item)"></van-checkbox>
<van-card class="card_body" :min="1" :max="999" centered :desc="item?.desc"
:title="item?.name" :thumb="item?.img" @click.stop="goto($event, item)">
<template #price>
<div style="color: red">¥ {{ item?.price }}</div>
</template>
<template #footer>
<van-stepper v-model="item.num" @plus="plus(item)" @minus="minus(item)"
@blur="stpBlur(item)" @overlimit="stplimit" :min="1" :max="99" theme="round"
button-size="22" />
</template>
</van-card>
</div>
<template #right>
<div style="height: 100%">
<van-button style="height: 100%" square @click="delGoods(item)" type="danger"
text="删除" />
</div>
</template>
</van-swipe-cell>
</div>
</div>
<van-empty v-else class="no_data" description="暂无数据" />
</van-pull-refresh>
</lodding-card>
</div>
<!-- 底部 -->
<div class="shop_footer_body">
<van-submit-bar :price="totalPrice" button-text="提交订单" class="footer-one-btn" @submit="onSubmit">
<van-checkbox v-model="allchecked" @click="allCheckbox(allchecked)">全选</van-checkbox>
</van-submit-bar>
<footer-nav></footer-nav>
</div>
</div>
</template>
<script setup name="Shop">
import { showToast } from "vant"; // 引入提示组件
import { setGoodsNum } from "@/util/util"; // 导出工具类
const { useCommon, useShopCard } = $globalStore;
const router = useRouter();
let allchecked = ref(false); // 是否全选
let refreshLoad = ref(false); // 是否加载中
let isLodding = ref(true); // lodding标识
let totalPrice = ref(0); // 总钱数
let data = reactive({
cartList: [],
}); // 列表
//提交订单
const onSubmit = () => { };
//下拉刷新
const onRefresh = () => {
allchecked.value = false;
getCard();
};
//计算购物车数量
const calculationNum = () => {
let num = 0;
data.cartList.forEach((item) => {
num += parseInt(item?.num);
});
setGoodsNum(num);
};
//计算价格
const calculation = () => {
let res = 0;
data.cartList.forEach((item) => {
if (item?.checked) {
res += parseFloat(item?.num * parseFloat(item?.price));
}
});
calculationNum();
return isNaN(res) ? 0 : res.toFixed(2).replace(/\./, "");
};
//计算与总计
const handlerFc = () => {
calculation();
totalPrice.value = parseFloat(calculation());
};
//全选择
const allCheckbox = (val) => {
nextTick(() => {
data.cartList = data?.cartList.map((item) => {
return {
...item,
checked: val,
};
});
totalPrice.value = parseFloat(calculation());
});
};
//单个选
const oneCheckbox = (item) => {
data.cartList.forEach((it) => {
if (it?.id == item?.id) {
it.checked = item?.checked;
}
});
totalPrice.value = parseFloat(calculation());
allchecked.value = data.cartList.every((item) => {
return item.checked;
});
};
//加
const plus = async (item) => {
let res = await changeGoods({ id: item.id });
if (res.code === 20000) {
handlerFc();
} else {
item.num -= 1;
showToast(res.msg);
}
};
//减
const minus = async (item) => {
let res = await changeGoods({ id: item?.id });
if (res.code === 20000) {
handlerFc();
} else {
item.num += 1;
showToast(res.msg);
}
};
//删除商品
const delGoods = async (item) => {
const res = await useShopCard.delGoods({ id: item?.id });
if (res.code === 20000) {
data.cartList = data?.cartList.filter((it) => {
return it.id != item?.id;
});
nextTick(() => {
handlerFc();
});
allchecked.value = data?.cartList.length
? data.cartList.every((item) => {
return item?.checked;
})
: false;
}
};
//输入框失去焦点
const stpBlur = async (item) => {
let res = await changeGoods({ id: item?.id });
if (res?.code === 20000) {
handlerFc();
} else {
showToast(res?.msg);
}
};
// 最大、最小时提示
const stplimit = (e) => {
let tip = {
plus: "增加",
minus: "减少",
};
showToast(`宝贝不能再${tip[e]}`);
};
//获取购物车数据
const getCard = async () => {
const res = await useShopCard.getCard();
if (res?.code === 20000) {
data.cartList = res?.data;
}
isLodding.value = false;
refreshLoad.value = false;
};
//点击加、减、输入框处理
const goto = (e, item) => {
let target = e?.srcElement || e?.target;
if (!["BUTTON", "INPUT"].includes(target?.tagName)) {
router.push({
name: "goodsDetail",
query: {
goodsId: item?.id,
},
});
}
};
// 操作购物车数量接口
const changeGoods = async (parmas) => {
return await useShopCard.changeGoods(parmas);
};
onMounted(() => {
getCard();
});
onActivated(() => {
if (useCommon.is_reload_card.value) {
getCard();
}
});
onDeactivated(() => {
useCommon.SET_RELAOD_SHOP(false);
});
</script>
<style lang="less" scoped>
.shop {
height: 100%;
display: flex;
flex-direction: column;
overflow: hidden;
background-color: #f4f4f4;
.header_body {
height: 1.33rem;
}
.shop-center {
flex: 1;
overflow-y: scroll;
position: relative;
.goods_box {
display: flex;
background-color: #fff;
margin: 0.27rem;
border-radius: 0.27rem;
.swipe_cell {
width: 100%;
}
.card_box {
display: flex;
width: 100%;
.card_body {
background-color: #fff;
border-radius: 0.27rem;
flex: 1;
}
}
}
}
.shop_footer_body {
//height: 2.67rem;
position: relative;
.footer-one-btn {
height: 1.33rem;
bottom: 1.34rem;
}
}
}
</style>