秦佳浩 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 <view class="plus"
class="plus"
:data-scindex="scIndex" :data-scindex="scIndex"
:data-index="index" :data-index="index"
@tap="onCountPlus" @tap="onCountPlus" />
/>
</view> </view>
</view> </view>
</view> </view>
@ -87,123 +91,134 @@
</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>
// wxsnumber()
const wxs = number() const wxs = number()
/** // -
* 生命周期函数--监听页面显示
*/
onShow(() => { onShow(() => {
//
loadBasketData() loadBasketData()
http.getCartCount() // //
http.getCartCount()
}) })
// false
const allChecked = ref(false) const allChecked = ref(false)
//
const shopCartItemDiscounts = ref([]) const shopCartItemDiscounts = ref([])
//
const loadBasketData = () => { const loadBasketData = () => {
uni.showLoading() // //
uni.showLoading()
// POST
http.request({ http.request({
url: '/p/shopCart/info', url: '/p/shopCart/info',
method: 'POST', method: 'POST',
data: {} data: {}
}) })
.then(({ data }) => { .then(({ data }) => {
// 0
if (data && data.length > 0) { if (data && data.length > 0) {
// //
const shopCartItemDiscountsParam = data[0].shopCartItemDiscounts const shopCartItemDiscountsParam = data[0].shopCartItemDiscounts
//
shopCartItemDiscountsParam.forEach(shopCartItemDiscount => { shopCartItemDiscountsParam.forEach(shopCartItemDiscount => {
// false
shopCartItemDiscount.shopCartItems.forEach(shopCartItem => { shopCartItemDiscount.shopCartItems.forEach(shopCartItem => {
shopCartItem.checked = false shopCartItem.checked = false
}) })
}) })
// shopCartItemDiscounts
shopCartItemDiscounts.value = shopCartItemDiscountsParam shopCartItemDiscounts.value = shopCartItemDiscountsParam
// false
allChecked.value = false allChecked.value = false
} else { } else {
// shopCartItemDiscounts
shopCartItemDiscounts.value = [] shopCartItemDiscounts.value = []
} }
calTotalPrice() // //
calTotalPrice()
//
uni.hideLoading() 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 => { shopCartItemDiscount.shopCartItems.forEach(shopCartItem => {
// basketIdbasketIds
if (shopCartItem.checked) { if (shopCartItem.checked) {
basketIds.push(shopCartItem.basketId) basketIds.push(shopCartItem.basketId)
} }
}) })
}) })
// basketIds0
if (!basketIds.length) { if (!basketIds.length) {
// Toastnone
uni.showToast({ uni.showToast({
title: '请选择商品', title: '请选择商品',
icon: 'none' icon: 'none'
@ -211,105 +226,139 @@ const toFirmOrder = () => {
return return
} }
// basketIdsJSON
uni.setStorageSync('basketIds', JSON.stringify(basketIds)) uni.setStorageSync('basketIds', JSON.stringify(basketIds))
// orderEntry=0
uni.navigateTo({ uni.navigateTo({
url: '/pages/submit-order/submit-order?orderEntry=0' url: '/pages/submit-order/submit-order?orderEntry=0'
}) })
} }
/** //
* 全选
*/
const onSelAll = () => { const onSelAll = () => {
const allCheckedParam = !allChecked.value // //
const allCheckedParam = !allChecked.value
//
const shopCartItemDiscountsParam = shopCartItemDiscounts.value const shopCartItemDiscountsParam = shopCartItemDiscounts.value
//
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++) {
cItems[j].checked = allCheckedParam cItems[j].checked = allCheckedParam
} }
} }
//
allChecked.value = allCheckedParam allChecked.value = allCheckedParam
// UI
shopCartItemDiscounts.value = shopCartItemDiscountsParam shopCartItemDiscounts.value = shopCartItemDiscountsParam
calTotalPrice() // //
calTotalPrice()
} }
/** //
* 每一项的选择事件
* +
*/
const onSelectedItem = (e) => { const onSelectedItem = (e) => {
const index = e.currentTarget.dataset.index // data- index //
const index = e.currentTarget.dataset.index
//
const scindex = e.currentTarget.dataset.scindex const scindex = e.currentTarget.dataset.scindex
const shopCartItemDiscountsParam = shopCartItemDiscounts.value // //
const checked = shopCartItemDiscountsParam[scindex].shopCartItems[index].checked // const shopCartItemDiscountsParam = shopCartItemDiscounts.value
shopCartItemDiscountsParam[scindex].shopCartItems[index].checked = !checked // //
const checked = shopCartItemDiscountsParam[scindex].shopCartItems[index].checked
//
shopCartItemDiscountsParam[scindex].shopCartItems[index].checked = !checked
//
shopCartItemDiscounts.value = shopCartItemDiscountsParam shopCartItemDiscounts.value = shopCartItemDiscountsParam
checkAllSelected() // //
calTotalPrice() // checkAllSelected()
//
calTotalPrice()
} }
/** //
* 检查全选状态
*/
const checkAllSelected = () => { const checkAllSelected = () => {
// true
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++) { 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) {
// false
allCheckedParam = !allCheckedParam allCheckedParam = !allCheckedParam
flag = true flag = true
break break
} }
} }
//
if (flag) break if (flag) break
} }
//
allChecked.value = allCheckedParam allChecked.value = allCheckedParam
} }
// 0
const totalMoney = ref(0) const totalMoney = ref(0)
// 0
const subtractMoney = ref(0) const subtractMoney = ref(0)
// 0
const finalMoney = ref(0) const finalMoney = ref(0)
/**
* 计算购物车总额 //
*/
const calTotalPrice = () => { const calTotalPrice = () => {
//
const shopCartItemDiscountsParam = shopCartItemDiscounts.value const shopCartItemDiscountsParam = shopCartItemDiscounts.value
const shopCartIds = [] const shopCartIds = []
//
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++) {
// basketIdshopCartIds
if (cItems[j].checked) { if (cItems[j].checked) {
shopCartIds.push(cItems[j].basketId) shopCartIds.push(cItems[j].basketId)
} }
} }
} }
//
uni.showLoading() uni.showLoading()
// POSTbasketIds
http.request({ http.request({
url: '/p/shopCart/totalPay', url: '/p/shopCart/totalPay',
method: 'POST', method: 'POST',
data: shopCartIds data: shopCartIds
}) })
.then(({ data }) => { .then(({ data }) => {
//
if (!data) return if (!data) return
//
finalMoney.value = data.finalMoney finalMoney.value = data.finalMoney
//
totalMoney.value = data.totalMoney totalMoney.value = data.totalMoney
//
subtractMoney.value = data.subtractMoney subtractMoney.value = data.subtractMoney
//
uni.hideLoading() 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 shopCartItemDiscountsParam = shopCartItemDiscounts.value
//
const prodCount = shopCartItemDiscountsParam[scindex].shopCartItems[index].prodCount const prodCount = shopCartItemDiscountsParam[scindex].shopCartItems[index].prodCount
// 1
if (prodCount > 1) { if (prodCount > 1) {
updateCount(shopCartItemDiscountsParam, scindex, index, -1) updateCount(shopCartItemDiscountsParam, scindex, index, -1)
} }

Loading…
Cancel
Save