完成易购商品的立即购买功能

This commit is contained in:
赵毅 2025-11-17 08:35:49 +08:00
parent 70b747bcd0
commit 804579f19f
4 changed files with 436 additions and 45 deletions

View File

@ -271,24 +271,6 @@ image {
height: 40rpx;
}
.car_right {
width: 470rpx;
height: 70rpx;
background: linear-gradient(91deg, #FF7658 0%, #FF370B 100%);
border-radius: 100rpx 100rpx 100rpx 100rpx;
font-size: 36rpx;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
margin-top: 26rpx;
}
.car_right_disabled {
background: #CCCCCC;
color: #FFFFFF;
}
.cars {
display: flex;
flex-direction: column;
@ -311,13 +293,6 @@ image {
top: -10rpx;
}
.car_right .input {
font-size: 36rpx;
color: #FFFFFF;
font-weight: 700;
}
.shadow {
background: rgba(0, 0, 0, 0.4);
position: fixed;
@ -569,7 +544,6 @@ image {
.popup-header {
display: flex;
width: 90%;
padding-left: 80rpx;
margin: 20rpx 0;
}
@ -623,8 +597,12 @@ image {
border-radius: 40rpx;
padding: 10rpx 15rpx;
white-space: nowrap;
margin: 20rpx 30rpx;
display: inline-block;
width: auto;
}
.itemSize_active {
background: #FF370B;
color: #fff;
@ -640,6 +618,7 @@ image {
.itemSize_top {
display: flex;
margin-left: 30rpx;
position: relative;
}
.itemSize_info {
@ -657,4 +636,201 @@ image {
font-weight: 500;
margin-top: 10rpx;
color: red;
}
.car_right_box {
display: flex;
font-size: 30rpx;
}
.car_right {
width: 220rpx;
height: 70rpx;
/* background: linear-gradient(91deg, #FF7658 0%, #FF370B 100%); */
background: #ff712c;
border-radius: 20rpx 0 0 20rpx;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
margin-top: 26rpx;
}
.seckill {
width: 220rpx;
height: 70rpx;
background: #ff3b31;
border-radius: 0 20rpx 20rpx 0;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
margin-top: 26rpx;
}
.car_right2 {
width: 470rpx;
height: 70rpx;
background: #ffb1a5;
border-radius: 100rpx 100rpx 100rpx 100rpx;
font-size: 36rpx;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
margin-top: 26rpx;
}
/* 立即购买弹窗样式 */
.address-section {
background-color: #fff;
}
.address-info {
padding: 20rpx 30rpx;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1rpx solid #eee;
margin-bottom: 20rpx;
font-size: 26rpx;
font-weight: bold;
}
.address-main {
flex: 1;
}
.address-name-phone {
display: flex;
align-items: center;
margin-bottom: 10rpx;
}
.name {
margin-right: 20rpx;
}
.phone {
color: #666;
}
.address-detail {
color: #666;
line-height: 40rpx;
display: flex;
align-items: center;
}
.copy-icon {
width: 30rpx;
height: 30rpx;
background: url('https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/shop_copy.png') no-repeat center;
background-size: contain;
margin-left: 10rpx;
}
.address-arrow {
color: #999;
}
.quantity-control {
display: flex;
align-items: center;
justify-content: flex-end;
position: absolute;
bottom: 10rpx;
right: 40rpx;
}
.decrease-btn {
width: 40rpx;
height: 40rpx;
background-color: #f5f5f5;
border: 1rpx solid #ccc;
border-radius: 50%;
line-height: 33rpx;
text-align: center;
font-size: 28rpx;
color: #333;
}
.increase-btn {
width: 40rpx;
height: 40rpx;
background-color: #ff502a;
border-radius: 50%;
line-height: 33rpx;
text-align: center;
font-size: 28rpx;
color: #ffffff;
}
.quantity {
font-size: 28rpx;
color: #333;
margin: 0 20rpx;
min-width: 40rpx;
text-align: center;
}
.payment-section {
background-color: #fff;
margin-bottom: 20rpx;
margin-top: 15rpx;
}
.payment-item {
padding: 30rpx;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1rpx solid #eee;
}
.payment-icon {
width: 40rpx;
height: 40rpx;
margin-right: 20rpx;
}
.payment-icon image {
width: 100%;
height: 100%;
}
.payment-content {
flex: 1;
}
.payment-name {
font-size: 28rpx;
margin-bottom: 5rpx;
}
.payment-desc {
font-size: 26rpx;
color: #333;
}
.payment-select {
color: #FF7658;
}
.pay-button {
width: 50%;
height: 70rpx;
margin: 0 auto;
line-height: 70rpx;
text-align: center;
background: linear-gradient(91deg, #FF7658 0%, #FF370B 100%);
color: #fff;
font-size: 34rpx;
font-weight: bold;
border-radius: 50rpx;
}
.car_right_buy {
width: 220rpx;
margin-left: 20rpx;
}

View File

@ -175,23 +175,29 @@
</view>
</view>
<view class="car_right" v-if="
info.commodity_goods_info_list[currentGGIndex].stock_quantity > 0 &&
(!info.commodity_goods_info_list[currentGGIndex].cart_count ||
info.commodity_goods_info_list[currentGGIndex].cart_count.count == 0)
" @click="addCar">
加入购物车
<view class="car_right_box">
<view class="car_right" v-if="
info.commodity_goods_info_list[currentGGIndex].stock_quantity > 0 &&
(!info.commodity_goods_info_list[currentGGIndex].cart_count ||
info.commodity_goods_info_list[currentGGIndex].cart_count.count == 0)
" @click="addCar">
加入购物车
</view>
<view class="car_right" @click="changeCar" v-if="
info.commodity_goods_info_list[currentGGIndex].cart_count.count > 0
&& info.commodity_goods_info_list[currentGGIndex].stock_quantity > 0
">
加入购物车
</view>
<view class="seckill" v-if="info.commodity_goods_info_list[currentGGIndex].stock_quantity != 0"
@click="showBuyPopup">
立即购买
</view>
</view>
<view class="car_right" @click="changeCar" v-if="
info.commodity_goods_info_list[currentGGIndex].cart_count.count > 0
&& info.commodity_goods_info_list[currentGGIndex].stock_quantity > 0
">
加入购物车
</view>
<view class="car_right car_right_disabled"
v-if="info.commodity_goods_info_list[currentGGIndex].stock_quantity < 1">
<view class="car_right2" v-if="info.commodity_goods_info_list[currentGGIndex].stock_quantity < 1">
已售罄
</view>
</view>
@ -298,7 +304,7 @@
<view class="itemSize_name" style="display: flex;">
<view v-if="currentGG.is_same_day" class="isDay">当日达</view>{{ changeName }}
</view>
<view class="itemSize_price">{{ changePrice }}/</view>
<view class="itemSize_price">{{ changePrice }}/{{ goodsUnit }}</view>
</view>
</view>
<view class="itemSizeBox" v-for="(item, index) in info.commodity_goods_info_list" :key="item.id"
@ -307,6 +313,75 @@
{{ item.goods_spec }} / {{ item.goods_unit }}</text>
</view>
</u-popup>
<!-- 立即购买 -->
<u-popup :show="showBuy" round="20rpx" mode="bottom" @close="closeBuy">
<view class="popup-header">
<h3 class="popup-header-h3">立即购买</h3>
<view class="popup-header-view" @click="closeBuy">取消</view>
</view>
<view class="address-section">
<view class="address-info" @click="editAddress()">
<view class="address-main" v-if="defAddress && Object.keys(defAddress).length > 0">
<view class="address-name-phone">
<text class="name">{{ defAddress.name }}</text>
<text class="phone">{{ defAddress.phone }}</text>
</view>
<view class="address-detail">
{{ defAddress.address }}{{ defAddress.house_number }}
<view class="copy-icon" @click.stop="copyAddress" />
</view>
</view>
<view class="address-main" v-else>
<view class="address-name-phone">
<text class="name">请选择收货地址</text>
</view>
</view>
<view class="address-arrow"><u-icon name="arrow-right" size="25"></u-icon></view>
</view>
</view>
<view class="itemSize_top">
<image :src="changeImg" class="itemSize-img"></image>
<view class="itemSize_info">
<view class="itemSize_name">{{ changeName }}</view>
<view class="itemSize_price">{{ changePrice }}/{{ goodsUnit }}</view>
</view>
<view class="quantity-control">
<view class="decrease-btn" @tap.stop="decreaseQuantity()">-</view>
<view class="quantity">{{ changeCount }}</view>
<view class="increase-btn" @tap.stop="increaseQuantity()">+</view>
</view>
</view>
<view class="itemSize" v-for="(item, index) in info.commodity_goods_info_list" :key="item.id"
@click="changeGG(item, index)" :class="index == currentGGIndex ? 'itemSize_active' : ''">
{{ item.goods_name }} {{ item.goods_spec }} / {{ item.goods_unit }}
</view>
<view class="fenge"></view>
<!-- 支付方式 -->
<view class="payment-section">
<view class="payment-item" @click="selectPayment('wechat')">
<view class="payment-icon">
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_wechat.png"
mode="aspectFit"></image>
</view>
<view class="payment-content">
<view class="payment-name">微信支付</view>
</view>
<view class="payment-select" v-if="selectedPayment === 'wechat'">
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_check2.png"
mode="aspectFit" style="width: 30rpx; height: 30rpx;"></image>
</view>
<view class="payment-select" v-else>
<image
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_check1.png"
mode="aspectFit" style="width: 30rpx; height: 30rpx;"></image>
</view>
</view>
</view>
<view class="pay-button" @click="submitBuyOrder">立即支付</view>
</u-popup>
</view>
</template>
@ -345,10 +420,16 @@ export default {
comments: [],
show: false,
showSize: false,
//
showBuy: false,
changeCount: 0,
defAddress: {},
selectedPayment: 'wechat', //
changeImg: "",
changeName: "",
changePrice: "",
goodsUnit: "",
selectedGoods: null, //
qrcodePath: null, //
};
@ -478,6 +559,7 @@ export default {
this.changeImg = picUrl + this.currentGG.commodity_pic[0]
this.changeName = this.currentGG.goods_alias
this.changePrice = this.currentGG.sales_price
this.goodsUnit = this.currentGG.goods_unit
});
},
@ -508,8 +590,73 @@ export default {
this.changeImg = picUrl + item.commodity_pic[0]
this.changeName = item.goods_alias
this.changePrice = item.sales_price
this.goodsUnit = item.goods_unit
this.getComment(item.goods_id)
},
//
showBuyPopup() {
this.changeCount = 1;
this.showBuy = true;
//
const selectedAddress = uni.getStorageSync('selectedAddress');
if (selectedAddress && Object.keys(selectedAddress).length > 0) {
this.defAddress = selectedAddress;
//
uni.removeStorageSync('selectedAddress');
} else {
//
this.getUserAddress();
}
},
closeBuy() {
this.showBuy = false;
uni.removeStorageSync('selectedAddress');
this.changeCount = 1;
},
editAddress() {
NavgateTo('/packages/shop/address/index');
},
//
decreaseQuantity() {
if (this.changeCount > 1) {
this.changeCount--;
}
},
increaseQuantity() {
const stock = this.info.commodity_goods_info_list[this.currentGGIndex].stock_quantity;
if (this.changeCount < stock) {
this.changeCount++;
} else {
uni.showToast({
title: '库存不足',
icon: 'none'
});
}
},
//
getUserAddress() {
request(apiArr.getUserDefAddress, "POST", {}).then(res => {
this.defAddress = res.default_address;
});
},
//
selectPayment(type) {
this.selectedPayment = type;
},
//
copyAddress() {
if (this.defAddress && Object.keys(this.defAddress).length > 0) {
uni.setClipboardData({
data: this.defAddress.address + this.defAddress.house_number,
success: () => {
uni.showToast({
title: '地址复制成功',
icon: 'success'
});
}
});
}
},
car() {
NavgateTo("../shopCar/index");
},
@ -627,6 +774,69 @@ export default {
closeSize() {
this.showSize = false;
},
//
submitBuyOrder() {
//
if (!this.defAddress || !this.defAddress.address) {
uni.showToast({
title: '请选择收货地址',
icon: 'none'
});
return;
}
// trans_type
// : 71, App: 51
const systemInfo = uni.getSystemInfoSync();
let trans_type = 51; // App
//
if (systemInfo.platform === 'devtools' || systemInfo.platform === 'unknown') {
trans_type = 71; //
}
//
// #ifdef MP
trans_type = 71; //
// #endif
// #ifdef APP-PLUS
trans_type = 51; // App
// #endif
//
const params = {
user_id: uni.getStorageSync('userId'),
// 1
order_cate: 1,
goods_list: [{
supplier_id: this.info.supplier_id,
supplier_name: this.currentGG.supplier_name || '',
is_same_day: this.currentGG.is_same_day,
receiving_name: this.defAddress.name,
receiving_phone: this.defAddress.phone,
receiving_address: this.defAddress.address + this.defAddress.house_number,
merchant_id: this.defAddress.address_id,
goods_and_count: [{
goods_id: this.currentGG.id,
count: this.changeCount,
price: this.currentGG.sales_price
}]
}]
}
console.log("🚀 ~ params:", params)
request(apiArr.createOrder, "POST", params).then(resVal => {
const param = {
order_id: resVal.order_id,
user_id: uni.getStorageSync('userId'),
trans_type: trans_type
}
request(apiArr.mergePreorder, "POST", param).then(res => {
this.handleMergePreorderResponse(res, resVal.order_id);
})
})
},
//
getComment(id) {
let params = {}

View File

@ -909,7 +909,6 @@ image {
}
.itemSize {
width: 30%;
font-size: 26rpx;
color: #333;
background: #F6F7FB;
@ -917,6 +916,8 @@ image {
padding: 10rpx 15rpx;
white-space: nowrap;
margin: 20rpx 30rpx;
display: inline-block;
width: auto;
}
.itemSize_active {

View File

@ -324,7 +324,7 @@
<image :src="changeImg" class="itemSize-img"></image>
<view class="itemSize_info">
<view class="itemSize_name">{{ changeName }}</view>
<view class="itemSize_price">{{ changePrice }}/</view>
<view class="itemSize_price">{{ changePrice }}/{{ goodsUnit }}</view>
</view>
</view>
<view class="itemSize" v-for="(item, index) in info.commodity_goods_info_list" :key="item.id"
@ -382,7 +382,7 @@
<image :src="changeImg" class="itemSize-img"></image>
<view class="itemSize_info">
<view class="itemSize_name">{{ changeName }}</view>
<view class="itemSize_price">{{ changePrice }}/</view>
<view class="itemSize_price">{{ changePrice }}/{{ goodsUnit }}</view>
</view>
<view class="quantity-control">
<view class="decrease-btn" @tap.stop="decreaseQuantity()">-</view>
@ -557,6 +557,7 @@ export default {
changeImg: "",
changeName: "",
changePrice: "",
goodsUnit: "",
endTime: "",
endTheCountdownDay: '',
@ -1043,6 +1044,7 @@ export default {
this.changeImg = this.currentGG.commodity_pic[0];
this.changeName = this.currentGG.goods_alias;
this.changePrice = this.currentGG.sales_price;
this.goodsUnit = this.currentGG.goods_unit;
} else {
//
this.currentGG = null;
@ -1050,6 +1052,7 @@ export default {
this.changeImg = '';
this.changeName = '';
this.changePrice = '';
this.goodsUnit = '';
}
});
},
@ -1079,6 +1082,7 @@ export default {
this.changeImg = item.commodity_pic[0]
this.changeName = item.goods_alias
this.changePrice = item.sales_price
this.goodsUnit = item.goods_unit;
},
car() {
const item = {