Files
frontend-app/pages/shopping_cart/shopping_cart.vue
T
2025-03-20 08:46:07 +08:00

440 lines
11 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
:style="{'height':isDataNull ? 'calc(100vh - 134rpx)':'calc(100vh - 256rpx)'}"
class="shopping_cart_warp"
>
<view class="shopping_cart_header">
<view class="cart">购物车({{shoppingTotal}})</view>
<view class="enit_but" @click="isEdit = true">编辑</view>
</view>
<!-- 购物车列表 -->
<view
class="shopping_cart_content"
>
<view v-if="!isDataNull" class="shopping_cart_content_item" v-for="(item,index) in shoppingList" :key="item.id" >
<!-- 头部 -->
<up-checkbox
:customStyle="{marginBottom: '8px'}"
name="isCheck"
usedAlone
v-model:checked="item.isCheck"
shape="circle"
activeColor="#FF7C41"
size="19"
iconSize="18"
>
<template #label>
<view class="content_item_header">
<up-image :src="item.shopLogo ?item.shopLogo :'/static/shopping/store.png'" width="22" height="22" bgColor="#f1f6ff00"></up-image>
<view class="order_product_title">{{item.shopName}}{{item.id}}</view>
</view>
</template>
</up-checkbox>
<view >
<view class="content_item_info" v-for="(pItem,pIndex) in item.product" :key="pItem.id">
<up-checkbox
:customStyle="{marginBottom: '8px'}"
name="isCheck"
usedAlone
v-model:checked="pItem.isCheck"
shape="circle"
activeColor="#FF7C41"
size="19"
iconSize="18"
:disabled="!pItem.isAvail"
>
</up-checkbox>
<view class="info_item">
<up-image :src="pItem.mainGraph" width="100" height="100" bgColor="#f1f6ff00"></up-image>
<view class="content_info">
<view class="shopping_content_info_title">{{pItem.name}}</view>
<view class="content_info_description">
{{pItem.goodsSpece}}
</view>
<view class="shopping_info_amount">
<view>
<view style="color: #FF7C41FF;">
<text style="font-size: 22rpx;">¥</text>
<text style="font-size: 32rpx;">{{pItem.unitPrice}}</text>
</view>
<view class="shopping_info_amount_original">¥{{pItem.unitPrice}}</view>
</view>
<view>
<view class="shopping_info_quantity">
<view class="quantity_but" @click="quantityFun('minus',index,pIndex,pItem.id)">-</view>
<view class="quantity_value">{{pItem.buyNum}}</view>
<view class="quantity_but" @click="quantityFun('add',index,pIndex,pItem.id)">+</view>
</view>
<view v-if="!pItem.isAvail" class="insufficient_stock">库存不足</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view v-else class="not_order_warp">
<up-image src="/static/common/not_shopping.png" width="80" height="80" bgColor="#f1f6ff00"></up-image>
<view class="not_order_msg_warp">购物车是空的</view>
</view>
<choiceness/>
</view>
<!-- 操作按钮 -->
<view v-if="!isDataNull">
<view class="shopping_cart_but">
<view class="shopping_cart_but_total">
<up-checkbox
name="isAll"
usedAlone
v-model:checked="isAll"
shape="circle"
activeColor="#FF7C41"
size="19"
iconSize="18"
@change="isAllChange"
>
<template #label>
<text style="font-size: 26rpx;color: #444444;">全选</text>
</template>
</up-checkbox>
<text style="margin-left: 20rpx;font-size: 24rpx;color: #444444;">合计:</text>
<text style="font-size: 24rpx;">¥</text>
<text style="font-size: 32rpx;">2000.00</text>
</view>
<view v-if="isEdit" class="delete_but_css" @click="deleteShopping">
删除
</view>
<view v-else class="add_but_css" @click="settleShopping">
结算(2)
</view>
</view>
</view>
<up-toast ref="uToastRef"></up-toast>
</view>
</template>
<script>
import choiceness from '@/components/choiceness/choiceness.vue';
import { getCartList,updateGoodsNum,removeGoods } from '@/api/cart.js';
export default {
components:{choiceness},
data() {
return {
shoppingTotal:0,// 总条数
setShoppingList:[],
isDataNull:false,// 数据是否为空
shoppingList:[],// 购物车列表
isEdit:false,// 是否编辑
isAll:false,// 是否全选
}
},
mounted() {
this.getCartList();
},
methods: {
/**
* 查询购物车列表
*/
async getCartList(){
const resp = await getCartList();
if(resp && resp.bizcode === 100){
// 处理了后的数据
const data = this.transformedArray(resp.data);
this.shoppingTotal = resp.data.length;
this.shoppingList = data;
}
},
// 处理购物车的数据
transformedArray(originalArray){
const newOriginalArray = [];
originalArray.map(curr=>{
console.log("currcurrcurrcurr",curr);
const existingShop = newOriginalArray.find(shop => shop.shopId === curr.shopId && shop.shopName === curr.shopName);
if (existingShop) {
// 如果商店已存在,则向 productObj 数组中添加新产品对象
existingShop.product.push({
id: curr.id,
goodsId: curr.goodsId, // 商品ID
name: curr.name, // 商品名称
mainGraph: curr.mainGraph,// 主图
buyNum: curr.buyNum,// 数量
unitPrice: curr.unitPrice,// 商品单价
goodsSpece: curr.goodsSpece,// 规格
specsId: curr.specsId,// 规格Id
isCheck:false,// 用作于全选
isAvail:curr.isAvail,// 是否有库存
});
} else {
// 如果商店不存在,则创建一个新商店对象,并初始化 productObj 数组
newOriginalArray.push({
isCheck:false,// 用作于全选
shopId: curr.shopId,
shopName: curr.shopName,
name: curr.name,
shopLogo: curr.shopLogo,
product: [{
id: curr.id,
goodsId: curr.goodsId, // 商品ID
name: curr.name, // 商品名称
mainGraph: curr.mainGraph,// 主图
buyNum: curr.buyNum,// 数量
unitPrice: curr.unitPrice,// 商品单价
goodsSpece: curr.goodsSpece,// 规格
specsId: curr.specsId,// 规格Id
isCheck:false,// 用作于全选
isAvail:curr.isAvail,// 是否有库存,用作于全选
}]
});
}
})
return newOriginalArray;
},
/**
* 数量进行增加删除
* @param {Object} type 区分是 + 还是 -
* @param {Object} pItem 父节点数据,用作与从新修改数据
* @param {Object} cItem 需要修改的数据节点
*/
async quantityFun(type,index,pIndex,id){
let currentQuantity = this.shoppingList[index].product[pIndex].buyNum;// 当前数量
if(type === "minus"){
if(currentQuantity === 1){
this.$refs.uToastRef.show({
type: 'warring',
message: "宝贝数量不能在减少啦~",
});
return;
}else{
currentQuantity = currentQuantity - 1;
}
}else if(type === "add"){
// 需要判断一下库存
currentQuantity = currentQuantity + 1;
}
const params={
id,
goodsNum:currentQuantity,
}
const result = await updateGoodsNum(params);
console.log("result",result);
if(result && result.bizcode === 100){
this.shoppingList[index].product[pIndex].buyNum = currentQuantity;
}
},
/**
* 结算订单
*/
settleShopping(){
console.log("结算订单....")
const deleteId = this.getCheckList();
if(!deleteId || deleteId.length === 0){
this.$refs.uToastRef.show({
type: 'warring',
message: "请先选择需要结算的商品",
});
return;
}
this.isAll = false;
this.selectCheck(false);
uni.navigateTo({
url:"/pages/order_submit/order_submit?ids="+deleteId.join(","),
})
},
/**
* 删除选中的
*/
deleteShopping(){
const then = this;
uni.showModal({
title: '提示',
content: '您确定要删除选中的所有商品吗?',
success: function (res) {
if (res.confirm) {
then.deleteShoppingFun();
}
}
});
},
// 删除选中的
async deleteShoppingFun(){
const deleteId = this.getCheckList();
if(!deleteId || deleteId.length === 0){
this.$refs.uToastRef.show({
type: 'warring',
message: "请先选择需要删除的商品",
});
return;
}
const params={
ids:deleteId.join(","),
}
const result = await removeGoods(params);
if(result && result.bizcode === 100){
this.isEdit = false;
this.isAll = false;
this.selectCheck(false);
this.$refs.uToastRef.show({
type: 'success',
message: "删除成功",
});
this.getCartList();
}else{
this.$refs.uToastRef.show({
type: 'error',
message: "删除失败",
});
}
},
// 获取选中的数据
getCheckList(){
const shoppingList = this.shoppingList;
const deleteId=[];
shoppingList.map(item=>{
if(item.product && item.product.length!==0){
item.product.map(pItem=>{
if(pItem.isCheck){
deleteId.push(pItem.id);
}
})
}
})
return deleteId;
},
// 全部选中 or 全部取消选中
isAllChange(val){
this.selectCheck(val);
},
/**
* 编辑是否选中
*/
selectCheck(isAll){
const currentShoppingList = this.shoppingList;
currentShoppingList.map(item=>{
if(isAll){
item.isCheck = true;
}else{
item.isCheck = false;
}
if(item.product && item.product.length!==0){
if(isAll){
item.product.forEach(o => o.isCheck=true);
}else{
item.product.forEach(o => o.isCheck=false);
}
}
})
this.shoppingList = currentShoppingList;
},
}
}
</script>
<style lang="scss" scoped>
.shopping_cart_warp{
// height: calc(100vh - 256rpx);
background-color: $app-bj;
padding: 104rpx 30rpx 30rpx;
overflow: hidden;
}
.shopping_cart_header{
display: flex;
justify-content: space-between;
color: #222222;
.cart{
font-weight: bold;
font-size: 38rpx;
}
.enit_but{
font-weight: 500;
font-size: 28rpx;
}
}
.shopping_cart_content{
margin-top: 30rpx;
height: calc(100vh - 304rpx);
overflow-y: auto;
.shopping_cart_content_item{
background-color: #FFFFFF;
border-radius: 30rpx;
padding: 30rpx;
margin-bottom: 20rpx;
.content_item_header{
display: flex;
}
.order_product_title{
margin-left: 10rpx;
}
.info_item{
display: flex;
margin-top: 10rpx;
width: calc(100% - 40rpx);
}
.content_info{
margin-left: 10rpx;
}
.shopping_content_info_title{
font-weight: bold;
font-size: 28rpx;
color: #272727;
}
.shopping_info_amount{
display: flex;
justify-content: space-between;
margin-top: 20rpx;
}
.shopping_info_amount_original{
font-size: 24rpx;
color: #999999;
text-decoration-line: line-through;
}
.insufficient_stock{
text-align: center;
color: #9E9E9E;
font-size: 22rpx;
margin-top: 4rpx;
}
}
.content_item_info{
display: flex;
}
}
.shopping_cart_but{
position: fixed;
bottom: 0;
left: 0;
width: calc(100% - 40rpx);
background: #FFFFFF;
box-shadow: 0rpx -1rpx 0rpx 0rpx #EEEEEE;
height: 84rpx;
display: flex;
justify-content: space-between;
padding: 20rpx;
align-items: center;
.shopping_cart_but_total{
font-weight: bold;
color: $app-bt-bj;
display: flex;
align-items: center;
}
.add_but_css{
height: 38rpx;
width: 226rpx;
}
.delete_but_css{
width: 226rpx;
}
}
</style>