204 lines
3.8 KiB
Vue
204 lines
3.8 KiB
Vue
|
|
<template>
|
|||
|
|
<view class="page">
|
|||
|
|
<u-navbar title="配额二维码赠送" :border-bottom="false" :background="bgc" title-color="#000" title-size="34" height="44" />
|
|||
|
|
|
|||
|
|
<view class="ewm">
|
|||
|
|
<canvas id="quotaQrcode" canvas-id="quotaQrcode" class="qr-canvas" />
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<!-- 文本信息:名称 / 数量 / 过期时间 -->
|
|||
|
|
<view class="info-box" v-if="code">
|
|||
|
|
<view class="row">
|
|||
|
|
<text class="label">卡券名称</text>
|
|||
|
|
<text class="value">{{ name || '—' }}</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="row">
|
|||
|
|
<text class="label">赠送数量</text>
|
|||
|
|
<text class="value highlight">{{ quantity || 0 }}</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="row" v-if="expireTime">
|
|||
|
|
<text class="label">过期时间</text>
|
|||
|
|
<text class="value">{{ expireTime }}</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="saveQr" @click="saveQrcode">
|
|||
|
|
保存二维码
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import UQRCode from 'uqrcodejs';
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
bgc: {
|
|||
|
|
backgroundColor: "#FFFFFF",
|
|||
|
|
},
|
|||
|
|
http: this.$store.state.app.urlConfig || {},
|
|||
|
|
code: '',
|
|||
|
|
name: '',
|
|||
|
|
quantity: '',
|
|||
|
|
expireTime: ''
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
onLoad(e) {
|
|||
|
|
this.code = e.code || ''
|
|||
|
|
this.name = decodeURIComponent(e.name || '')
|
|||
|
|
this.quantity = e.quantity || ''
|
|||
|
|
this.expireTime = decodeURIComponent(e.expireTime || '')
|
|||
|
|
|
|||
|
|
if (!this.code) {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '缺少编号',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
this.generateQrcode()
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
// 生成配额二维码(礼品码)
|
|||
|
|
generateQrcode() {
|
|||
|
|
const qr = new UQRCode()
|
|||
|
|
const qrSizeRpx = 600
|
|||
|
|
const qrSizePx = uni.upx2px(qrSizeRpx)
|
|||
|
|
|
|||
|
|
// 二维码承载链接:vipGiftCodePrefix + ?c=code
|
|||
|
|
const prefix = (this.http && this.http.vipGiftCodePrefix) || ''
|
|||
|
|
const qrData = prefix + '?c=' + this.code
|
|||
|
|
|
|||
|
|
qr.data = qrData
|
|||
|
|
qr.size = qrSizePx
|
|||
|
|
|
|||
|
|
const ctx = uni.createCanvasContext('quotaQrcode', this)
|
|||
|
|
qr.canvasContext = ctx
|
|||
|
|
qr.make()
|
|||
|
|
qr.drawCanvas()
|
|||
|
|
|
|||
|
|
// 这里只生成二维码,下面的文字用普通视图展示
|
|||
|
|
},
|
|||
|
|
// 保存二维码到相册
|
|||
|
|
saveQrcode() {
|
|||
|
|
const width = uni.upx2px(600)
|
|||
|
|
const height = uni.upx2px(700)
|
|||
|
|
uni.canvasToTempFilePath({
|
|||
|
|
canvasId: 'quotaQrcode',
|
|||
|
|
x: 0,
|
|||
|
|
y: 0,
|
|||
|
|
width,
|
|||
|
|
height,
|
|||
|
|
fileType: 'jpg',
|
|||
|
|
quality: 1,
|
|||
|
|
success: (res) => {
|
|||
|
|
uni.saveImageToPhotosAlbum({
|
|||
|
|
filePath: res.tempFilePath,
|
|||
|
|
success: () => {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '保存成功',
|
|||
|
|
icon: 'success'
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
fail: () => {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '保存失败',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
fail: () => {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '生成二维码失败',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss">
|
|||
|
|
page {
|
|||
|
|
background-color: #F9FAFB;
|
|||
|
|
min-height: 100vh;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.page {
|
|||
|
|
padding-bottom: constant(safe-area-inset-bottom);
|
|||
|
|
padding-bottom: env(safe-area-inset-bottom);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.tip {
|
|||
|
|
margin: 32rpx 40rpx 0;
|
|||
|
|
font-size: 24rpx;
|
|||
|
|
color: #6B7280;
|
|||
|
|
line-height: 1.6;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.ewm {
|
|||
|
|
margin-top: 120rpx;
|
|||
|
|
width: 100%;
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: center;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.qr-canvas {
|
|||
|
|
width: 600rpx;
|
|||
|
|
height: 700rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.info-box {
|
|||
|
|
margin: 32rpx 40rpx 0;
|
|||
|
|
padding: 20rpx 24rpx;
|
|||
|
|
background: #FFFFFF;
|
|||
|
|
border-radius: 16rpx;
|
|||
|
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
|
|||
|
|
|
|||
|
|
.row {
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: space-between;
|
|||
|
|
align-items: center;
|
|||
|
|
margin-bottom: 12rpx;
|
|||
|
|
|
|||
|
|
&:last-child {
|
|||
|
|
margin-bottom: 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.label {
|
|||
|
|
font-size: 24rpx;
|
|||
|
|
color: #9CA3AF;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.value {
|
|||
|
|
font-size: 26rpx;
|
|||
|
|
color: #374151;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.value.highlight {
|
|||
|
|
color: #2563EB;
|
|||
|
|
font-weight: 600;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.saveQr {
|
|||
|
|
margin: 0 auto;
|
|||
|
|
margin-top: 80rpx;
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: center;
|
|||
|
|
width: 502rpx;
|
|||
|
|
height: 80rpx;
|
|||
|
|
background: #4C97E7;
|
|||
|
|
border-radius: 40rpx;
|
|||
|
|
font-weight: 500;
|
|||
|
|
font-size: 30rpx;
|
|||
|
|
color: #FFFFFF;
|
|||
|
|
}
|
|||
|
|
</style>
|
|||
|
|
|