Files
cashier_wx/distribution/shop-detail/components/share-popup.vue
2026-01-22 14:50:28 +08:00

261 lines
6.1 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="">
<view class="w-qrcode">
<w-qrcode :options="codeOptions" :opacity="0" ref="wQrcode" @generate="(e) => qrcodeResult(e)"></w-qrcode>
</view>
<up-popup :show="show" bgColor="transparent" :safeAreaInsetBottom="false" :closeOnClickOverlay="true" @close="close" mode="center">
<view class="box">
<view class="info">
<view class="u-flex justify-center">
<up-avatar size="214rpx" :src="shopUserInfo.headImg"></up-avatar>
</view>
<view class="u-m-t-48 font-14 font-700 color-333 text-center line-height-54">
<view>{{ shopUserInfo.nickName }}</view>
<view>{{ desensitizePhone(shopUserInfo.phone) }}</view>
</view>
<view class="u-m-t-16 font-14 line-height-54 text-center">
<text class="color-666">邀请码</text>
<text class="u-m-l-16 u-m-r-16 color-333 font-16 font-700">{{ inviteCode }}</text>
<text class="" style="color: #fe6d11" @click="copyCode">复制</text>
</view>
<view class="u-flex justify-center" style="margin-top: 90rpx">
<!-- <w-qrcode
:options="codeOptions"
:opacity="1"
ref="wQrcode"
@generate="(e) => qrcodeResult(e)"
></w-qrcode> -->
<up-image width="322rpx" height="322rpx" :src="code"></up-image>
</view>
</view>
<view class="footer-wrap">
<view class="confirm line" @click="save">保存图片</view>
<ymf-share><view class="confirm">微信分享</view></ymf-share>
</view>
</view>
</up-popup>
</view>
</template>
<script setup>
import { shareMixin, handleMixinOnLoad, returnQuery } from '@/utils/share.js';
import ymfShare from '@/components/ymf-components/ymf-share.vue';
import wQrcode from '@/uni_modules/wmf-code/components/w-qrcode/w-qrcode.vue';
import { desensitizePhone } from '@/utils/util.js';
import { ref, onMounted, nextTick } from 'vue';
onMounted(async () => {
setTimeout(async () => {
await nextTick();
const query = await returnQuery();
codeOptions.value.code = `https://cashier.sxczgkj.com/invite?${removeQAndAfter(query)}`;
console.log('codeOptions.value', codeOptions.value);
}, 500);
});
/**
* 截取字符串,移除 &q 及后面的所有内容
* @param {string} str - 原始字符串
* @returns {string} 处理后的字符串
*/
function removeQAndAfter(str) {
// 检查是否为空字符串
if (!str || typeof str !== 'string') {
return str || '';
}
// 找到 &q 的起始位置
const qIndex = str.indexOf('&q');
// 如果找到 &q截取前面的部分否则返回原字符串
return qIndex !== -1 ? str.slice(0, qIndex) : str;
}
const props = defineProps({
inviteCode: {
type: String,
default: ''
},
shopUserInfo: {
type: Object,
default: () => {}
}
});
const codeOptions = ref({
padding: 10,
size: 200,
code: ''
});
function copyCode() {
uni.setClipboardData({
data: props.inviteCode,
success: function () {
console.log('success');
}
});
}
const code = ref('');
function qrcodeResult(e) {
console.log('qrcodeResult', e);
code.value = e.img.tempFilePath;
console.log('code', code.value);
}
const show = defineModel({
type: Boolean,
default: false
});
const emits = defineEmits(['cancel', 'confirm']);
function close() {
show.value = false;
emits('cancel');
}
function save() {
show.value = false;
// 保存图片到相册
uni.saveImageToPhotosAlbum({
filePath: code.value,
success: function () {
uni.showToast({
title: '保存成功',
icon: 'none'
});
},
fail: function (err) {
console.log('保存失败原因:', err);
// 判断是否为授权拒绝(微信小程序授权拒绝的特征)
if (err.errMsg.includes('auth deny') || err.errMsg.includes('authorize fail')) {
// 弹出提示引导用户去设置页开启授权
uni.showModal({
title: '授权提示',
content: '保存图片需要授权访问相册,请前往设置开启授权',
showCancel: true,
cancelText: '取消',
confirmText: '去设置',
success: function (res) {
if (res.confirm) {
// 跳转到微信小程序的授权设置页
uni.openSetting({
success: function (settingRes) {
// 检查用户是否开启了相册授权
if (settingRes.authSetting['scope.writePhotosAlbum']) {
uni.showToast({
title: '授权成功,可重新保存',
icon: 'none'
});
} else {
uni.showToast({
title: '未开启授权,保存失败',
icon: 'none'
});
}
},
fail: function () {
uni.showToast({
title: '打开设置失败',
icon: 'none'
});
}
});
}
}
});
} else {
// 非授权问题的保存失败(如文件路径错误、系统问题等)
uni.showToast({
title: '保存失败',
icon: 'none'
});
}
}
});
emits('confirm', code.value);
}
</script>
<style lang="scss" scoped>
:deep(.info .canvas) {
opacity: 1;
}
.border {
border: 2rpx solid #d9d9d9;
padding: 18rpx;
border-radius: 4rpx;
}
.box {
width: 638rpx;
background-color: #fff;
border-radius: 16rpx;
// overflow: hidden;
position: relative;
.title {
color: #000000;
font-size: 32rpx;
font-weight: 700;
}
.top {
border-bottom: 2rpx solid #ededed;
}
.info {
padding: 96rpx 40rpx 96rpx 40rpx;
font-size: 28rpx;
}
.small-title {
min-width: 84rpx;
text-align: right;
}
.footer-wrap {
width: 100%;
position: absolute;
left: 0;
bottom: -100upx;
display: flex;
gap: 28upx;
}
}
.cancel {
padding: 14rpx 76rpx;
border-radius: 36rpx;
border: 2rpx solid #e8ad7b;
color: #e8ad7b;
font-size: 32rpx;
font-weight: 400;
white-space: nowrap;
line-height: 48rpx;
}
.confirm {
$color: #e8ad7b;
flex: 1;
padding: 14rpx 76rpx;
border-radius: 16rpx;
background-color: $color;
border: 2rpx solid $color;
color: #fff;
font-size: 32rpx;
font-weight: 400;
white-space: nowrap;
display: flex;
justify-content: center;
align-items: center;
&.line {
background-color: #fff;
color: $color;
}
}
.line-height-54 {
line-height: 54rpx;
}
.w-qrcode {
position: fixed;
left: -9999px;
top: -9999px;
z-index: -1;
}
</style>