feat: 质惠游 H5 一期 —— 门票模块全链路(微信公众号版)

从 xghmall(云闪付版湘工游)迁移民票模块,改造为微信公众号 H5:

- 技术栈沿用 uni-app + Vue2 + uView(含定制版日历组件)
- 登录/支付独立成层(common/auth.js、common/pay.js):
  一期假登录(测试手机号)+ 模拟支付,后端微信接口就绪后只换这两处
- 登录页重写:短信验证码 + 公众号网页授权(code 换用户信息)预留
- 门票列表页为入口页(进页必须登录),加订单悬浮按钮
- 支付成功页接通:查看订单/继续逛逛 + 订单状态轮询
- 详情页定位导航改用 uni.openLocation + 高德网页兜底
- 出行人页:身份证 18 位格式校验,删除死的删除按钮,修正证件类型回显笔误
- 清理云闪付 SDK、支付宝授权、死页面引用等残留

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
xuchao
2026-07-21 00:43:59 +08:00
co-authored by Claude Opus 4.8
commit 4190565eb7
192 changed files with 35664 additions and 0 deletions
+163
View File
@@ -0,0 +1,163 @@
<template>
<view v-if="obj">
<view class="od_top">
<view class="od_top_first">
<image src="http://cdn.hntgov.net/online/static/ps_ps.png"></image>支付成功
</view>
</view>
<view style="background-color: #fff;">
<view class="od_sh">
<image style="width: 32rpx;height: 28rpx;" src="http://cdn.hntgov.net/online/static/pas_ps.png">
</image>
<view class="od_sh_right">
<!-- xuchao: 支付方式改为微信支付 -->
<text style="color: #696969;">支付方式:<text style="color: #3D3D3D;">微信支付</text></text>
<text style="color: #696969;padding-top: 16rpx;">实付金额:<text
style="color: #3D3D3D;">¥{{(obj.order.orderAmount/100).toFixed(2)||0}}</text></text>
</view>
</view>
<view class="od_line"></view>
<view class="ps_item">
<!-- xuchao: 接通"查看订单"入口(旧版此按钮被注释成了死页面) -->
<view class="ps_item_item" style="color: #181617;" @tap='seeOrder()'>查看订单</view>
<view style="width: 1rpx;height: 48rpx;background-color: #E7E6E6;"></view>
<view class="ps_item_item" style="color: #ED2D38;" @tap='toMall()'>继续逛逛</view>
</view>
</view>
<u-toast ref="uToast" />
</view>
</template>
<script>
// xuchao: 支付成功页 —— 支付完成后跳入,轮询订单状态直到后端确认
var that = ''
export default {
data() {
return {
id: '',
obj: "",
// xuchao: 轮询订单状态(等待后端支付回调把订单从"待支付"更新掉)
pollTimer: null,
pollTimes: 5
}
},
onLoad(e) {
that = this
that.id = e.id
that.getOrderDetail()
},
onUnload() {
clearInterval(this.pollTimer)
},
methods: {
seeOrder() {
uni.reLaunch({
url: 'orderlist'
})
},
// xuchao: "继续逛逛"回到门票列表(旧版指向的商城页已不存在)
toMall() {
uni.reLaunch({
url: '/pages/ticket/scenic'
})
},
getOrderDetail() {
that.$u.api.getTicketsOrderDetail({
id: this.id,
}).then(res => {
if (res) {
this.obj = res.data
// 订单仍为待支付时轮询,最多 5 次(每次间隔 2 秒)
if (this.obj.order.orderStatus == 'WAITPAY' && this.pollTimes > 0) {
clearInterval(this.pollTimer)
this.pollTimer = setInterval(() => {
this.pollTimes--
if (this.pollTimes <= 0) {
clearInterval(this.pollTimer)
return
}
this.getOrderDetail()
}, 2000)
} else {
clearInterval(this.pollTimer)
}
}
})
}
}
}
</script>
<style>
page {
background-color: #f7f7f7;
}
</style>
<style scoped lang="scss">
.ps_item {
width: 690rpx;
margin-left: 30rpx;
height: 96rpx;
align-items: center;
display: flex;
.ps_item_item {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
font-size: 30rpx;
font-weight: bold;
}
}
.od_top {
width: 750rpx;
height: 210rpx;
background: linear-gradient(90deg, #FF3F3C -8%, #FFA371 107%);
padding-top: 56rpx;
padding-left: 70rpx;
display: flex;
flex-direction: column;
}
.od_top_first {
display: flex;
align-items: center;
color: #FFF;
font-size: 34rpx;
}
.od_top_first image {
width: 50rpx;
height: 50rpx;
margin-right: 20rpx;
}
.od_sh {
padding: 30rpx;
display: flex;
align-items: center;
font-size: 26rpx;
background-color: #fff;
.od_sh_right {
width: 640rpx;
margin-left: 18rpx;
display: flex;
flex-direction: column;
}
}
.od_line {
width: 690rpx;
height: 1rpx;
background-color: #E7E6E6;
margin-left: 30rpx;
}
</style>