189 lines
4.4 KiB
Vue
189 lines
4.4 KiB
Vue
<template>
|
||
<view>
|
||
<!-- 自定义导航栏 -->
|
||
<nav-bar :title="$t('order.confirmTitle')" />
|
||
|
||
<!-- 确认订单组件 -->
|
||
<Confirm :goodsList="goodsList" :userInfo="userInfo" :orderType="orderType">
|
||
<template #goodsList>
|
||
<!-- 商品列表内容 -->
|
||
<view
|
||
v-for="(item, index) in goodsList"
|
||
:key="index"
|
||
class="goods-item"
|
||
>
|
||
<!-- VIP优惠标签 -->
|
||
<wd-tag v-if="item.isVipPrice === 1 && item.vipPrice" type="danger" mark custom-class="vip-badge">{{ $t('order.vipLabel') }}</wd-tag>
|
||
|
||
<!-- 商品图片 -->
|
||
<view class="goods-image">
|
||
<image
|
||
:src="item.productImages || '/static/nobg.jpg'"
|
||
mode="aspectFit"
|
||
/>
|
||
</view>
|
||
|
||
<!-- 商品信息 -->
|
||
<view class="goods-info">
|
||
<text class="goods-name">{{ item.productName }}</text>
|
||
<!-- 商品价格组件 -->
|
||
<GoodsPrice :goods="item" />
|
||
|
||
<!-- 数量 -->
|
||
<!-- <view class="quantity-row">
|
||
<text class="quantity-label">{{ $t('order.quantity') }}:</text>
|
||
<view v-if="showNumber" class="quantity-control">
|
||
<wd-number-box
|
||
v-model="item.productAmount"
|
||
:min="1"
|
||
@change="handleQuantityChange(item, $event)"
|
||
/>
|
||
</view>
|
||
<text v-else>X {{ item.productAmount }}</text>
|
||
</view> -->
|
||
</view>
|
||
</view>
|
||
</template>
|
||
</Confirm>
|
||
</view>
|
||
</template>
|
||
|
||
<script lang="ts" setup>
|
||
import { ref, computed } from 'vue'
|
||
import { onLoad } from '@dcloudio/uni-app'
|
||
import { orderApi } from '@/api/modules/order'
|
||
import type { IOrderGoods } from '@/types/order'
|
||
import Confirm from '@/components/order/Confirm.vue';
|
||
import GoodsPrice from '@/components/order/GoodsPrice.vue';
|
||
|
||
/**
|
||
* 获取用户信息
|
||
*/
|
||
const userInfo = ref({})
|
||
const getUserInfo = async () => {
|
||
const res = await orderApi.getUserInfo()
|
||
userInfo.value = res.result || {}
|
||
}
|
||
|
||
/**
|
||
* 获取商品列表
|
||
*/
|
||
const goodsIds = ref<string>('')
|
||
const goodsList = ref<IOrderGoods[]>([])
|
||
const getGoodsList = async () => {
|
||
// 获取商品详情
|
||
const res = await orderApi.getShopProductListByIds(goodsIds.value)
|
||
|
||
if (res.shopProductList?.length > 0) {
|
||
goodsList.value = res.shopProductList
|
||
}
|
||
}
|
||
|
||
// 复读
|
||
const isRelearn = ref<boolean>(false)
|
||
|
||
// 订单类型
|
||
const orderType = computed(() => {
|
||
return isRelearn.value ? 'relearn' : 'order'
|
||
})
|
||
|
||
/**
|
||
* 页面加载
|
||
*/
|
||
onLoad(async (options: any) => {
|
||
try {
|
||
if (options.isRelearn == 1) {
|
||
uni.$on('selectedGoods', async (data: IOrderGoods) => {
|
||
// 获取用户信息
|
||
await getUserInfo()
|
||
|
||
// 处理商品数据
|
||
console.log('监听到传入的商品数据:', data)
|
||
goodsList.value = [ data ]
|
||
})
|
||
} else if (options.goods) {
|
||
// 获取用户信息
|
||
await getUserInfo()
|
||
// 根据商品ID获取商品详细信息
|
||
goodsIds.value = options.goods || ''
|
||
getGoodsList()
|
||
}
|
||
} catch (error) {
|
||
console.error('解析商品数据失败:', error)
|
||
uni.showToast({
|
||
title: '商品数据错误',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
})
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.goods-item {
|
||
position: relative;
|
||
display: flex;
|
||
padding-bottom: 20rpx;
|
||
border-bottom: 1px solid #f0f0f0;
|
||
|
||
&:last-child {
|
||
border-bottom: none;
|
||
padding-bottom: 0;
|
||
}
|
||
|
||
.vip-badge {
|
||
position: absolute;
|
||
top: 20rpx;
|
||
left: 0;
|
||
z-index: 1;
|
||
}
|
||
|
||
.goods-image {
|
||
width: 140rpx;
|
||
height: 140rpx;
|
||
flex-shrink: 0;
|
||
margin-right: 20rpx;
|
||
background-color: #f5f5f5;
|
||
border-radius: 8rpx;
|
||
overflow: hidden;
|
||
|
||
image {
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
}
|
||
|
||
.goods-info {
|
||
flex: 1;
|
||
display: flex;
|
||
flex-direction: column;
|
||
|
||
.goods-name {
|
||
font-size: 28rpx;
|
||
color: #333;
|
||
line-height: 1.4;
|
||
margin-bottom: 10rpx;
|
||
display: -webkit-box;
|
||
-webkit-line-clamp: 2;
|
||
-webkit-box-orient: vertical;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.quantity-row {
|
||
display: flex;
|
||
align-items: center;
|
||
font-size: 24rpx;
|
||
color: #999;
|
||
|
||
.quantity-label {
|
||
margin-right: 10rpx;
|
||
}
|
||
|
||
.quantity-control {
|
||
display: flex;
|
||
align-items: center;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
</style> |