feat : 使商城列表 商品详情 购物车 的商品数量保持一致

This commit is contained in:
赵毅 2025-07-19 16:28:15 +08:00
parent 7b1dc4a1fa
commit cc1d99ad1c
3 changed files with 745 additions and 620 deletions

View File

@ -1,420 +1,481 @@
<template> <template>
<view> <view>
<div class="header"> <div class="header">
<div class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }"> <div
<div class="searchBox_left" @click="back"> class="searchBox"
<u-icon name="arrow-left" size="20px" color="#000"></u-icon> :style="{ height: localHeight + 'px', paddingTop: top + 'px' }"
</div> >
</div> <div class="searchBox_left" @click="back">
</div> <u-icon name="arrow-left" size="20px" color="#000"></u-icon>
<div class="swiper"> </div>
<swiper :indicator-dots="false" :autoplay="true" :interval="3000" :duration="1000" @change="changeIndex"> </div>
<swiper-item v-for="(item, index) in currentGG.goods_carousel" :key="index"> </div>
<image :src="picUrl + item"></image> <div class="swiper">
</swiper-item> <swiper
</swiper> :indicator-dots="false"
:autoplay="true"
:interval="3000"
:duration="1000"
@change="changeIndex"
>
<swiper-item
v-for="(item, index) in currentGG.goods_carousel"
:key="index"
>
<image :src="picUrl + item"></image>
</swiper-item>
</swiper>
<div class="NumDot"> <div class="NumDot">
{{ currentIndex }} /{{ currentGG.goods_carousel.length }} {{ currentIndex }} /{{ currentGG.goods_carousel.length }}
</div> </div>
</div> </div>
<div class="Money"> <div class="Money">
<div class="MoneyMark"></div>{{ currentGG.sales_price }} <div class="MoneyUnit">/{{ currentGG.goods_unit }} <div class="MoneyMark"></div>
</div> {{ currentGG.sales_price }}
<div class="MoneyUnit">/{{ currentGG.goods_unit }}</div>
<div class="oldMoney">{{ currentGG.market_price }}</div> <div class="oldMoney">{{ currentGG.market_price }}</div>
</div> </div>
<!-- 规格 --> <!-- 规格 -->
<!-- @click="changeGG2(item, index)" :class="index == currentGGIndex ? 'active' : ''"> --> <!-- @click="changeGG2(item, index)" :class="index == currentGGIndex ? 'active' : ''"> -->
<div class="GGBox"> <div class="GGBox">
<div class="GG_left"> <div class="GG_left">
<div class="GG_Item" v-for="(item, index) in info.commodity_goods_info_list" :key="item.id" <div
@click="changeGG(item, index)" :class="index == currentGGIndex ? 'active' : ''"> class="GG_Item"
{{ item.goods_spec }} / {{ item.goods_unit }} v-for="(item, index) in info.commodity_goods_info_list"
</div> :key="item.id"
</div> @click="changeGG(item, index)"
<div class="GG_rigth">{{ info.commodity_goods_info_list.length }}<u-icon size="26rpx" :class="index == currentGGIndex ? 'active' : ''"
name="arrow-right"></u-icon></div> >
</div> {{ item.goods_spec }} / {{ item.goods_unit }}
</div>
</div>
<div class="GG_rigth">
{{ info.commodity_goods_info_list.length }}<u-icon
size="26rpx"
name="arrow-right"
></u-icon>
</div>
</div>
<div class="Tit">{{ currentGG.goods_name }}</div> <div class="Tit">{{ currentGG.goods_name }}</div>
<div class="Msg">{{ currentGG.commodity_brief }}</div> <div class="Msg">{{ currentGG.commodity_brief }}</div>
<div class="GoodsMsg"> <div class="GoodsMsg">商品详情</div>
商品详情
</div>
<div class="Msg_Item"> <div class="Msg_Item">
<div class="Msg_ItemTit">商品编号</div> <div class="Msg_ItemTit">商品编号</div>
<div class="Msg_ItemCon" @click="copys(currentGG.goods_no)">{{ currentGG.goods_no }} <image <div class="Msg_ItemCon" @click="copys(currentGG.goods_no)">
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_copy.png"></image> {{ currentGG.goods_no }}
</div> <image
</div> src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_copy.png"
<div class="Msg_Item"> ></image>
<div class="Msg_ItemTit">规格说明</div> </div>
<div class="Msg_ItemCon">{{ currentGG.goods_spec }}</div> </div>
</div> <div class="Msg_Item">
<div class="Msg_Item"> <div class="Msg_ItemTit">规格说明</div>
<div class="Msg_ItemTit">售卖单位</div> <div class="Msg_ItemCon">{{ currentGG.goods_spec }}</div>
<div class="Msg_ItemCon">{{ currentGG.goods_unit }}</div> </div>
</div> <div class="Msg_Item">
<div class="Msg_ItemTit">售卖单位</div>
<div class="Msg_ItemCon">{{ currentGG.goods_unit }}</div>
</div>
<div class="GoosMsg"> <div class="GoosMsg">
<image v-for="item in currentGG.goods_detail_pic" :src="picUrl + item" mode="widthFix"></image> <image
</div> v-for="item in currentGG.goods_detail_pic"
:src="picUrl + item"
mode="widthFix"
></image>
</div>
<!-- 底部购物车 -->
<div class="Car">
<div class="car_left">
<div class="share" @click="share">
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_share.png"
mode="widthFix"
></image>
分享
</div>
<div class="cars" @click="car">
<u-badge
numberType="limit"
:type="type"
max="99"
:value="carNum"
></u-badge>
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_car.png"
mode="widthFix"
></image>
购物车
</div>
</div>
<!-- 底部购物车 --> <div
<div class="Car"> class="car_right"
<div class="car_left"> v-if="
<div class="share" @click="share"> !info.commodity_goods_info_list[currentGGIndex].cart_count ||
<image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_share.png" info.commodity_goods_info_list[currentGGIndex].cart_count.count == 0
mode="widthFix"></image> "
分享 @click="addCar"
</div> >
<div class="cars" @click="car"> 加入购物车
<u-badge numberType="limit" :type="type" max="99" :value="carNum"></u-badge> </div>
<image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_car.png" <div
mode="widthFix"></image> class="car_right"
购物车 v-if="
</div> info.commodity_goods_info_list[currentGGIndex].cart_count.count > 0
</div> "
>
<u-number-box
v-model="
info.commodity_goods_info_list[currentGGIndex].cart_count.count
"
@change="changeCar"
min="0"
>
<view slot="minus" class="minus">
<u-icon name="minus" size="36" bold></u-icon>
</view>
<text
slot="input"
style="width: 200rpx; text-align: center"
class="input"
>
{{
info.commodity_goods_info_list[currentGGIndex].cart_count.count
}}</text
>
<view slot="plus" class="plus">
<u-icon name="plus" color="#FFFFFF" size="36" bold></u-icon>
</view>
</u-number-box>
</div>
</div>
<div class="car_right" <!-- 分享 -->
v-if="!info.commodity_goods_info_list[currentGGIndex].cart_count || info.commodity_goods_info_list[currentGGIndex].cart_count.count == 0" <div class="shadow" @click.stop="changeShadow" v-if="boxshadow1">
@click="addCar"> <div class="shadowBox1">
加入购物车 <div class="shadowBox1Item" @click="shareFriend">
</div> <image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_WX.png"
<div class="car_right" v-if="info.commodity_goods_info_list[currentGGIndex].cart_count.count > 0"> mode="aspectFill"
></image>
<u-number-box v-model="info.commodity_goods_info_list[currentGGIndex].cart_count.count" 微信好友
@change="changeCar" min="0"> </div>
<view slot="minus" class="minus"> <div class="shadowBox1Item" @click="openSave">
<u-icon name="minus" size="36" bold></u-icon> <image
</view> src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_saveImg.png"
<text slot="input" style="width: 200rpx;text-align: center;" class="input"> mode="aspectFill"
{{ info.commodity_goods_info_list[currentGGIndex].cart_count.count }}</text> ></image>
<view slot="plus" class="plus"> 生成海报
<u-icon name="plus" color="#FFFFFF" size="36" bold></u-icon> </div>
</view> </div>
</u-number-box> </div>
</div> <!-- 海报 -->
</div> <div class="shadow" @click="changeShadow2" v-if="boxshadow2">
<div class="shadowBox2">
<!-- 分享 --> <div class="shadowBox_img">
<div class="shadow" @click.stop="changeShadow" v-if="boxshadow1"> <div class="boxshadow_tit">今日商品推荐</div>
<div class="shadowBox1"> <div class="boxshadow_img">
<div class="shadowBox1Item" @click="shareFriend"> <image
<image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_WX.png" src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_share_img.png"
mode="aspectFill"></image> >
微信好友 </image>
</div> </div>
<div class="shadowBox1Item" @click="openSave"> <div class="line"></div>
<image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_saveImg.png" <div class="shadowBoxInfo">
mode="aspectFill"></image> <div class="shadowboxInfo_left">二维码</div>
生成海报 <div class="shadowboxInfo_right">
</div> <div class="shadowboxInfo_right_1">正鲜生</div>
</div> <div class="shadowboxInfo_right_2">
</div> 长按识别小程序 <br />
<!-- 海报 --> 数量有限马上抢购
<div class="shadow" @click="changeShadow2" v-if="boxshadow2"> </div>
<div class="shadowBox2"> </div>
<div class="shadowBox_img"> </div>
<div class="boxshadow_tit">今日商品推荐</div> </div>
<div class="boxshadow_img"> <div class="shadowBox_btn" @click.stop="saveImg">保存海报</div>
<image </div>
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_share_img.png"> </div>
</image> </view>
</div>
<div class="line"></div>
<div class="shadowBoxInfo">
<div class="shadowboxInfo_left">二维码</div>
<div class="shadowboxInfo_right">
<div class="shadowboxInfo_right_1">正鲜生</div>
<div class="shadowboxInfo_right_2">
长按识别小程序 <br>
数量有限马上抢购</div>
</div>
</div>
</div>
<div class="shadowBox_btn" @click.stop="saveImg">保存海报</div>
</div>
</div>
</view>
</template> </template>
<script> <script>
import { import { apiArr } from "../../../api/shop";
apiArr import { picUrl, menuButtonInfo, request, NavgateTo } from "../../../utils";
} from '../../../api/shop';
import {
picUrl,
menuButtonInfo,
request,
NavgateTo
} from '../../../utils';
export default { export default {
data() { data() {
return { return {
picUrl, picUrl,
top: "", top: "",
localHeight: "", localHeight: "",
carNum: '', carNum: "",
prevCarNum: "", prevCarNum: "",
currentNum: "0",// currentNum: "0", //
type: "error", type: "error",
boxshadow1: false, boxshadow1: false,
boxshadow2: false, boxshadow2: false,
id: "", id: "",
info: "", info: "",
currentIndex: "1",// currentIndex: "1", //
currentGG: "", // currentGG: "", //
currentGGIndex: "", //index currentGGIndex: "", //index
carOrderList: [], carOrderList: [],
} };
}, },
methods: { methods: {
changeIndex(e) {
this.currentIndex = e.detail.current + 1;
},
changeIndex(e) { back() {
this.currentIndex = e.detail.current + 1 uni.navigateBack({
}, delta: 1,
});
},
//
shareFriend() {
this.boxshadow2 = false;
return;
// uniapp
uni.share({
provider: "weixin",
type: "link",
scene: "session",
link: "https://uniapp.dcloud.net.cn/",
title: "商品名称",
imageUrl: "",
success: (res) => {
uni.showToast({
title: "分享成功",
icon: "success",
duration: 2000,
});
this.boxshadow1 = false;
},
fail: (err) => {
console.log("分享失败", err);
this.boxshadow1 = false;
},
});
},
changeShadow() {
this.boxshadow1 = false;
},
openSave() {
this.boxshadow1 = false;
this.boxshadow2 = true;
},
//
saveImg() {
this.boxshadow2 = false;
//
uni.downloadFile({
url: "https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_share_img.png",
success: (res) => {
if (res.statusCode === 200) {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: (res) => {
uni.showToast({
title: "保存成功",
icon: "success",
duration: 2000,
});
},
fail: (err) => {
console.log("保存失败", err);
},
});
}
},
fail: (err) => {
console.log("下载失败", err);
},
});
},
changeShadow2() {
this.boxshadow2 = false;
},
back() { //
uni.navigateBack({ share() {
delta: 1 this.boxshadow1 = true;
}); },
}, //
// getGoodsInfo() {
shareFriend() { request(apiArr.getGoodsInfo, "POST", {
this.boxshadow2 = false id: this.id,
return }).then((res) => {
// uniapp console.log(res);
uni.share({
provider: 'weixin',
type: 'link',
scene: 'session',
link: 'https://uniapp.dcloud.net.cn/',
title: '商品名称',
imageUrl: '',
success: (res) => {
uni.showToast({
title: '分享成功',
icon: 'success',
duration: 2000
});
this.boxshadow1 = false
},
fail: (err) => {
console.log('分享失败', err);
this.boxshadow1 = false
}
});
},
changeShadow() {
this.boxshadow1 = false
},
openSave() {
this.boxshadow1 = false
this.boxshadow2 = true
},
//
saveImg() {
this.boxshadow2 = false
//
uni.downloadFile({
url: 'https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_share_img.png',
success: (res) => {
if (res.statusCode === 200) {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: (res) => {
uni.showToast({
title: '保存成功',
icon: 'success',
duration: 2000
});
},
fail: (err) => {
console.log('保存失败', err);
}
});
}
},
fail: (err) => {
console.log('下载失败', err);
}
});
},
changeShadow2() {
this.boxshadow2 = false
},
// //
share() { res.commodity_goods_info_list.forEach((item) => {
this.boxshadow1 = true item.goods_detail_pic = item.goods_detail_pic.split(",");
}, item.goods_carousel = item.goods_carousel.split(",");
// item.commodity_pic = item.commodity_pic.split(",");
getGoodsInfo() { });
request(apiArr.getGoodsInfo, "POST", {
id: this.id
}).then(res => {
console.log(res);
// //
res.commodity_goods_info_list.forEach(item => { if (this.carOrderList) {
item.goods_detail_pic = item.goods_detail_pic.split(',') this.carOrderList.forEach((items) => {
item.goods_carousel = item.goods_carousel.split(',') res.commodity_goods_info_list.forEach((item) => {
item.commodity_pic = item.commodity_pic.split(',') if (items.goods_id == item.id) {
}); item.cart_count = { count: 0 };
item.cart_count.count = items.count;
}
});
});
}
this.info = res;
this.currentGG = res.commodity_goods_info_list[0];
this.currentGGIndex = 0;
});
},
copys(e) {
uni.setClipboardData({
data: e,
success: (res) => {
uni.showToast({
title: "复制成功",
icon: "success",
duration: 2000,
});
},
});
},
//
changeGG(item, index) {
this.currentGG = item;
this.currentGGIndex = index;
if (this.currentGG.cart_count) {
this.currentNum = this.currentGG.cart_count.count;
} else {
this.currentGG.cart_count = { count: 0 };
}
},
car() {
NavgateTo("../shopCar/index");
},
// //
if (this.carOrderList) { getShopCar() {
this.carOrderList.forEach(items => { request(apiArr.getCarCount, "POST", {}).then((res) => {
res.commodity_goods_info_list.forEach(item => { this.carNum = res.total;
if (items.goods_id == item.id) { this.prevCarNum = res.total;
item.cart_count = {count:0} });
item.cart_count.count = items.count },
}
})
})
}
this.info = res
this.currentGG = res.commodity_goods_info_list[0]
this.currentGGIndex = 0
}) getShopCarList() {
}, request(apiArr.getCar, "POST", {}).then((res) => {
this.carOrderList = res.commodity_cart_list;
});
},
copys(e) { addCar() {
uni.setClipboardData({ let that = this;
data: e, //
success: (res) => { let goods_id_and_count = [];
uni.showToast({ this.info.commodity_goods_info_list[this.currentGGIndex].cart_count = {
title: '复制成功', count: 1,
icon: 'success', };
duration: 2000 this.info.commodity_goods_info_list.forEach((item) => {
}); console.log(item.cart_count);
} goods_id_and_count.push({
}); goods_id: item.id,
}, count: item.cart_count ? item.cart_count.count : 0,
});
});
console.log(goods_id_and_count);
// update
request(apiArr.updateCar, "POST", {
goods_id_and_count,
}).then((res) => {
that.getShopCar();
that.getShopCarList();
});
},
// //
changeGG(item, index) { changeCar(newValue) {
this.currentGG = item // //
this.currentGGIndex = index // this.info.commodity_goods_info_list[this.currentGGIndex].cart_count.count = newValue.value
if (this.currentGG.cart_count) { // //
this.currentNum = this.currentGG.cart_count.count // this.carOrderList.forEach(item => {
} else { // if (item.commodity_goods_info.id == this.info.commodity_goods_info_list[this.currentGGIndex].id) {
this.currentGG.cart_count = { count: 0 } // item.count = newValue.value
} // }
}, // })
car() { // //
NavgateTo('../shopCar/index') // let carNum = 0
}, // this.carOrderList.forEach(item => {
// carNum += item.count
// })
// this.carNum = carNum
//
const params = {
user_id: uni.getStorageSync("userId"),
goods_id_and_count: [
{
goods_id: this.info.commodity_goods_info_list[this.currentGGIndex].id,
count: newValue.value,
},
],
};
request(apiArr.updateCar, "POST", params).then((res) => {
console.log(res);
this.getShopCarList();
uni.showToast({
title: "操作成功!",
success() {},
});
});
},
},
onLoad(options) {
const itemObj = JSON.parse(decodeURIComponent(options.item));
const meun = menuButtonInfo();
this.top = meun.top;
this.localHeight = meun.height;
// this.id = itemObj.id;
getShopCar() { },
request(apiArr.getCarCount, 'POST', {}).then(res => { onReachBottom() {},
this.carNum = res.total onShow() {
this.prevCarNum = res.total this.getShopCarList();
}) this.getGoodsInfo();
}, this.getShopCar();
},
//( id count 0 )
onHide() {
let goods_id_and_count = [];
this.info.commodity_goods_info_list.forEach((item) => {
goods_id_and_count.push({
goods_id: item.id,
count: item.cart_count ? item.cart_count.count : 0,
});
});
getShopCarList() { request(apiArr.updateCar, "POST", {
request(apiArr.getCar, 'POST', {}).then(res => { goods_id_and_count,
this.carOrderList = res.commodity_cart_list });
}) return;
}, },
};
addCar() {
let that = this
//
let goods_id_and_count = []
this.info.commodity_goods_info_list[this.currentGGIndex].cart_count = { count: 1 }
this.info.commodity_goods_info_list.forEach(item => {
console.log(item.cart_count);
goods_id_and_count.push({
goods_id: item.id,
count: item.cart_count ? item.cart_count.count : 0
})
})
console.log(goods_id_and_count);
// update
request(apiArr.updateCar, "POST", {
goods_id_and_count
}).then(res => {
that.getShopCar()
that.getShopCarList()
})
},
//
changeCar(newValue) {
//
this.info.commodity_goods_info_list[this.currentGGIndex].cart_count.count = newValue.value
//
this.carOrderList.forEach(item => {
if (item.commodity_goods_info.id == this.info.commodity_goods_info_list[this.currentGGIndex].id) {
item.count = newValue.value
}
})
//
let carNum = 0
this.carOrderList.forEach(item => {
carNum += item.count
})
this.carNum = carNum
},
},
onLoad(options) {
const meun = menuButtonInfo();
this.top = meun.top;
this.localHeight = meun.height;
this.id = options.id
},
onReachBottom() {
},
onShow() {
this.getShopCarList()
this.getGoodsInfo()
this.getShopCar()
},
//( id count 0 )
onHide() {
let goods_id_and_count = []
this.info.commodity_goods_info_list.forEach(item => {
goods_id_and_count.push({
goods_id: item.id,
count: item.cart_count ? item.cart_count.count : 0
})
})
request(apiArr.updateCar, "POST", {
goods_id_and_count
})
return
},
}
</script> </script>
<style> <style>

View File

@ -90,7 +90,8 @@
<div class="Con"> <div class="Con">
<div class="Con_left"> <div class="Con_left">
<div <div
class="CateItem" :class="item.id === currentLeftCateId ? 'CateItem_active' : ''" class="CateItem"
:class="item.id === currentLeftCateId ? 'CateItem_active' : ''"
v-for="item in leftCateList" v-for="item in leftCateList"
:key="item.id" :key="item.id"
@click="changeLeftCate(item.id)" @click="changeLeftCate(item.id)"
@ -148,19 +149,19 @@
:key="items.id" :key="items.id"
> >
<div class="CateInfo_Item_Box"> <div class="CateInfo_Item_Box">
<div class="CateInfo_Item_left" @click="goods(items.id)"> <div class="CateInfo_Item_left" @click="goods(items)">
<image <image
:src="picUrl + items.commodity_pic" :src="picUrl + items.commodity_pic"
mode="aspectFill" mode="aspectFill"
></image> ></image>
</div> </div>
<div class="CateInfo_Item_right" :class="GGshow ? 'noneBor' : ''"> <div class="CateInfo_Item_right" :class="GGshow ? 'noneBor' : ''">
<div class="CateInfo_Item_right_Tit" @click="goods(items.id)"> <div class="CateInfo_Item_right_Tit" @click="goods(items)">
{{ items.commodity_name }} {{ items.commodity_name }}
</div> </div>
<div <div
class="CateInfo_Item_right_subtit" class="CateInfo_Item_right_subtit"
@click="goods(items.id)" @click="goods(items)"
> >
{{ items.commodity_intro }} {{ items.commodity_intro }}
</div> </div>
@ -175,8 +176,8 @@
> >
<u-number-box <u-number-box
:min="0" :min="0"
v-model="items.quantity" v-model="items.commodity_goods_info_list[0].quantity"
@change="(value) => handleQuantityChange(value,items)" @change="(value) => handleQuantityChange(value, items)"
> >
<view slot="minus" class="minus"> <view slot="minus" class="minus">
<u-icon name="minus" size="20"></u-icon> <u-icon name="minus" size="20"></u-icon>
@ -185,7 +186,11 @@
slot="input" slot="input"
style="width: 50px; text-align: center" style="width: 50px; text-align: center"
class="input" class="input"
>{{ items.quantity ? items.quantity : 0 }}</text >{{
items.commodity_goods_info_list[0].quantity
? items.commodity_goods_info_list[0].quantity
: 0
}}</text
> >
<view slot="plus" class="plus"> <view slot="plus" class="plus">
<u-icon name="plus" color="#FFFFFF" size="20"></u-icon> <u-icon name="plus" color="#FFFFFF" size="20"></u-icon>
@ -226,7 +231,7 @@
<div <div
class="GGItem" class="GGItem"
v-for="ite in items.commodity_goods_info_list" v-for="ite in items.commodity_goods_info_list"
@click="goods(items.id)" @click="goods(items)"
> >
<div class="GGItem_Image"> <div class="GGItem_Image">
<image <image
@ -244,7 +249,7 @@
<u-number-box <u-number-box
v-model="ite.quantity" v-model="ite.quantity"
:min="0" :min="0"
@change="(value) => handleQuantityChange(value,ite)" @change="(value) => handleQuantityChange(value, ite)"
> >
<view slot="minus" class="minus"> <view slot="minus" class="minus">
<u-icon name="minus" size="20"></u-icon> <u-icon name="minus" size="20"></u-icon>
@ -356,7 +361,7 @@ export default {
], ],
rightTopActive: 0, rightTopActive: 0,
currentLeftCateId: null, currentLeftCateId: null,
topShow: false, topShow: false,
GGshow: false, GGshow: false,
@ -369,6 +374,8 @@ currentLeftCateId: null,
tagList: [], tagList: [],
carNum: "", carNum: "",
goodsDetail: [],
}; };
}, },
methods: { methods: {
@ -404,7 +411,7 @@ currentLeftCateId: null,
}, },
// //
goods(e) { goods(e) {
NavgateTo(`../goods/index?id=${e}`); NavgateTo(`../goods/index?item=${JSON.stringify(e)}`);
}, },
// //
@ -417,7 +424,8 @@ currentLeftCateId: null,
console.log(res); console.log(res);
this.CateList = res.commodity_category_list; this.CateList = res.commodity_category_list;
this.firstId = res.commodity_category_list[0].id; this.firstId = res.commodity_category_list[0].id;
this.leftCateList = res.commodity_category_list[0].level_two_category || []; this.leftCateList =
res.commodity_category_list[0].level_two_category || [];
if (this.leftCateList.length > 0) { if (this.leftCateList.length > 0) {
this.currentLeftCateId = this.leftCateList[0].id; this.currentLeftCateId = this.leftCateList[0].id;
this.secondId = this.leftCateList[0].id; this.secondId = this.leftCateList[0].id;
@ -440,10 +448,18 @@ currentLeftCateId: null,
}).then((res) => { }).then((res) => {
res.commodity_list.forEach((item) => { res.commodity_list.forEach((item) => {
item.commodity_info_list.forEach((item) => { item.commodity_info_list.forEach((item) => {
item.commodity_goods_info_list.forEach((param) => {
this.goodsDetail.forEach((goods) => {
if (goods.goods_id === param.id) {
param.quantity = goods.count;
}
});
});
item.isShow = false; item.isShow = false;
}); });
}); });
this.tagList = res.commodity_list; this.tagList = res.commodity_list;
console.log("🚀 ~ getGoodsList ~ this.tagList:", this.tagList)
}); });
}, },
@ -451,6 +467,7 @@ currentLeftCateId: null,
request(apiArr.getCar, "POST").then((res) => { request(apiArr.getCar, "POST").then((res) => {
console.log(res); console.log(res);
this.carNum = res.total; this.carNum = res.total;
this.goodsDetail = res.commodity_cart_list;
}); });
}, },
@ -460,8 +477,11 @@ currentLeftCateId: null,
this.getGoodsList(); this.getGoodsList();
}, },
// //
handleQuantityChange(val,item) { handleQuantityChange(val, item) {
if (item.commodity_goods_info_list.length) { if (
item.commodity_goods_info_list &&
item.commodity_goods_info_list.length
) {
this.goodsId = item.commodity_goods_info_list[0].id; this.goodsId = item.commodity_goods_info_list[0].id;
} else { } else {
this.goodsId = item.id; this.goodsId = item.id;
@ -480,8 +500,7 @@ currentLeftCateId: null,
this.getShopCarList(); this.getShopCarList();
uni.showToast({ uni.showToast({
title: "操作成功!", title: "操作成功!",
success() { success() {},
},
}); });
}); });
}, },
@ -495,6 +514,7 @@ currentLeftCateId: null,
}, },
onShow() { onShow() {
this.getShopCarList(); this.getShopCarList();
this.getGoodsList();
}, },
onReachBottom() { onReachBottom() {
if (this.flag) { if (this.flag) {

View File

@ -1,244 +1,288 @@
<template> <template>
<view> <view>
<div class="header"> <div class="header">
<div class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }"> <div
<div class="searchBox_left" @click="back"> class="searchBox"
<u-icon name="arrow-left" size="20px" color="#000"></u-icon> :style="{ height: localHeight + 'px', paddingTop: top + 'px' }"
</div> >
<div class="searchBox_mid">购物车({{ shopCarTotal }}) </div> <div class="searchBox_left" @click="back">
<div class="searchBox_right"> <u-icon name="arrow-left" size="20px" color="#000"></u-icon>
<u-icon name="arrow-left" size="20px" color="#000"></u-icon>
</div>
</div>
</div> </div>
<div class="searchBox_mid">购物车({{ shopCarTotal }})</div>
<div class="main"> <div class="searchBox_right">
<div class="deleteIcon" @click="deleteItem"> <u-icon name="arrow-left" size="20px" color="#000"></u-icon>
<u-icon name="trash" size="50rpx"></u-icon>
</div>
<div class="goodsList">
<div class="goodsItem" v-for="item, index in shopCarList" :key="item.id">
<div class="goodsItem_left" @click="changeChecked(item, index)">
<image v-if="!item.checked" src="http://192.168.0.172:5500/7.15/shop_checked1.png"></image>
<image v-if="item.checked" src="http://192.168.0.172:5500/7.15/shop_checked2.png"></image>
</div>
<div class="goodsItem_right">
<div class="goodsItem_msg">
<div class="goodsItem_msg_img">
<image :src="picUrl + item.commodity_goods_info.commodity_pic">
</image>
</div>
<div class="goodsItem_msg_right">
<div class="goodsItem_msg_right_tit">{{ item.commodity_goods_info.goods_name }}</div>
<div class="goodsItem_msg_right_subTit">{{ item.commodity_goods_info.goods_intro }}
</div>
<div class="goodsItem_msg_right_msg">
<div class="goodsItem_msg_right_msg_left">
<span></span>{{ item.commodity_goods_info.sales_price }} <span>/{{
item.commodity_goods_info.goods_unit }}</span>
</div>
<div class="goodsItem_msg_right_msg_right">
<u-number-box v-model="item.count" :asyncChange="true" min="0">
<view slot="minus" class="minus" @click="minus(item, index)">
<u-icon name="minus" size="32" bold></u-icon>
</view>
<text slot="input" style="width: 80rpx;text-align: center;" class="input">{{
item.count }}</text>
<view slot="plus" class="plus" @click="add(item, index)">
<u-icon name="plus" color="#FFFFFF" size="32" bold></u-icon>
</view>
</u-number-box>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="footer">
<div class="footer_left">
<div class="footer_all" @click="allChecked">
<image v-if="!isAllchecked"
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_check1.png">
</image>
<image v-if="isAllchecked"
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_check2.png">
</image>
全选
</div>
<div class="footer_total">
<span>合计</span>
{{ shopMoney }}
</div>
</div>
<div class="footer_right" @click="submitOrder">
结算
</div>
</div>
</div> </div>
</div>
</div>
<div class="empty" v-if="false"> <div class="main">
<image src="http://192.168.0.172:5500/7.15/shop_empty.png"></image> <div class="deleteIcon" @click="deleteItem">
<div> <u-icon name="trash" size="50rpx"></u-icon>
啥也没有 <br> </div>
赶紧去shopping吧~
<div class="goodsList">
<div
class="goodsItem"
v-for="(item, index) in shopCarList"
:key="item.id"
>
<div class="goodsItem_left" @click="changeChecked(item, index)">
<image
v-if="!item.checked"
src="http://192.168.0.172:5500/7.15/shop_checked1.png"
></image>
<image
v-if="item.checked"
src="http://192.168.0.172:5500/7.15/shop_checked2.png"
></image>
</div>
<div class="goodsItem_right">
<div class="goodsItem_msg">
<div class="goodsItem_msg_img">
<image :src="picUrl + item.commodity_goods_info.commodity_pic">
</image>
</div>
<div class="goodsItem_msg_right">
<div class="goodsItem_msg_right_tit">
{{ item.commodity_goods_info.goods_name }}
</div>
<div class="goodsItem_msg_right_subTit">
{{ item.commodity_goods_info.goods_intro }}
</div>
<div class="goodsItem_msg_right_msg">
<div class="goodsItem_msg_right_msg_left">
<span></span>{{ item.commodity_goods_info.sales_price }}
<span>/{{ item.commodity_goods_info.goods_unit }}</span>
</div>
<div class="goodsItem_msg_right_msg_right">
<u-number-box
v-model="item.count"
:asyncChange="true"
min="0"
>
<view
slot="minus"
class="minus"
@click="minus(item, index)"
>
<u-icon name="minus" size="32" bold></u-icon>
</view>
<text
slot="input"
style="width: 80rpx; text-align: center"
class="input"
>{{ item.count }}</text
>
<view slot="plus" class="plus" @click="add(item, index)">
<u-icon
name="plus"
color="#FFFFFF"
size="32"
bold
></u-icon>
</view>
</u-number-box>
</div>
</div>
</div>
</div> </div>
</div>
</div> </div>
</div>
</view> <div class="footer">
<div class="footer_left">
<div class="footer_all" @click="allChecked">
<image
v-if="!isAllchecked"
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_check1.png"
>
</image>
<image
v-if="isAllchecked"
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_check2.png"
>
</image>
全选
</div>
<div class="footer_total">
<span>合计</span>
{{ shopMoney }}
</div>
</div>
<div class="footer_right" @click="submitOrder">结算</div>
</div>
</div>
<div class="empty" v-if="false">
<image src="http://192.168.0.172:5500/7.15/shop_empty.png"></image>
<div>
啥也没有 <br />
赶紧去shopping吧~
</div>
</div>
</view>
</template> </template>
<script> <script>
import { import { apiArr } from "../../../api/shop";
apiArr import { picUrl, menuButtonInfo, request, NavgateTo } from "../../../utils";
} from '../../../api/shop';
import {
picUrl,
menuButtonInfo,
request,
NavgateTo
} from '../../../utils';
export default { export default {
data() { data() {
return { return {
picUrl, picUrl,
top: "", top: "",
localHeight: "", localHeight: "",
value: 3, value: 3,
type: "error", type: "error",
shopCarList: [], shopCarList: [],
shopCarTotal: 0, shopCarTotal: 0,
shopMoney: 0, shopMoney: 0,
isAllchecked: false isAllchecked: false,
};
},
methods: {
back() {
NavgateTo("1");
},
submitOrder() {
let arr = [];
this.shopCarList.forEach((item) => {
if (item.checked) {
arr.push(item);
} }
});
NavgateTo(`../submitOrder/index?shopCarList=${JSON.stringify(arr)}`);
}, },
methods: {
back() {
NavgateTo("1")
},
submitOrder() {
let arr = [] getShopCar() {
this.shopCarList.forEach(item => { request(apiArr.getCar, "POST", {}).then((res) => {
if (item.checked) { res.commodity_cart_list.forEach((item) => {
arr.push(item) item.checked = false;
} });
}) this.shopCarTotal = res.total;
this.shopCarList = res.commodity_cart_list;
});
},
NavgateTo(`../submitOrder/index?shopCarList=${JSON.stringify(arr)}`) //
}, changeChecked(item, index) {
this.shopCarList[index].checked = !this.shopCarList[index].checked;
this.calcTotal();
//
this.isAllchecked = this.shopCarList.every((item) => item.checked);
},
//
allChecked() {
this.isAllchecked = !this.isAllchecked;
// Bug !this.allChecked !this.isAllchecked
if (this.isAllchecked) {
this.shopCarList.forEach((item) => {
item.checked = true;
});
} else {
this.shopCarList.forEach((item) => {
item.checked = false;
});
}
this.calcTotal();
},
//
calcTotal() {
let total = 0;
this.shopCarList.forEach((item) => {
console.log(item);
getShopCar() { if (item.checked) {
request(apiArr.getCar, 'POST', {}).then(res => { total += item.commodity_goods_info.sales_price * item.count;
res.commodity_cart_list.forEach(item => { }
item.checked = false });
}); this.shopMoney = total;
this.shopCarTotal = res.total },
this.shopCarList = res.commodity_cart_list
})
},
// minus(item, index) {
changeChecked(item, index) { let that = this;
this.shopCarList[index].checked = !this.shopCarList[index].checked if (item.count === 1) {
this.calcTotal() request(apiArr.deleteCar, "POST", {
// ids: [item.id],
this.isAllchecked = this.shopCarList.every(item => item.checked) }).then((res) => {
}, that.shopCarList.splice(index, 1);
// that.calcTotal();
allChecked() { });
this.isAllchecked = !this.isAllchecked }
// Bug !this.allChecked !this.isAllchecked this.shopCarList[index].count = this.shopCarList[index].count - 1;
if (this.isAllchecked) { this.handleQuantityChange(this.shopCarList[index].count , this.shopCarList[index])
this.shopCarList.forEach(item => { this.calcTotal();
item.checked = true },
}); add(item, index) {
} else { this.shopCarList[index].count = this.shopCarList[index].count + 1;
this.shopCarList.forEach(item => { this.handleQuantityChange(this.shopCarList[index].count , this.shopCarList[index])
item.checked = false this.calcTotal();
}); },
}
this.calcTotal() deleteItem() {
}, let that = this;
// uni.showModal({
calcTotal() { title: "提示",
content: "确定删除所选商品吗",
let total = 0 success: function (res) {
this.shopCarList.forEach(item => { if (res.confirm) {
console.log(item); let ids = [];
that.shopCarList.forEach((item) => {
if (item.checked) { if (item.checked) {
total += item.commodity_goods_info.sales_price * item.count ids.push(item.id);
} item.checked = false;
}); }
this.shopMoney = total
},
minus(item, index) {
let that = this
if (item.count === 1) {
request(apiArr.deleteCar, "POST", {
ids: [item.id]
}).then(res => {
that.shopCarList.splice(index, 1)
that.calcTotal()
})
}
this.shopCarList[index].count = this.shopCarList[index].count - 1
this.calcTotal()
},
add(item, index) {
this.shopCarList[index].count = this.shopCarList[index].count + 1
this.calcTotal()
},
deleteItem() {
let that = this
uni.showModal({
title: '提示',
content: '确定删除所选商品吗',
success: function (res) {
if (res.confirm) {
let ids = []
that.shopCarList.forEach(item => {
if (item.checked) {
ids.push(item.id)
item.checked = false
}
})
request(apiArr.deleteCar, "POST", {
ids
}).then(res => {
uni.showToast({
title: '删除成功',
duration: 2000
});
that.getShopCar()
that.calcTotal()
}).catch(err => {
console.log(err);
})
} else if (res.cancel) {
console.log('用户点击取消');
}
}
}); });
request(apiArr.deleteCar, "POST", {
ids,
})
.then((res) => {
uni.showToast({
title: "删除成功",
duration: 2000,
});
that.getShopCar();
that.calcTotal();
})
.catch((err) => {
console.log(err);
});
} else if (res.cancel) {
console.log("用户点击取消");
}
}, },
});
}, },
onLoad(options) { //
const meun = menuButtonInfo(); handleQuantityChange(val, item) {
this.top = meun.top; const params = {
this.localHeight = meun.height; user_id: uni.getStorageSync("userId"),
this.getShopCar() goods_id_and_count: [
{
goods_id: item.goods_id,
count: val,
},
],
};
request(apiArr.updateCar, "POST", params).then((res) => {
console.log(res);
uni.showToast({
title: "操作成功!",
success() {},
});
});
}, },
onReachBottom() { },
onLoad(options) {
}, const meun = menuButtonInfo();
} this.top = meun.top;
this.localHeight = meun.height;
this.getShopCar();
},
onReachBottom() {},
};
</script> </script>
<style> <style>