秦佳浩 2 months ago
commit 220d7795d9

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

Loading…
Cancel
Save