Files
beauty-miniapp-uni/pages/verify/code.vue
T
2026-06-29 10:54:33 +08:00

209 lines
5.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="container">
<view class="card hero">
<view class="t1">支付成功</view>
<view class="t2 muted">已为你生成订单支持随时预约/到店核销</view>
<view class="code">{{ o.verifyCode }}</view>
<view class="row between info">
<view class="muted">{{ o.projectName }}</view>
<view class="amt">¥{{ o.amount }}</view>
</view>
<view class="muted info2" v-if="o.orderType === 'coupon'">
{{ o.couponPlanLabel || '卡券' }} · {{ o.validText || '有效期以到店确认' }} · 剩余次数{{ o.remainingTimes }}
</view>
<view class="muted info2" v-else>预约{{ o.appointmentDate }} {{ o.appointmentSlot }}</view>
</view>
<view class="card block">
<view class="line row between">
<view class="muted">订单状态</view>
<view class="tag">{{ o.status }}</view>
</view>
<view class="line row between">
<view class="muted">核销方式</view>
<view>门店扫码 / 手动输码</view>
</view>
<view class="line row between" v-if="o.validText && o.orderType === 'coupon'">
<view class="muted">有效期</view>
<view>{{ o.validText }}</view>
</view>
<view class="line row between" v-if="o.orderType === 'booking'">
<view class="muted">技师</view>
<view>{{ o.technicianName }}</view>
</view>
</view>
<view class="btn btn-primary" @tap="goBooking">去预约</view>
<view class="btn btn-ghost" @tap="goOrders">查看订单</view>
<view class="btn btn-ghost" @tap="goMember">返回个人中心</view>
<AiFloat />
</view>
</template>
<script>
import AiFloat from '@/components/AiFloat.vue'
import { demoOrders } from '@/common/demoOrders'
function safeJsonParse(s) {
try {
return JSON.parse(s)
} catch (e) {
return null
}
}
const __DBG_URL = 'http://127.0.0.1:7777/event'
export default {
components: { AiFloat },
data() {
return {
order: null
}
},
onLoad(query) {
//#region debug-point verify-code-load
try {
uni.request({
url: __DBG_URL,
method: 'POST',
timeout: 2000,
data: {
sessionId: 'orders-detail-blank',
runId: 'pre-fix',
hypothesisId: 'H2',
msg: 'verify/code onLoad',
queryKeys: query ? Object.keys(query) : [],
payloadLen: query && query.payload ? String(query.payload).length : 0
}
})
} catch (e) {}
//#endregion debug-point verify-code-load
const raw = query.payload ? safeJsonParse(decodeURIComponent(query.payload)) : null
if (raw) this.order = raw
},
computed: {
o() {
const defaultCoupon = Array.isArray(demoOrders) ? demoOrders.find((x) => x && x.orderType === 'coupon') : null
return (
this.order ||
defaultCoupon ||
demoOrders[0] || {
id: 'ord_demo_fallback',
status: '待核销',
amount: 99,
projectId: 'p1',
projectName: '水氧净透体验',
durationMin: 60,
orderType: 'coupon',
couponPlanLabel: '单次券',
validText: '有效期以到店确认',
remainingTimes: 1,
verifyCode: 'VC20260622000'
}
)
}
},
methods: {
goBooking() {
const o = this.o
//#region debug-point verify-code-goBooking
try {
uni.request({
url: __DBG_URL,
method: 'POST',
timeout: 2000,
data: {
sessionId: 'orders-detail-blank',
runId: 'pre-fix',
hypothesisId: 'H2',
msg: 'verify/code goBooking',
projectId: o && o.projectId ? String(o.projectId) : ''
}
})
} catch (e) {}
//#endregion debug-point verify-code-goBooking
uni.navigateTo({ url: `/pages/booking/create?projectId=${o.projectId}` })
},
goOrders() {
//#region debug-point verify-code-goOrders
try {
uni.request({
url: __DBG_URL,
method: 'POST',
timeout: 2000,
data: {
sessionId: 'orders-detail-blank',
runId: 'pre-fix',
hypothesisId: 'H2',
msg: 'verify/code goOrders',
orderId: this.o && this.o.id ? String(this.o.id) : ''
}
})
} catch (e) {}
//#endregion debug-point verify-code-goOrders
const payload = encodeURIComponent(JSON.stringify(this.o))
uni.navigateTo({ url: `/pages/orders/detail?payload=${payload}` })
},
goMember() {
uni.switchTab({ url: '/pages/member/index' })
}
}
}
</script>
<style lang="scss" scoped>
.hero {
padding: 28rpx;
background: linear-gradient(135deg, rgba(17, 24, 39, 1) 0%, rgba(59, 130, 246, 1) 100%);
border: 0;
color: #fff;
}
.t1 {
font-size: 42rpx;
font-weight: 950;
}
.t2 {
margin-top: 10rpx;
color: rgba(255, 255, 255, 0.82);
font-size: 26rpx;
}
.code {
margin-top: 22rpx;
padding: 22rpx;
border-radius: 22rpx;
background: rgba(255, 255, 255, 0.12);
border: 1rpx dashed rgba(255, 255, 255, 0.42);
font-size: 50rpx;
font-weight: 950;
letter-spacing: 2rpx;
text-align: center;
}
.info {
margin-top: 18rpx;
}
.amt {
font-weight: 950;
}
.info2 {
margin-top: 10rpx;
color: rgba(255, 255, 255, 0.82);
font-size: 26rpx;
}
.block {
margin-top: 18rpx;
padding: 22rpx;
}
.line {
padding: 14rpx 0;
}
.tag {
padding: 10rpx 14rpx;
border-radius: 999rpx;
background: rgba(255, 255, 255, 0.14);
}
</style>