Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Hooke
/
mlaj
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
hookehuyr
2025-06-09 18:12:26 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
41652ef21bda21000815ae74e5ee5efed44ee01b
41652ef2
1 parent
ea83ee8e
feat(订单页面): 添加待支付订单的倒计时功能
实现待支付订单的支付倒计时显示,超时自动取消订单
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
84 additions
and
1 deletions
src/views/profile/OrdersPage.vue
src/views/profile/OrdersPage.vue
View file @
41652ef
...
...
@@ -88,6 +88,9 @@
</button>
</div>
</div>
<div v-if="order.status === 'NOT_PAY' && order.countdown" class="text-right mt-4">
<span class="text-red-500 text-sm font-medium">支付倒计时:{{ order.countdown }}</span>
</div>
</FrostedGlass>
</van-list>
...
...
@@ -187,7 +190,7 @@
</template>
<script setup>
import { ref } from 'vue'
import { ref
, computed, onMounted, onUnmounted
} from 'vue'
import { useRoute, useRouter } from 'vue-router';
import AppLayout from '@/components/layout/AppLayout.vue'
import FrostedGlass from '@/components/ui/FrostedGlass.vue'
...
...
@@ -292,6 +295,12 @@ const onLoad = async () => {
status: selectedStatus.value
});
if (res.code) {
// 待支付订单倒计时
res.data.forEach(order => {
if (order.status === 'NOT_PAY') {
startCountdown(order);
}
})
orders.value = [...orders.value, ...res.data];
finished.value = res.data.length < limit.value;
page.value = nextPage + 1;
...
...
@@ -372,4 +381,78 @@ const handleCancel = async (order) => {
// on cancel
});
};
/**
* 待支付订单的支付倒计时功能
* @param {Object} order - 订单对象
*/
const startCountdown = (order) => {
// 清除可能存在的旧定时器
if (order._countdownTimer) {
clearInterval(order._countdownTimer);
order._countdownTimer = null;
}
// 计算剩余时间(毫秒)
const current_date = new Date(order.server_time);
const end_date = new Date(order.pay_deadline_time);
let time_left = end_date - current_date;
// 检查是否已过期
if (time_left <= 0) {
// 使用Vue的响应式API更新对象属性
order.status = 'CANCEL';
order.statusText = '已取消';
order.statusColor = 'text-gray-500';
order.countdown = '';
// 强制触发视图更新
orders.value = [...orders.value];
return;
}
// 更新倒计时显示
const updateCountdown = () => {
// 计算时、分、秒
const hours = Math.floor(time_left / 3600000);
const minutes = Math.floor((time_left % 3600000) / 60000);
const seconds = Math.floor((time_left % 60000) / 1000);
// 格式化显示
order.countdown = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
// 强制触发视图更新
orders.value = [...orders.value];
// 减少剩余时间
time_left -= 1000;
// 检查是否已到期
if (time_left < 0) {
clearInterval(order._countdownTimer);
order._countdownTimer = null;
order.status = 'CANCEL';
order.statusText = '已取消';
order.statusColor = 'text-gray-500';
order.countdown = '';
// 强制触发视图更新
orders.value = [...orders.value];
}
};
// 立即执行一次更新
updateCountdown();
// 设置定时器,每秒更新一次
order._countdownTimer = setInterval(updateCountdown, 1000);
// 组件卸载时清除定时器
onUnmounted(() => {
if (order._countdownTimer) {
clearInterval(order._countdownTimer);
order._countdownTimer = null;
}
});
};
</script>
...
...
Please
register
or
login
to post a comment