|
|
|
|
@ -239,13 +239,14 @@
|
|
|
|
|
<view class="tab-content">
|
|
|
|
|
<!-- 付款二维码 Tab -->
|
|
|
|
|
<view v-if="activeTab === 'qrcode'" class="tab-panel">
|
|
|
|
|
<view class="qrcode-wrapper">
|
|
|
|
|
<view class="qrcode-wrapper" style="position: relative;">
|
|
|
|
|
<!-- 显示图片(可长按识别) -->
|
|
|
|
|
<image
|
|
|
|
|
v-if="qrcodeImagePath"
|
|
|
|
|
:src="qrcodeImagePath"
|
|
|
|
|
mode="aspectFit"
|
|
|
|
|
show-menu-by-longpress
|
|
|
|
|
:class="{ 'qrcode-disabled': qrcodeExpired }"
|
|
|
|
|
style="width: 400rpx; height: 400rpx; display: block; margin: 0 auto;"
|
|
|
|
|
></image>
|
|
|
|
|
<!-- Canvas 绘制(使用 hide 属性隐藏,但保持可渲染) -->
|
|
|
|
|
@ -271,6 +272,12 @@
|
|
|
|
|
<view v-else style="text-align: center; color: #999; padding: 40rpx;">
|
|
|
|
|
正在生成二维码...
|
|
|
|
|
</view>
|
|
|
|
|
<!-- 二维码失效遮罩层 -->
|
|
|
|
|
<view v-if="qrcodeExpired && (qrcodeImagePath || payQrCode)" class="qrcode-overlay" @click="regetQrcode">
|
|
|
|
|
<view class="reget-btn">
|
|
|
|
|
<text>重新获取</text>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="qrcode-tip">请使用微信扫码支付</view>
|
|
|
|
|
</view>
|
|
|
|
|
@ -282,15 +289,17 @@
|
|
|
|
|
type="primary"
|
|
|
|
|
shape="circle"
|
|
|
|
|
@click="scrollToPayQr"
|
|
|
|
|
:disabled="payCooldownSeconds > 0"
|
|
|
|
|
class="pay-btn-large"
|
|
|
|
|
:custom-style="{
|
|
|
|
|
width: '100%',
|
|
|
|
|
height: '88rpx',
|
|
|
|
|
fontSize: '32rpx',
|
|
|
|
|
fontWeight: '500'
|
|
|
|
|
fontWeight: '500',
|
|
|
|
|
opacity: payCooldownSeconds > 0 ? 0.6 : 1
|
|
|
|
|
}"
|
|
|
|
|
>
|
|
|
|
|
立即支付
|
|
|
|
|
{{ payCooldownSeconds > 0 ? `支付成功,${payCooldownSeconds}秒后可再次支付` : '立即支付' }}
|
|
|
|
|
</u-button>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
@ -759,11 +768,15 @@
|
|
|
|
|
isShowPayPopup: false,
|
|
|
|
|
payQrCode: '', // 支付二维码
|
|
|
|
|
qrcodeImagePath: '', // 二维码图片路径
|
|
|
|
|
qrcodeExpired: false, // 二维码是否失效
|
|
|
|
|
payTimer: null, // 定时器
|
|
|
|
|
showPriceEdit: false,
|
|
|
|
|
editPrice: '',
|
|
|
|
|
showPayQrCode: false,
|
|
|
|
|
activeTab: 'qrcode', // 当前选中的 tab: 'qrcode' 或 'pay'
|
|
|
|
|
paySuccessTime: null, // 支付成功的时间戳
|
|
|
|
|
payCooldownSeconds: 0, // 支付冷却倒计时(秒)
|
|
|
|
|
payCooldownTimer: null, // 支付冷却定时器
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
onReady() {
|
|
|
|
|
@ -790,11 +803,12 @@
|
|
|
|
|
this.getList(option.type, option.site_id);
|
|
|
|
|
this.getHospital(option.site_id);
|
|
|
|
|
|
|
|
|
|
// 重置二维码显示状态
|
|
|
|
|
this.showPayQrCode = false;
|
|
|
|
|
this.payQrCode = '';
|
|
|
|
|
this.qrcodeImagePath = '';
|
|
|
|
|
this.activeTab = 'qrcode'; // 默认显示二维码 tab
|
|
|
|
|
// 重置二维码显示状态
|
|
|
|
|
this.showPayQrCode = false;
|
|
|
|
|
this.payQrCode = '';
|
|
|
|
|
this.qrcodeImagePath = '';
|
|
|
|
|
this.qrcodeExpired = false;
|
|
|
|
|
this.activeTab = 'qrcode'; // 默认显示二维码 tab
|
|
|
|
|
},
|
|
|
|
|
onUnload() {
|
|
|
|
|
// 清除支付状态检查定时器
|
|
|
|
|
@ -802,6 +816,8 @@
|
|
|
|
|
clearInterval(this.payTimer)
|
|
|
|
|
this.payTimer = null
|
|
|
|
|
}
|
|
|
|
|
// 清除支付冷却定时器
|
|
|
|
|
this.stopPayCooldown()
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
// 获取产品列表
|
|
|
|
|
@ -819,16 +835,33 @@
|
|
|
|
|
},
|
|
|
|
|
async getDetail(id) {
|
|
|
|
|
console.log(id, this.orderId);
|
|
|
|
|
// 保存当前显示状态,防止被接口数据覆盖
|
|
|
|
|
const wasShowingQrCode = this.showPayQrCode
|
|
|
|
|
const wasPayStatus = this.form.pay_status
|
|
|
|
|
const isQrcodeTab = this.activeTab === 'qrcode'
|
|
|
|
|
|
|
|
|
|
await this.$u.api
|
|
|
|
|
.accompanyOrderDetail({
|
|
|
|
|
id: id || this.orderId,
|
|
|
|
|
})
|
|
|
|
|
.then((res) => {
|
|
|
|
|
// 保存接口返回的真实 pay_status
|
|
|
|
|
const realPayStatus = res.pay_status
|
|
|
|
|
|
|
|
|
|
for (const key in this.form) {
|
|
|
|
|
if (res.hasOwnProperty(key)) {
|
|
|
|
|
this.form[key] = res[key];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 如果当前在二维码 tab,强制保持显示状态和支付状态
|
|
|
|
|
if (isQrcodeTab) {
|
|
|
|
|
this.showPayQrCode = true
|
|
|
|
|
this.form.pay_status = 1
|
|
|
|
|
} else if (wasShowingQrCode || wasPayStatus === 1) {
|
|
|
|
|
// 如果之前已经显示了二维码区域,强制保持显示状态(防止接口数据覆盖)
|
|
|
|
|
this.showPayQrCode = true
|
|
|
|
|
this.form.pay_status = 1
|
|
|
|
|
}
|
|
|
|
|
// 确保数量字段有默认值
|
|
|
|
|
if (!this.form.quantity) {
|
|
|
|
|
this.form.quantity = 1;
|
|
|
|
|
@ -1045,13 +1078,25 @@
|
|
|
|
|
},
|
|
|
|
|
async payOrder(re) {
|
|
|
|
|
try {
|
|
|
|
|
const {
|
|
|
|
|
result
|
|
|
|
|
} = await this.$u.api.accompanyPay({
|
|
|
|
|
const res = await this.$u.api.accompanyPay({
|
|
|
|
|
no: re.no,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
console.log("获取支付参数:", res,res.errcode && res.errcode===10002);
|
|
|
|
|
if(res.errcode && res.errcode===10002){
|
|
|
|
|
// 强制保持二维码显示状态和订单状态
|
|
|
|
|
this.showPayQrCode = true
|
|
|
|
|
this.form.pay_status = 1
|
|
|
|
|
// 设置二维码失效状态
|
|
|
|
|
this.qrcodeExpired = true
|
|
|
|
|
uni.showToast({
|
|
|
|
|
title: res.errmsg,
|
|
|
|
|
icon: 'none'
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 如果成功获取二维码,重置失效状态
|
|
|
|
|
this.qrcodeExpired = false
|
|
|
|
|
const result = res.result
|
|
|
|
|
//待支付状态
|
|
|
|
|
this.form.pay_status = 1
|
|
|
|
|
this.form.no = re.no
|
|
|
|
|
@ -1086,8 +1131,10 @@
|
|
|
|
|
// 隐藏loading
|
|
|
|
|
uni.hideLoading()
|
|
|
|
|
|
|
|
|
|
// 开始轮询支付状态
|
|
|
|
|
this.startPayCheck()
|
|
|
|
|
// 开始检查支付状态(只在二维码 tab 时启动)
|
|
|
|
|
if (this.activeTab === 'qrcode') {
|
|
|
|
|
this.startPayCheck()
|
|
|
|
|
}
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.log('支付错误:', err);
|
|
|
|
|
|
|
|
|
|
@ -1121,28 +1168,71 @@
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 停止支付状态检测
|
|
|
|
|
stopPayCheck() {
|
|
|
|
|
if (this.payTimer) {
|
|
|
|
|
clearInterval(this.payTimer)
|
|
|
|
|
this.payTimer = null
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// 开始检查支付状态
|
|
|
|
|
startPayCheck() {
|
|
|
|
|
// 先清除旧的定时器,避免重复创建
|
|
|
|
|
this.stopPayCheck()
|
|
|
|
|
|
|
|
|
|
// 如果订单已支付(pay_status === 2)或不在二维码 tab,不启动检测
|
|
|
|
|
// pay_status === 0(未支付)或 pay_status === 1(待支付)时都需要检测
|
|
|
|
|
if (this.form.pay_status === 2 || this.activeTab !== 'qrcode') {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.payTimer = setInterval(async () => {
|
|
|
|
|
// 如果不在二维码 tab 或订单已支付,停止检测
|
|
|
|
|
if (this.activeTab !== 'qrcode' || this.form.pay_status === 2) {
|
|
|
|
|
this.stopPayCheck()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const res = await this.$u.api.accompanyOrderDetail({
|
|
|
|
|
id: this.orderId
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 检查支付状态:pay_status === 1 表示支付成功
|
|
|
|
|
if (res.pay_status === 1) {
|
|
|
|
|
clearInterval(this.payTimer)
|
|
|
|
|
this.payTimer = null
|
|
|
|
|
// 支付成功,停止检测
|
|
|
|
|
this.stopPayCheck()
|
|
|
|
|
|
|
|
|
|
// 隐藏支付二维码
|
|
|
|
|
this.showPayQrCode = false
|
|
|
|
|
this.payQrCode = ''
|
|
|
|
|
this.qrcodeImagePath = ''
|
|
|
|
|
this.qrcodeExpired = false
|
|
|
|
|
this.form.pay_status = 2
|
|
|
|
|
|
|
|
|
|
// 刷新订单详情
|
|
|
|
|
await this.getDetail(this.orderId)
|
|
|
|
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
title: '支付成功',
|
|
|
|
|
icon: 'success'
|
|
|
|
|
icon: 'success',
|
|
|
|
|
duration: 1500
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 延迟跳转,确保 toast 显示完成
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
uni.redirectTo({
|
|
|
|
|
url: `/package_sub/order/orderStaffDetail?id=${this.orderId}`
|
|
|
|
|
})
|
|
|
|
|
}, 1500)
|
|
|
|
|
} else if (res.pay_status === 0) {
|
|
|
|
|
// 如果接口返回未支付状态,但在二维码 tab 中,保持显示状态
|
|
|
|
|
// 不更新 form.pay_status,避免跳回填写预约界面
|
|
|
|
|
// 只更新其他订单信息,不更新 pay_status
|
|
|
|
|
this.showPayQrCode = true
|
|
|
|
|
// form.pay_status 保持为 1,不更新为 0
|
|
|
|
|
}
|
|
|
|
|
// 其他状态(如 pay_status === 2)已经在上面处理了
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.error('检查支付状态失败', err)
|
|
|
|
|
}
|
|
|
|
|
@ -1154,6 +1244,42 @@
|
|
|
|
|
if (this.payTimer) {
|
|
|
|
|
clearInterval(this.payTimer)
|
|
|
|
|
}
|
|
|
|
|
// 清除支付冷却定时器
|
|
|
|
|
this.stopPayCooldown()
|
|
|
|
|
},
|
|
|
|
|
// 重新获取二维码
|
|
|
|
|
regetQrcode() {
|
|
|
|
|
if (this.form && this.form.no) {
|
|
|
|
|
this.payOrder({ no: this.form.no, time: this.form.created_at })
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// 启动支付冷却期(30秒)
|
|
|
|
|
startPayCooldown() {
|
|
|
|
|
// 先清除旧的定时器
|
|
|
|
|
this.stopPayCooldown()
|
|
|
|
|
|
|
|
|
|
// 设置冷却时间为30秒
|
|
|
|
|
this.payCooldownSeconds = 30
|
|
|
|
|
this.paySuccessTime = Date.now()
|
|
|
|
|
|
|
|
|
|
// 启动倒计时定时器
|
|
|
|
|
this.payCooldownTimer = setInterval(() => {
|
|
|
|
|
this.payCooldownSeconds--
|
|
|
|
|
|
|
|
|
|
if (this.payCooldownSeconds <= 0) {
|
|
|
|
|
// 冷却期结束
|
|
|
|
|
this.stopPayCooldown()
|
|
|
|
|
}
|
|
|
|
|
}, 1000) // 每秒更新一次
|
|
|
|
|
},
|
|
|
|
|
// 停止支付冷却期
|
|
|
|
|
stopPayCooldown() {
|
|
|
|
|
if (this.payCooldownTimer) {
|
|
|
|
|
clearInterval(this.payCooldownTimer)
|
|
|
|
|
this.payCooldownTimer = null
|
|
|
|
|
}
|
|
|
|
|
this.payCooldownSeconds = 0
|
|
|
|
|
this.paySuccessTime = null
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 更多菜单点击
|
|
|
|
|
@ -1283,67 +1409,54 @@
|
|
|
|
|
|
|
|
|
|
// Tab 切换
|
|
|
|
|
async switchTab(tab) {
|
|
|
|
|
// 如果点击的是当前 tab,不执行任何操作
|
|
|
|
|
if (this.activeTab === tab) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 先切换 tab,立即显示内容,避免闪烁
|
|
|
|
|
const previousTab = this.activeTab
|
|
|
|
|
this.activeTab = tab
|
|
|
|
|
|
|
|
|
|
// 如果切换到二维码 tab
|
|
|
|
|
// 如果切换到非二维码 tab,停止支付状态检测
|
|
|
|
|
if (tab !== 'qrcode') {
|
|
|
|
|
this.stopPayCheck()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果切换到二维码 tab,先设置显示状态,防止底部栏闪烁
|
|
|
|
|
if (tab === 'qrcode') {
|
|
|
|
|
// 如果已经有二维码数据(图片或 URL),直接显示,不重新获取
|
|
|
|
|
if (this.qrcodeImagePath || this.payQrCode) {
|
|
|
|
|
// 只在后台静默更新订单信息,不重置二维码,使用 setTimeout 延迟执行避免阻塞 UI
|
|
|
|
|
if (this.orderId) {
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
this.getDetail(this.orderId).catch(err => {
|
|
|
|
|
console.error('获取订单详情失败:', err)
|
|
|
|
|
})
|
|
|
|
|
}, 100)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果没有二维码数据,才重新获取
|
|
|
|
|
if (this.orderId) {
|
|
|
|
|
// 使用 $nextTick 确保 DOM 更新完成后再获取数据
|
|
|
|
|
this.$nextTick(async () => {
|
|
|
|
|
// 重新获取订单详情
|
|
|
|
|
await this.getDetail(this.orderId)
|
|
|
|
|
|
|
|
|
|
// 如果订单未支付,重新获取二维码
|
|
|
|
|
if (this.form.pay_status === 0 && this.form.no) {
|
|
|
|
|
try {
|
|
|
|
|
const payRes = await this.$u.api.accompanyPay({
|
|
|
|
|
no: this.form.no
|
|
|
|
|
})
|
|
|
|
|
const result = payRes.result || payRes
|
|
|
|
|
if (result && result.code_url) {
|
|
|
|
|
this.payQrCode = result.code_url
|
|
|
|
|
// 重置图片路径,等待二维码生成完成后转换为图片
|
|
|
|
|
this.qrcodeImagePath = ''
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('获取二维码失败:', error)
|
|
|
|
|
uni.showToast({
|
|
|
|
|
icon: 'none',
|
|
|
|
|
title: '获取二维码失败'
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
this.showPayQrCode = true
|
|
|
|
|
this.form.pay_status = 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 每次切换 tab 都重新请求接口,获取最新的订单信息(包含最新的 no)
|
|
|
|
|
if (this.orderId) {
|
|
|
|
|
await this.getDetail(this.orderId)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果切换到二维码 tab,直接重新获取二维码
|
|
|
|
|
if (tab === 'qrcode' && this.form.no) {
|
|
|
|
|
await this.payOrder({ no: this.form.no, time: this.form.created_at })
|
|
|
|
|
}
|
|
|
|
|
// 切换到立即支付 tab 时,不需要重新获取订单详情,直接显示按钮即可
|
|
|
|
|
// 订单号已经在 form.no 中,点击按钮时会重新获取最新订单信息
|
|
|
|
|
},
|
|
|
|
|
// 立即支付方法
|
|
|
|
|
scrollToPayQr: async function() {
|
|
|
|
|
// 检查是否在支付冷却期内
|
|
|
|
|
if (this.payCooldownSeconds > 0) {
|
|
|
|
|
uni.showToast({
|
|
|
|
|
title: `支付成功后${this.payCooldownSeconds}秒内不能重复支付`,
|
|
|
|
|
icon: 'none',
|
|
|
|
|
duration: 2000
|
|
|
|
|
})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 保存当前显示状态,防止 getDetail 重置状态
|
|
|
|
|
const wasShowingQrCode = this.showPayQrCode
|
|
|
|
|
const wasPayStatus = this.form.pay_status
|
|
|
|
|
|
|
|
|
|
// 每次点击都重新获取最新的订单信息(包含最新的 no)
|
|
|
|
|
if (this.orderId) {
|
|
|
|
|
await this.getDetail(this.orderId)
|
|
|
|
|
// 如果之前已经显示了二维码区域,强制保持显示状态(防止 getDetail 重置)
|
|
|
|
|
if (wasShowingQrCode || wasPayStatus === 1) {
|
|
|
|
|
this.showPayQrCode = true
|
|
|
|
|
this.form.pay_status = 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!this.form.no) {
|
|
|
|
|
@ -1359,8 +1472,21 @@
|
|
|
|
|
const res = await this.$u.api.accompanyOrderPayParams({
|
|
|
|
|
no: this.form.no
|
|
|
|
|
});
|
|
|
|
|
console.log("获取支付参数:", res);
|
|
|
|
|
|
|
|
|
|
console.log("获取支付参数:", res,res.errcode && res.errcode===10002);
|
|
|
|
|
if(res.errcode && res.errcode===10002){
|
|
|
|
|
// 强制保持二维码显示状态和订单状态(即使 getDetail 可能已经重置了)
|
|
|
|
|
this.showPayQrCode = true
|
|
|
|
|
this.form.pay_status = 1
|
|
|
|
|
// 如果当前在二维码 tab,设置二维码失效状态
|
|
|
|
|
if (this.activeTab === 'qrcode') {
|
|
|
|
|
this.qrcodeExpired = true
|
|
|
|
|
}
|
|
|
|
|
uni.showToast({
|
|
|
|
|
title: res.errmsg,
|
|
|
|
|
icon: 'none'
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 从嵌套的config对象中获取支付参数
|
|
|
|
|
const payConfig = res.config || res;
|
|
|
|
|
|
|
|
|
|
@ -1375,10 +1501,20 @@
|
|
|
|
|
success: () => {
|
|
|
|
|
uni.showToast({
|
|
|
|
|
title: '支付成功',
|
|
|
|
|
icon: 'success'
|
|
|
|
|
icon: 'success',
|
|
|
|
|
duration: 1500
|
|
|
|
|
});
|
|
|
|
|
// 支付成功后刷新订单详情
|
|
|
|
|
this.getDetail();
|
|
|
|
|
// 启动支付冷却期(30秒)
|
|
|
|
|
this.startPayCooldown();
|
|
|
|
|
|
|
|
|
|
// 延迟跳转,确保 toast 显示完成
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
uni.redirectTo({
|
|
|
|
|
url: `/package_sub/order/orderStaffDetail?id=${this.orderId}`
|
|
|
|
|
})
|
|
|
|
|
}, 1500)
|
|
|
|
|
},
|
|
|
|
|
fail: (err) => {
|
|
|
|
|
if (err.errMsg && err.errMsg.indexOf('cancel') > -1) {
|
|
|
|
|
@ -2074,6 +2210,40 @@
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
image {
|
|
|
|
|
&.qrcode-disabled {
|
|
|
|
|
filter: grayscale(100%);
|
|
|
|
|
opacity: 0.5;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.qrcode-overlay {
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: 20rpx;
|
|
|
|
|
left: 20rpx;
|
|
|
|
|
right: 20rpx;
|
|
|
|
|
bottom: 20rpx;
|
|
|
|
|
background: rgba(0, 0, 0, 0.5);
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
border-radius: 8rpx;
|
|
|
|
|
|
|
|
|
|
.reget-btn {
|
|
|
|
|
background: #1479ff;
|
|
|
|
|
color: #fff;
|
|
|
|
|
padding: 20rpx 40rpx;
|
|
|
|
|
border-radius: 40rpx;
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
|
|
|
|
|
&:active {
|
|
|
|
|
opacity: 0.8;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.qrcode-tip {
|
|
|
|
|
|