jiangchengfeiyi-xiaochengxu/pages/clothesRent/clothesRentSubmitOrder/clothesRentSubmitOrder.vue

478 lines
10 KiB
Vue
Raw Normal View History

2025-03-22 03:18:54 +00:00
<template>
2025-03-24 03:33:28 +00:00
<view class="flex-col justify-start relative page" :style="{ backgroundImage: 'url(' + bkgPubilcPath + ')'}">
2025-03-23 10:31:11 +00:00
<view class="flex-row justify-between items-center section_2 pos" @click="openPopup">
2025-03-22 03:18:54 +00:00
<view class="flex-row items-center">
<image
class="shrink-0 image"
2025-03-23 10:31:11 +00:00
:src="clothesRentUrl + '/clothesRentSubmitOrder/lxr.png'"
2025-03-22 03:18:54 +00:00
/>
2025-03-23 10:31:11 +00:00
<text class="ml-10 font text">{{ contactInfo.name }} {{ contactInfo.phone }}</text>
2025-03-22 03:18:54 +00:00
</view>
<view class="flex-row">
<text class="font_2 text_2">更换联系人</text>
<image
class="ml-2 shrink-0 image_2"
2025-03-23 10:31:11 +00:00
:src="clothesRentUrl + '/clothesRentSubmitOrder/yjt.png'"
2025-03-22 03:18:54 +00:00
/>
</view>
</view>
<view class="flex-col section_3 pos_2">
<view class="flex-row justify-between">
<view class="flex-row">
<image
class="image_3"
2025-03-23 10:31:11 +00:00
:src="publicPath + clothesInfo.image"
2025-03-22 03:18:54 +00:00
/>
<view class="flex-col items-start group_2 ml-15">
2025-03-23 10:31:11 +00:00
<text class="font text_3">{{ clothesInfo.name }}</text>
<text class="mt-64 font_3">{{ clothesInfo.price.toFixed(2) }}</text>
2025-03-22 03:18:54 +00:00
</view>
</view>
2025-03-23 10:31:11 +00:00
<view class="flex-col items-center self-start group" @click="nav">
2025-03-22 03:18:54 +00:00
<image
class="image_4"
2025-03-23 10:31:11 +00:00
:src="clothesRentUrl + '/clothesRentSubmitOrder/nav.png'"
2025-03-22 03:18:54 +00:00
/>
<text class="font_2 text_4 mt-11">提货地址</text>
</view>
</view>
<view class="flex-row justify-between items-baseline group_3">
<text class="font">租赁天数</text>
2025-03-23 10:31:11 +00:00
<text class="font_3 text_5">X{{ period }}</text>
2025-03-22 03:18:54 +00:00
</view>
<view class="flex-row justify-between items-baseline group_4">
<text class="font text_6">总计</text>
2025-03-23 10:31:11 +00:00
<text class="text_7">{{ totalAmount.toFixed(2) }}</text>
2025-03-22 03:18:54 +00:00
</view>
</view>
<view class="flex-row justify-between items-center section_4 pos_3">
<view class="flex-row items-baseline">
<text class="font_4 text_8">定金</text>
2025-03-23 10:31:11 +00:00
<text class="font_4 text_9">{{ totalAmount.toFixed(2) }}</text>
2025-03-22 03:18:54 +00:00
</view>
2025-03-23 10:31:11 +00:00
<view class="flex-col justify-start items-center text-wrapper" @click="wxPayFd">
<text class="font text_10">确定</text>
</view>
2025-03-22 03:18:54 +00:00
</view>
</view>
2025-03-23 10:31:11 +00:00
<uni-popup ref="popup" background-color="#fff">
<view class="popup-content">
<contactsComponentVue></contactsComponentVue>
</view>
</uni-popup>
<!-- 遮罩层 -->
<view v-if="isShow" class="overlay"></view>
2025-03-22 03:18:54 +00:00
</template>
<script setup>
2025-03-23 10:31:11 +00:00
import {nextTick, onMounted, onUnmounted, ref} from 'vue'
2025-03-22 03:18:54 +00:00
import { clothesRentUrl } from '../../../common/globalImagesUrl';
2025-03-23 10:31:11 +00:00
import { onLoad } from "@dcloudio/uni-app";
import { baseUrl } from '../../../api/request';
2025-03-24 03:33:28 +00:00
import { publicPath,bkgPubilcPath } from '../../../common/globalImagesUrl';
2025-03-23 10:31:11 +00:00
import emitter from '../../../utils/emitter';
import { JudgeIsNullity, dealResult } from '../../../common/globalFunction';
import contactsComponentVue from '../../order/component/contactsComponent.vue';
2025-03-24 03:33:28 +00:00
import { getFonts } from '../../../common/globalFont';
2025-03-23 10:31:11 +00:00
const period = ref(0)
let id = 0
const clothesInfo = ref({})
const contactInfo = ref({})
const totalAmount = ref(0)
const cookie = wx.getStorageSync('cookie')
const popup = ref(null)
//防抖相关变量
let wxPayTimer = null;
let loading = false;
let isLoading = ref(false)
let isShow = ref(false)
const openPopup = () => {
popup.value.open('bottom')
}
const closeHandler = () => {
nextTick(() => {
if (popup.value) {
popup.value.close()
}
})
}
const contactsNowInfoHandler = (val) => {
contactInfo.value = val
}
const delContactByIdHandler = (val) => {
if (contactInfo.value.id === val) {
contactInfo.value = {}
contactInfo.value.name = '请选择联系人'
}
}
const updateContactObjHandler = (val) => {
if (contactInfo.value.id === val.id) {
contactInfo.value = val
}
}
onLoad((options) => {
id = JSON.parse(options.id)
period.value = JSON.parse(options.period)
2025-03-24 03:33:28 +00:00
getFonts()
2025-03-23 10:31:11 +00:00
})
onMounted(() => {
getClothesInfoById()
getDefaultContact()
emitter.on('close', closeHandler)
emitter.on('contactsNowInfo', contactsNowInfoHandler)
emitter.on('delContactById', delContactByIdHandler)
emitter.on('updateContactObj', updateContactObjHandler)
})
onUnmounted(() => {
emitter.off('close', closeHandler)
emitter.off('contactsNowInfo', contactsNowInfoHandler)
emitter.off('delContactById', delContactByIdHandler)
emitter.off('updateContactObj', updateContactObjHandler)
})
const getClothesInfoById = async () => {
const res = await uni.request({
url: baseUrl + '/clothes/get/label/id',
method: 'POST',
header: {
cookie
},
data: {
id
}
})
clothesInfo.value = res.data.data
let singlePrice = clothesInfo.value.price
totalAmount.value = singlePrice * period.value
}
const nav = () => {
wx.openLocation({
latitude: 45.867741,
longitude: 126.560037,
name: '哈尔滨师范大学(松北校区)',
address: '黑龙江省哈尔滨市呼兰区利民经济开发区师大路1号',
success: (res) => {
console.log(res)
}
})
}
//获取用户默认联系人
const getDefaultContact = async () =>{
const res = await uni.request({
url: baseUrl + '/contacts/list',
method: 'POST',
header: {
cookie: wx.getStorageSync('cookie')
}
})
if(res.data.code === 1) {
console.log('联系人数组---->',res.data.data);
}
let contactArr = res.data.data
for(let key in contactArr) {
if(contactArr[key].isDefault === 1) {
contactInfo.value = contactArr[key]
}
}
if (JudgeIsNullity(contactInfo.value.name)) {
contactInfo.value.name = '请选择联系人'
}
}
const wxPayFd = () => { //微信支付按钮防抖
if (JudgeIsNullity(contactInfo.value.phone) || JudgeIsNullity(contactInfo.value.id)) {
uni.showToast({
title: '请选择联系人',
icon: 'error'
})
return ;
}
clearTimeout(wxPayTimer)
showLoading()
isShow.value = true
wxPayTimer = setTimeout(async () => {
await createOrder()
}, 1000)
}
function showLoading() { //加载弹窗
if (!loading) {
wx.showLoading({
title: '加载中...',
});
loading = true;
isLoading.value = true
}
}
function hideLoading() { //关闭弹窗
if (loading) {
wx.hideLoading();
loading = false;
isLoading.value = false
}
}
const createOrder = async () => {
const res = await uni.request({
url: baseUrl + '/clothesRent/add',
method: 'POST',
header: {
cookie: wx.getStorageSync('cookie')
},
data: {
clothesId: id,
contactsId: contactInfo.value.id,
rentDays: period.value
}
})
if (!dealResult(res)) {
hideLoading()
isShow.value = false
return
}
wxPay(res.data.data)
}
const wxPay = async ( oid )=> { //传入订单id
try {
const res = await uni.request({
url: baseUrl + '/wechat/payment/clothesRent/create',
method: 'POST',
header: {
'cookie': wx.getStorageSync("cookie")
},
data: { id: oid }
})
const paymentData = res.data.data
wx.requestPayment({
appid: paymentData.appId,
nonceStr: paymentData.nonceStr,
package: paymentData.packageVal,
paySign: paymentData.paySign,
timeStamp: paymentData.timeStamp,
signType: paymentData.signType,
success(res) {
uni.showModal({
content: '支付成功',
showCancel: false
})
console.log('支付成功res--->',res);
},
fail(e) {
uni.showModal({
content: '支付失败,原因为:' + e.errMsg,
showCancel: false
})
console.log('e.errMsg--->',e.errMsg);
},
complete() {
uni.redirectTo({
url: '/pages/clothesRent/clotherRentOrderList/clotherRentOrderList'
})
}
})
}catch(error) {
console.error('支付请求失败',error);
uni.showModal({
content: '支付请求失败,请重试',
showCancel: false
})
}
}
2025-03-22 03:18:54 +00:00
</script>
<style scoped lang="scss">
2025-03-23 10:31:11 +00:00
.overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.4); /* 半透明黑色背景 */
z-index: 999;
}
.popup-content {
height: 800rpx;
}
2025-03-22 03:18:54 +00:00
.ml-15 {
margin-left: 28.13rpx;
}
.mt-11 {
margin-top: 20.63rpx;
}
.page {
background-color: #ffffff;
background-size: 100% 100%;
background-repeat: no-repeat;
width: 100%;
overflow-y: auto;
overflow-x: hidden;
height: 100vh;
}
.section_2 {
padding: 30rpx 15rpx 30rpx 24.38rpx;
background-color: #ffffff;
border-radius: 18.75rpx;
}
.pos {
position: absolute;
left: 22.5rpx;
right: 24.38rpx;
top: 37.5rpx;
}
.image {
width: 50.63rpx;
height: 50.63rpx;
}
.font {
font-size: 30rpx;
2025-03-24 03:33:28 +00:00
font-family: FangZhengFonts;
2025-03-22 03:18:54 +00:00
line-height: 28.84rpx;
color: #323232;
}
.text {
color: #818181;
line-height: 25.89rpx;
}
.font_2 {
font-size: 26.25rpx;
2025-03-24 03:33:28 +00:00
font-family: FangZhengFonts;
2025-03-22 03:18:54 +00:00
line-height: 25.54rpx;
}
.text_2 {
margin: 3.75rpx 0;
color: #e79ea1;
}
.image_2 {
width: 30rpx;
height: 30rpx;
}
.section_3 {
2025-03-23 10:31:11 +00:00
padding: 25.75rpx 18.75rpx;
2025-03-22 03:18:54 +00:00
background-color: #ffffff;
border-radius: 18.75rpx;
}
.pos_2 {
position: absolute;
left: 22.5rpx;
right: 24.38rpx;
top: 168.75rpx;
}
.image_3 {
border-radius: 9.38rpx;
width: 161.25rpx;
height: 176.25rpx;
}
.group_2 {
margin-top: 3.75rpx;
}
.text_3 {
line-height: 29.18rpx;
}
.font_3 {
font-size: 30rpx;
2025-03-24 03:33:28 +00:00
font-family: FangZhengFonts;
2025-03-22 03:18:54 +00:00
line-height: 20.04rpx;
color: #323232;
}
.group {
// margin-right: 22.5rpx;
}
.image_4 {
width: 46.88rpx;
height: 46.88rpx;
}
.text_4 {
color: #323232;
line-height: 25.22rpx;
}
.group_3 {
margin-top: 37.5rpx;
}
.text_5 {
margin-right: 18.75rpx;
}
.group_4 {
margin-top: 22.5rpx;
}
.text_6 {
line-height: 28.13rpx;
}
.text_7 {
color: #c35c5d;
font-size: 33.75rpx;
2025-03-24 03:33:28 +00:00
font-family: FangZhengFonts;
2025-03-22 03:18:54 +00:00
line-height: 22.54rpx;
}
.section_4 {
padding: 26.25rpx;
background-color: #ffffff;
}
.pos_3 {
position: fixed;
bottom: 0;
left: 0;
right: 0;
}
.font_4 {
font-size: 37.5rpx;
2025-03-24 03:33:28 +00:00
font-family: FangZhengFonts;
2025-03-22 03:18:54 +00:00
}
.text_8 {
color: #323232;
line-height: 34.42rpx;
}
.text_9 {
margin-left: -7.5rpx;
color: #c35c5d;
line-height: 25.05rpx;
}
.text-wrapper {
margin-right: 3.75rpx;
padding: 22.5rpx 0;
background-color: #e79ea1;
border-radius: 187.5rpx;
width: 241.88rpx;
height: 76.88rpx;
}
.text_10 {
color: #ffffff;
line-height: 28.01rpx;
}
@import url(../../../common/css/global.css);
</style>