秦佳浩 2 months ago
commit 220d7795d9

@ -1,82 +1,86 @@
<template> <template>
<!-- 页面的最外层容器用于包裹整个购物车页面内容 -->
<view class="container"> <view class="container">
<!-- 商品列表区域用于展示购物车中的商品信息 -->
<view class="prod-list"> <view class="prod-list">
<block <!-- 使用v-for循环遍历shopCartItemDiscounts数组scIndex为当前项的索引每个元素对应一组商品相关的数据可能是不同优惠规则下的商品集合等情况 -->
v-for="(item, scIndex) in shopCartItemDiscounts" <block v-for="(item, scIndex) in shopCartItemDiscounts" :key="scIndex">
:key="scIndex"
>
<view class="prod-block"> <view class="prod-block">
<view <!-- 如果当前商品组有对应的优惠信息chooseDiscountItemDto存在则展示优惠提示信息 -->
v-if="item.chooseDiscountItemDto" <view v-if="item.chooseDiscountItemDto" class="discount-tips">
class="discount-tips" <!-- 展示优惠规则文本通过wxs.parseDiscount函数对优惠规则进行解析处理后展示 -->
>
<text class="text-block"> <text class="text-block">
{{ wxs.parseDiscount(item.chooseDiscountItemDto.discountRule) }} {{ wxs.parseDiscount(item.chooseDiscountItemDto.discountRule) }}
</text> </text>
<!-- 展示详细的优惠信息文本通过wxs.parseDiscountMsg函数结合优惠规则所需金额优惠金额等数据进行解析展示 -->
<text class="text-list"> <text class="text-list">
{{ {{
wxs.parseDiscountMsg(item.chooseDiscountItemDto.discountRule, item.chooseDiscountItemDto.needAmount, item.chooseDiscountItemDto.discount) wxs.parseDiscountMsg(item.chooseDiscountItemDto.discountRule, item.chooseDiscountItemDto.needAmount, item.chooseDiscountItemDto.discount)
}} }}
</text> </text>
</view> </view>
<block <!-- 内层v-for循环遍历当前商品组中的每个具体商品prod代表每个商品对象index为商品在当前组内的索引 -->
v-for="(prod, index) in item.shopCartItems" <block v-for="(prod, index) in item.shopCartItems" :key="index">
:key="index"
>
<view class="item"> <view class="item">
<!-- 商品选择按钮所在的容器 -->
<view class="btn"> <view class="btn">
<label> <label>
<checkbox <!-- 单个商品的选择框绑定了一些自定义属性和事件 -->
:data-scindex="scIndex" <checkbox :data-scindex="scIndex" <!-- -->
:data-index="index" :data-index="index" <!-- 传递当前商品在组内的索引 -->
:value="prod.prodId" :value="prod.prodId" <!-- 绑定商品的唯一标识产品ID -->
:checked="prod.checked" :checked="prod.checked" <!-- 绑定商品的选中状态 -->
color="#105c3e" color="#105c3e" <!-- 设置选择框选中时的颜色 -->
@tap="onSelectedItem" @tap="onSelectedItem" <!-- 绑定点击选择商品时触发的事件 -->
/> />
</label> </label>
</view> </view>
<!-- 商品详细信息展示区域 -->
<view class="prodinfo"> <view class="prodinfo">
<!-- 商品图片展示容器 -->
<view class="pic"> <view class="pic">
<image :src="prod.pic" /> <image :src="prod.pic" /> <!-- 通过绑定商品对象中的图片路径属性来展示商品图片 -->
</view> </view>
<view class="opt"> <view class="opt">
<!-- 展示商品名称 -->
<view class="prod-name"> <view class="prod-name">
{{ prod.prodName }} {{ prod.prodName }}
</view> </view>
<!-- 展示商品规格信息根据是否有skuName来动态添加类名若没有skuName则添加empty-n类名 -->
<text :class="'prod-info-text ' + (prod.skuName?'':'empty-n')"> <text :class="'prod-info-text ' + (prod.skuName?'':'empty-n')">
{{ prod.skuName }} {{ prod.skuName }}
</text> </text>
<!-- 商品价格和数量操作区域 -->
<view class="price-count"> <view class="price-count">
<view class="price"> <view class="price">
<!-- 价格符号 -->
<text class="symbol"> <text class="symbol">
</text> </text>
<!-- 价格的整数部分通过wxs.parsePrice函数对商品价格进行处理后获取整数部分展示 -->
<text class="big-num"> <text class="big-num">
{{ wxs.parsePrice(prod.price)[0] }} {{ wxs.parsePrice(prod.price)[0] }}
</text> </text>
<!-- 价格的小数部分通过wxs.parsePrice函数对商品价格进行处理后获取小数部分展示 -->
<text class="small-num"> <text class="small-num">
.{{ wxs.parsePrice(prod.price)[1] }} .{{ wxs.parsePrice(prod.price)[1] }}
</text> </text>
</view> </view>
<view class="m-numSelector"> <view class="m-numSelector">
<view <!-- 数量减少按钮绑定了点击事件onCountMinus并传递相关索引信息 -->
class="minus" <view class="minus"
:data-scindex="scIndex" :data-scindex="scIndex"
:data-index="index" :data-index="index"
@tap="onCountMinus" @tap="onCountMinus" />
/> <!-- 商品数量输入框设置为不可输入disabled仅用于展示当前商品数量 -->
<input <input type="number"
type="number" :value="prod.prodCount"
:value="prod.prodCount" disabled>
disabled <!-- 数量增加按钮绑定了点击事件onCountPlus并传递相关索引信息 -->
> <view class="plus"
<view :data-scindex="scIndex"
class="plus" :data-index="index"
:data-scindex="scIndex" @tap="onCountPlus" />
:data-index="index"
@tap="onCountPlus"
/>
</view> </view>
</view> </view>
</view> </view>
@ -87,314 +91,359 @@
</block> </block>
</view> </view>
<view <!-- 当购物车中没有商品shopCartItemDiscounts数组长度为0展示此区域提示用户购物车为空 -->
v-if="!shopCartItemDiscounts.length" <view v-if="!shopCartItemDiscounts.length" class="empty">
class="empty"
>
<view class="img"> <view class="img">
<image src="@/static/images/tabbar/basket.png" /> <image src="@/static/images/tabbar/basket.png" /> <!-- 展示一个代表购物车的图标 -->
</view> </view>
<view class="txt"> <view class="txt">
您还没有添加任何商品哦~ 您还没有添加任何商品哦~ <!-- 显示提示文字 -->
</view> </view>
</view> </view>
<!-- 底部按钮 --> <!-- 底部按钮区域当购物车中有商品shopCartItemDiscounts长度大于0时展示 -->
<view <view v-if="shopCartItemDiscounts.length>0" class="cart-footer">
v-if="shopCartItemDiscounts.length>0" <!-- 全选按钮所在容器 -->
class="cart-footer"
>
<view class="btn all"> <view class="btn all">
<checkbox <checkbox :checked="allChecked" <!-- -->
:checked="allChecked" color="#f7d731;" <!-- 设置全选按钮选中时的颜色 -->
color="#f7d731;" @tap="onSelAll" <!-- 绑定全选按钮点击触发的事件 -->
@tap="onSelAll"
/> />
全选 全选 <!-- 按钮显示文字 -->
</view> </view>
<view <!-- 删除按钮所在容器点击触发onDelBasket事件 -->
class="btn del" <view class="btn del" @tap="onDelBasket">
@tap="onDelBasket" <text>删除</text> <!-- 按钮显示文字 -->
>
<text>删除</text>
</view> </view>
<!-- 合计金额展示按钮所在容器 -->
<view class="btn total"> <view class="btn total">
<view class="finally"> <view class="finally">
<text>合计:</text> <text>合计:</text> <!-- 显示合计文字 -->
<view class="price"> <view class="price">
<text class="symbol"> <text class="symbol">
</text> </text>
<!-- 最终金额的整数部分通过wxs.parsePrice函数对finalMoney进行处理后展示 -->
<text class="big-num"> <text class="big-num">
{{ wxs.parsePrice(finalMoney)[0] }} {{ wxs.parsePrice(finalMoney)[0] }}
</text> </text>
<!-- 最终金额的小数部分通过wxs.parsePrice函数对finalMoney进行处理后展示 -->
<text class="small-num"> <text class="small-num">
.{{ wxs.parsePrice(finalMoney)[1] }} .{{ wxs.parsePrice(finalMoney)[1] }}
</text> </text>
</view> </view>
</view> </view>
<view <!-- 当有立减金额subtractMoney大于0展示总额和立减金额信息 -->
v-if="subtractMoney>0" <view v-if="subtractMoney>0" class="total-msg">
class="total-msg"
>
总额:{{ wxs.toPrice(totalMoney) }} 立减:{{ wxs.toPrice(subtractMoney) }} 总额:{{ wxs.toPrice(totalMoney) }} 立减:{{ wxs.toPrice(subtractMoney) }}
</view> </view>
</view> </view>
<view <!-- 结算按钮所在容器点击触发toFirmOrder事件 -->
class="btn settle" <view class="btn settle" @tap="toFirmOrder">
@tap="toFirmOrder" <text>结算</text> <!-- 按钮显示文字 -->
>
<text>结算</text>
</view> </view>
</view> </view>
<!-- end 底部按钮 --> <!-- 结束底部按钮区域 -->
</view> </view>
</template> </template>
<script setup> <script setup>
const wxs = number() // wxsnumber()
/** const wxs = number()
* 生命周期函数--监听页面显示 // -
*/ onShow(() => {
onShow(() => { //
loadBasketData() loadBasketData()
http.getCartCount() // //
}) http.getCartCount()
const allChecked = ref(false)
const shopCartItemDiscounts = ref([])
const loadBasketData = () => {
uni.showLoading() //
http.request({
url: '/p/shopCart/info',
method: 'POST',
data: {}
}) })
.then(({ data }) => {
if (data && data.length > 0) { // false
// const allChecked = ref(false)
const shopCartItemDiscountsParam = data[0].shopCartItemDiscounts //
shopCartItemDiscountsParam.forEach(shopCartItemDiscount => { const shopCartItemDiscounts = ref([])
shopCartItemDiscount.shopCartItems.forEach(shopCartItem => {
shopCartItem.checked = false //
}) const loadBasketData = () => {
}) //
shopCartItemDiscounts.value = shopCartItemDiscountsParam uni.showLoading()
allChecked.value = false // POST
} else { http.request({
shopCartItemDiscounts.value = [] url: '/p/shopCart/info',
} method: 'POST',
calTotalPrice() // data: {}
uni.hideLoading()
}) })
} .then(({ data }) => {
// 0
if (data && data.length > 0) {
//
const shopCartItemDiscountsParam = data[0].shopCartItemDiscounts
//
shopCartItemDiscountsParam.forEach(shopCartItemDiscount => {
// false
shopCartItemDiscount.shopCartItems.forEach(shopCartItem => {
shopCartItem.checked = false
})
})
// shopCartItemDiscounts
shopCartItemDiscounts.value = shopCartItemDiscountsParam
// false
allChecked.value = false
} else {
// shopCartItemDiscounts
shopCartItemDiscounts.value = []
}
//
calTotalPrice()
//
uni.hideLoading()
})
}
/** //
* 去结算 const toFirmOrder = () => {
*/ //
const toFirmOrder = () => { const shopCartItemDiscountsParam = shopCartItemDiscounts.value
const shopCartItemDiscountsParam = shopCartItemDiscounts.value const basketIds = []
const basketIds = [] //
shopCartItemDiscountsParam.forEach(shopCartItemDiscount => { shopCartItemDiscountsParam.forEach(shopCartItemDiscount => {
shopCartItemDiscount.shopCartItems.forEach(shopCartItem => { //
if (shopCartItem.checked) { shopCartItemDiscount.shopCartItems.forEach(shopCartItem => {
basketIds.push(shopCartItem.basketId) // basketIdbasketIds
} if (shopCartItem.checked) {
basketIds.push(shopCartItem.basketId)
}
})
}) })
})
if (!basketIds.length) { // basketIds0
uni.showToast({ if (!basketIds.length) {
title: '请选择商品', // Toastnone
icon: 'none' uni.showToast({
title: '请选择商品',
icon: 'none'
})
return
}
// basketIdsJSON
uni.setStorageSync('basketIds', JSON.stringify(basketIds))
// orderEntry=0
uni.navigateTo({
url: '/pages/submit-order/submit-order?orderEntry=0'
}) })
return
} }
uni.setStorageSync('basketIds', JSON.stringify(basketIds)) //
uni.navigateTo({ const onSelAll = () => {
url: '/pages/submit-order/submit-order?orderEntry=0' //
}) const allCheckedParam = !allChecked.value
} //
const shopCartItemDiscountsParam = shopCartItemDiscounts.value
/** //
* 全选 for (let i = 0; i < shopCartItemDiscountsParam.length; i++) {
*/ const cItems = shopCartItemDiscountsParam[i].shopCartItems
const onSelAll = () => { //
const allCheckedParam = !allChecked.value // for (let j = 0; j < cItems.length; j++) {
const shopCartItemDiscountsParam = shopCartItemDiscounts.value cItems[j].checked = allCheckedParam
for (let i = 0; i < shopCartItemDiscountsParam.length; i++) { }
const cItems = shopCartItemDiscountsParam[i].shopCartItems
for (let j = 0; j < cItems.length; j++) {
cItems[j].checked = allCheckedParam
} }
//
allChecked.value = allCheckedParam
// UI
shopCartItemDiscounts.value = shopCartItemDiscountsParam
//
calTotalPrice()
} }
allChecked.value = allCheckedParam
shopCartItemDiscounts.value = shopCartItemDiscountsParam
calTotalPrice() //
}
/** //
* 每一项的选择事件 const onSelectedItem = (e) => {
* + //
*/ const index = e.currentTarget.dataset.index
const onSelectedItem = (e) => { //
const index = e.currentTarget.dataset.index // data- index const scindex = e.currentTarget.dataset.scindex
const scindex = e.currentTarget.dataset.scindex //
const shopCartItemDiscountsParam = shopCartItemDiscounts.value // const shopCartItemDiscountsParam = shopCartItemDiscounts.value
const checked = shopCartItemDiscountsParam[scindex].shopCartItems[index].checked // //
shopCartItemDiscountsParam[scindex].shopCartItems[index].checked = !checked // const checked = shopCartItemDiscountsParam[scindex].shopCartItems[index].checked
shopCartItemDiscounts.value = shopCartItemDiscountsParam //
checkAllSelected() // shopCartItemDiscountsParam[scindex].shopCartItems[index].checked = !checked
calTotalPrice() // //
} shopCartItemDiscounts.value = shopCartItemDiscountsParam
//
checkAllSelected()
//
calTotalPrice()
}
/** //
* 检查全选状态 const checkAllSelected = () => {
*/ // true
const checkAllSelected = () => { let allCheckedParam = true
let allCheckedParam = true //
const shopCartItemDiscountsParam = shopCartItemDiscounts.value const shopCartItemDiscountsParam = shopCartItemDiscounts.value
let flag = false let flag = false
for (let i = 0; i < shopCartItemDiscountsParam.length; i++) { //
const cItems = shopCartItemDiscountsParam[i].shopCartItems for (let i = 0; i < shopCartItemDiscountsParam.length; i++) {
for (let j = 0; j < cItems.length; j++) { const cItems = shopCartItemDiscountsParam[i].shopCartItems
if (!cItems[j].checked) { //
allCheckedParam = !allCheckedParam for (let j = 0; j < cItems.length; j++) {
flag = true //
break if (!cItems[j].checked) {
// false
allCheckedParam = !allCheckedParam
flag = true
break
}
} }
//
if (flag) break
} }
if (flag) break //
allChecked.value = allCheckedParam
} }
allChecked.value = allCheckedParam
}
const totalMoney = ref(0) // 0
const subtractMoney = ref(0) const totalMoney = ref(0)
const finalMoney = ref(0) // 0
/** const subtractMoney = ref(0)
* 计算购物车总额 // 0
*/ const finalMoney = ref(0)
const calTotalPrice = () => {
const shopCartItemDiscountsParam = shopCartItemDiscounts.value //
const shopCartIds = [] const calTotalPrice = () => {
for (let i = 0; i < shopCartItemDiscountsParam.length; i++) { //
const cItems = shopCartItemDiscountsParam[i].shopCartItems const shopCartItemDiscountsParam = shopCartItemDiscounts.value
for (let j = 0; j < cItems.length; j++) { const shopCartIds = []
if (cItems[j].checked) { //
shopCartIds.push(cItems[j].basketId) for (let i = 0; i < shopCartItemDiscountsParam.length; i++) {
const cItems = shopCartItemDiscountsParam[i].shopCartItems
//
for (let j = 0; j < cItems.length; j++) {
// basketIdshopCartIds
if (cItems[j].checked) {
shopCartIds.push(cItems[j].basketId)
}
} }
} }
} //
uni.showLoading() uni.showLoading()
http.request({ // POSTbasketIds
url: '/p/shopCart/totalPay', http.request({
method: 'POST', url: '/p/shopCart/totalPay',
data: shopCartIds method: 'POST',
}) data: shopCartIds
.then(({ data }) => {
if (!data) return
finalMoney.value = data.finalMoney
totalMoney.value = data.totalMoney
subtractMoney.value = data.subtractMoney
uni.hideLoading()
}) })
} .then(({ data }) => {
//
if (!data) return
//
finalMoney.value = data.finalMoney
//
totalMoney.value = data.totalMoney
//
subtractMoney.value = data.subtractMoney
//
uni.hideLoading()
})
}
/** //
* 减少数量 const onCountMinus = (e) => {
*/ //
const onCountMinus = (e) => { const index = e.currentTarget.dataset.index
const index = e.currentTarget.dataset.index //
const scindex = e.currentTarget.dataset.scindex const scindex = e.currentTarget.dataset.scindex
const shopCartItemDiscountsParam = shopCartItemDiscounts.value //
const prodCount = shopCartItemDiscountsParam[scindex].shopCartItems[index].prodCount const shopCartItemDiscountsParam = shopCartItemDiscounts.value
if (prodCount > 1) { //
updateCount(shopCartItemDiscountsParam, scindex, index, -1) const prodCount = shopCartItemDiscountsParam[scindex].shopCartItems[index].prodCount
// 1
if (prodCount > 1) {
updateCount(shopCartItemDiscountsParam, scindex, index, -1)
}
} }
}
/** /**
* 增加数量 * 增加数量
*/ */
const onCountPlus = (e) => { const onCountPlus = (e) => {
const index = e.currentTarget.dataset.index const index = e.currentTarget.dataset.index
const scindex = e.currentTarget.dataset.scindex const scindex = e.currentTarget.dataset.scindex
const shopCartItemDiscountsParam = shopCartItemDiscounts.value const shopCartItemDiscountsParam = shopCartItemDiscounts.value
updateCount(shopCartItemDiscountsParam, scindex, index, 1) updateCount(shopCartItemDiscountsParam, scindex, index, 1)
} }
/** /**
* 改变购物车数量接口 * 改变购物车数量接口
*/ */
const updateCount = (shopCartItemDiscountsParam, scindex, index, prodCount) => { const updateCount = (shopCartItemDiscountsParam, scindex, index, prodCount) => {
uni.showLoading({ uni.showLoading({
mask: true mask: true
})
http.request({
url: '/p/shopCart/changeItem',
method: 'POST',
data: {
count: prodCount,
prodId: shopCartItemDiscountsParam[scindex].shopCartItems[index].prodId,
skuId: shopCartItemDiscountsParam[scindex].shopCartItems[index].skuId,
shopId: 1
}
})
.then(() => {
shopCartItemDiscountsParam[scindex].shopCartItems[index].prodCount += prodCount
shopCartItemDiscounts.value = shopCartItemDiscountsParam
calTotalPrice() //
uni.hideLoading()
http.getCartCount() //
}) })
} http.request({
url: '/p/shopCart/changeItem',
method: 'POST',
data: {
count: prodCount,
prodId: shopCartItemDiscountsParam[scindex].shopCartItems[index].prodId,
skuId: shopCartItemDiscountsParam[scindex].shopCartItems[index].skuId,
shopId: 1
}
})
.then(() => {
shopCartItemDiscountsParam[scindex].shopCartItems[index].prodCount += prodCount
shopCartItemDiscounts.value = shopCartItemDiscountsParam
calTotalPrice() //
uni.hideLoading()
http.getCartCount() //
})
}
/** /**
* 删除购物车商品 * 删除购物车商品
*/ */
const onDelBasket = () => { const onDelBasket = () => {
const shopCartItemDiscountsParam = shopCartItemDiscounts.value const shopCartItemDiscountsParam = shopCartItemDiscounts.value
const basketIds = [] const basketIds = []
for (let i = 0; i < shopCartItemDiscountsParam.length; i++) { for (let i = 0; i < shopCartItemDiscountsParam.length; i++) {
const cItems = shopCartItemDiscountsParam[i].shopCartItems const cItems = shopCartItemDiscountsParam[i].shopCartItems
for (let j = 0; j < cItems.length; j++) { for (let j = 0; j < cItems.length; j++) {
if (cItems[j].checked) { if (cItems[j].checked) {
basketIds.push(cItems[j].basketId) basketIds.push(cItems[j].basketId)
}
} }
} }
} if (!basketIds.length) {
if (!basketIds.length) { uni.showToast({
uni.showToast({ title: '请选择商品',
title: '请选择商品', icon: 'none'
icon: 'none' })
}) } else {
} else { uni.showModal({
uni.showModal({ title: '',
title: '', content: '确认要删除选中的商品吗?',
content: '确认要删除选中的商品吗?', confirmColor: '#eb2444',
confirmColor: '#eb2444', success(res) {
success (res) { if (res.confirm) {
if (res.confirm) { uni.showLoading({
uni.showLoading({ mask: true
mask: true })
}) http.request({
http.request({ url: '/p/shopCart/deleteItem',
url: '/p/shopCart/deleteItem', method: 'DELETE',
method: 'DELETE', data: basketIds
data: basketIds
})
.then(() => {
uni.hideLoading()
loadBasketData()
}) })
.then(() => {
uni.hideLoading()
loadBasketData()
})
}
} }
}
}) })
}
} }
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

Loading…
Cancel
Save