完成首页花馍模块

This commit is contained in:
赵毅 2025-09-24 11:23:32 +08:00
parent da59430dd9
commit cc7215d836
5 changed files with 74 additions and 143 deletions

View File

@ -21,4 +21,7 @@ export const apiArr = {
goodsSearch: '/api/v2/wechat/commodity/search', // 商品搜索
cancelPay: '/api/v2/wechat/commodity/order/cancel_pay', // 用户取消支付
adverGoodsList: '/api/v2/wechat/commodity/adver-goods-list', // 广告货品列表
}

View File

@ -4,88 +4,27 @@
<view class="goods-list">
<!-- 商品项 -->
<view v-for="(item, index) in goodsList" :key="index">
<!-- 有多个货品 -->
<view class="goods-item" v-if="item.group_buy_goods_list.length > 1">
<view class="goods-image">
<image :src="item.commodity_pic" mode="aspectFill"></image>
</view>
<view class="goods-info">
<view class="goods-name">{{ item.commodity_name }}</view>
<view class="goods-desc">{{ item.commodity_intro }}</view>
<view class="goods-price"> {{ getPriceRange(item.group_buy_goods_list) }} </view>
<!-- 选择规格标签 -->
<view class="specification-tag" @click.stop="toggleSkuList(index)">
<text>{{ item.showSkuList ? '收起' : '选择规格' }}</text>
<u-icon name="arrow-down" size="26rpx" color="#FF370B" v-if="!item.showSkuList"></u-icon>
<u-icon name="arrow-up" size="26rpx" color="#FF370B" v-else></u-icon>
</view>
<!-- 货品列表 -->
<view class="sku-list" v-if="item.showSkuList">
<view v-for="(sku, skuIndex) in item.group_buy_goods_list" :key="skuIndex">
<view class="sku-item" @click="toDetail(sku)">
<view class="sku-info">
<view class="sku-image">
<image :src="sku.commodity_pic" mode="aspectFill"></image>
</view>
<view class="goods-info">
<view class="goods-name">{{ sku.goods_name }}</view>
<view class="goods-desc">{{ sku.goods_spec }}</view>
</view>
</view>
<view class="price-container">
<view class="sku-price">
<view class="sku-price1">团购价</view>
<view class="sku-price2">{{ sku.group_buy_price }}/{{ sku.goods_unit }}
</view>
</view>
<view class="sku-control">
<view class="decrease-btn" @tap.stop="decreaseQuantity(index, skuIndex)">-
</view>
<view class="quantity">{{ sku.quantity }}</view>
<view class="increase-btn" @tap.stop="increaseQuantity(index, skuIndex)">+
</view>
</view>
</view>
<view class="original-price">单买价 {{ sku.sales_price }}/{{ sku.goods_unit }}</view>
<view class="sku-countdown">
{{
getEndTheCountdown(sku.group_buy_activity_info.end_time)
}}
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 只有一个货品 -->
<view v-else>
<view>
<view class="goods-item2" @click="toDetail(item)">
<view class="goods-image">
<image :src="item.commodity_pic" mode="aspectFill"></image>
</view>
<view class="goods-info">
<view class="goods-name">{{ item.commodity_name }}</view>
<view class="goods-desc">{{ item.commodity_intro }}</view>
<view class="goods-name">{{ item.goods_name }}</view>
<view class="goods-desc">{{ item.goods_spec }}</view>
<view class="price-container">
<view class="group-price">
<view class="group-price1">团购</view>
<view class="group-price2">{{ item.group_buy_goods_list[0].group_buy_price }}/{{
item.group_buy_goods_list[0].goods_unit }}</view>
<view class="group-price1">活动价</view>
<view class="group-price2">{{ item.promotional_price }}/{{ item.goods_unit }}
</view>
</view>
<view class="quantity-control">
<view class="decrease-btn" @tap.stop="decreaseQuantity(index, 0)">-</view>
<view class="quantity">{{ item.group_buy_goods_list[0].quantity }}</view>
<view class="increase-btn" @tap.stop="increaseQuantity(index, 0)">+</view>
<view class="decrease-btn" @tap.stop="decreaseQuantity(index)">-</view>
<view class="quantity">{{ item.quantity }}</view>
<view class="increase-btn" @tap.stop="increaseQuantity(index)">+</view>
</view>
</view>
<view class="original-price">单买价 {{ item.group_buy_goods_list[0].sales_price }}/{{
item.group_buy_goods_list[0].goods_unit }}</view>
<view class="countdown">
{{ getEndTheCountdown(item.group_buy_goods_list[0].group_buy_activity_info.end_time) }}
</view>
<view class="original-price">零售价 {{ item.retail_price }}/{{ item.goods_unit }}</view>
</view>
</view>
</view>
@ -155,18 +94,12 @@ export default {
adver_id: this.idVal,
}
return request(shopApi.adverGoodsList, 'POST', params).then(res => {
const list = res.data.adver_goods_list.map(item => {
// quantity
const group_buy_goods_list = item.group_buy_goods_list.map(sku => ({
...sku,
commodity_pic: picUrl + sku.commodity_pic,
quantity: 0
}));
const list = res.adver_goods_list.map(item => {
// quantity
return {
...item,
commodity_pic: picUrl + item.commodity_pic,
showSkuList: false,
group_buy_goods_list
commodity_pic: picUrl + item.goods_pic,
quantity: 0
}
})
this.goodsList = list
@ -175,7 +108,7 @@ export default {
},
getShopdetail() {
const params = {
is_group_buy: 1,
is_adver: 1,
}
return request(shopApi.getCar, "POST", params).then((res) => {
this.carNum = res.total;
@ -189,95 +122,82 @@ export default {
if (!this.goodsDetail || !this.goodsList || this.goodsList.length === 0) {
return;
}
//
// item
this.goodsList.forEach(goods => {
//
goods.group_buy_goods_list.forEach(sku => {
//
const matchedItem = this.goodsDetail.find(item => item.goods_id === sku.goods_id);
//
const matchedItem = this.goodsDetail.find(item => item.goods_id === goods.goods_id);
// quantity
if (matchedItem) {
sku.quantity = matchedItem.count;
goods.quantity = matchedItem.count;
} else {
// 0
sku.quantity = 0;
goods.quantity = 0;
}
});
});
},
toDetail(itemObj) {
const item = {
...itemObj,
groupById: itemObj.group_buy_activity_info.id
};
NavgateTo(`/packages/shop/groupPurchaseDetail/index?item=${JSON.stringify(item)}`)
// const item = {
// ...itemObj,
// groupById: itemObj.group_buy_activity_info ? itemObj.group_buy_activity_info.id : ''
// };
// NavgateTo(`/packages/shop/groupPurchaseDetail/index?item=${JSON.stringify(item)}`)
},
//
getPriceRange(goodsList) {
if (!goodsList || goodsList.length === 0) return '¥0';
const prices = goodsList.map(item => Number(item.sales_price));
const minPrice = Math.min(...prices);
const maxPrice = Math.max(...prices);
return minPrice === maxPrice ? `${minPrice}` : `${minPrice} ~ ¥${maxPrice}`;
},
// /
toggleSkuList(index) {
this.goodsList[index].showSkuList = !this.goodsList[index].showSkuList;
},
//
increaseQuantity(goodsIndex, skuIndex) {
if (this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity == 0) {
this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity += this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].min_order_quantity
this.carNum += this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].min_order_quantity
//
increaseQuantity(index) {
const item = this.goodsList[index]
if (item.quantity == 0) {
item.quantity += item.min_order_quantity || 1
this.carNum += item.min_order_quantity || 1
} else {
if (this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity == this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].total_stock) {
if (item.quantity == item.total_stock) {
uni.showToast({
title: '库存不足',
icon: 'none'
});
return
}
if (this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity == this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].max_limit_quantity) {
if (item.quantity == item.max_limit_quantity) {
uni.showToast({
title: '一次最多购买' + this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].max_limit_quantity + '件',
title: '一次最多购买' + item.max_limit_quantity + '件',
icon: 'none'
});
return
}
this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity++;
item.quantity++;
this.carNum++;
}
const params = {
goods_id_and_count: [
{
goods_id: this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].id,
count: this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity,
goods_id: item.goods_id,
count: item.quantity,
},
],
group_buy_id: this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].group_buy_activity_info.id
adver_id: item.adver_id
}
this.updateCar(params);
},
//
decreaseQuantity(goodsIndex, skuIndex) {
if (this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity > 0) {
if (this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity == this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].min_order_quantity) {
this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity = 0
//
decreaseQuantity(index) {
const item = this.goodsList[index]
if (item.quantity > 0) {
if (item.quantity == (item.min_order_quantity || 1)) {
item.quantity = 0
this.carNum = 0
} else {
this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity--;
item.quantity--;
this.carNum--;
}
const params = {
goods_id_and_count: [
{
goods_id: this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].id,
count: this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].quantity,
goods_id: item.goods_id,
count: item.quantity,
},
],
group_buy_id: this.goodsList[goodsIndex].group_buy_goods_list[skuIndex].group_buy_activity_info.id
adver_id: item.adver_id
}
this.updateCar(params);
} else {
@ -300,9 +220,9 @@ export default {
//
shopCar() {
const item = {
is_group_buy: 1,
is_adver: 1,
}
NavgateTo("../shopCar/index?item=" + JSON.stringify(item));
NavgateTo("/packages/shop/shopCar/index?item=" + JSON.stringify(item));
},
//
getEndTheCountdown(endTime) {

View File

@ -338,7 +338,6 @@ export default {
},
onLoad(options) {
this.carList = JSON.parse(options.shopCarList)
console.log("🚀 ~ onLoad ~ JSON.parse(options.shopCarList):", JSON.parse(options.shopCarList))
},
onShow() {
this.getUserAddress()
@ -425,7 +424,6 @@ export default {
}
},
increaseQuantity(item) {
console.log("🚀 ~ increaseQuantity ~ item:", item)
const currentTime = new Date().getTime();
const startTime = new Date(item.commodity_goods_info.group_buy_activity_info?.start_time).getTime();
const endTime = new Date(item.commodity_goods_info.group_buy_activity_info?.end_time).getTime();
@ -600,7 +598,8 @@ export default {
//
const params = {
user_id: uni.getStorageSync('userId'),
is_group_buy: isGroupBuyValid,
// shopCarListisAdvertrue
is_group_buy: this.carList.some(item => item.isAdver === true) ? 3 : (isGroupBuyValid ? 2 : 1),
goods_list: Object.keys(this.supplierGroups).map(supplierId => {
const group = this.supplierGroups[supplierId];
const firstItem = group[0];
@ -662,8 +661,9 @@ export default {
success: (payRes) => {
const params = {
order_id: orderId,
from: 2,
from: this.carList.some(item => item.isAdver === true) ? 3 : (isGroupBuyValid ? 2 : 1),
group_buy_activity_id: this.group_buy_activity_id,
adver_id: this.carList.some(item => item.isAdver === true) ? this.carList.find(item => item.isAdver === true).adver_id : ''
}
request(apiArr.queryOrder, "POST", params).then(res => {
this.verifyCode = res.verification_code

View File

@ -297,8 +297,13 @@ export default {
this.$u.toast("请选择商品");
return;
}
// isAdver=true
const updatedArr = arr.map(item => ({
...item,
isAdver: item.adver_id ? true : ''
}));
// NavgateTo(`../submitOrder/index?shopCarList=${JSON.stringify(arr)}`);
NavgateTo(`../groupPurchaseSubmit/index?shopCarList=${JSON.stringify(arr)}`);
NavgateTo(`../groupPurchaseSubmit/index?shopCarList=${JSON.stringify(updatedArr)}`);
},
//

View File

@ -93,7 +93,7 @@
<!-- 广告横幅 -->
<view class="serverList1">
<view class="serverList1_left" @click="toAdvertisingView">
<view class="serverList1_left" @click="toAdvertisingView(serverLeftList)">
<image :src="serverLeft" mode="aspectFill" />
</view>
<view class="serverList1_right">
@ -308,6 +308,7 @@ export default {
// 1广
serverLeft: '',
serverLeftList: [],
// 1广
serverRightList: [],
@ -351,8 +352,9 @@ export default {
},
// 广
toAdvertisingView(item) {
NavgateTo('/packages/advertising/index/index')
toAdvertisingView(itemArry) {
const item = itemArry[0]
NavgateTo('/packages/advertising/index/index?id=' + item.id)
},
async goToWuye() {
@ -679,6 +681,7 @@ export default {
}, { silent: false });
if (res.rows.length) {
this.serverLeftList = res.rows
let filterRes = this.filterShowList(res?.rows, 1);
filterRes.forEach(item => {
item.pic_src = picUrl + item.pic_src