Files
yshop-pro-uniapp/components/Poster/InviteFriends.vue

194 lines
4.3 KiB
Vue
Raw Normal View History

<!--
@name: DistributionPoster
@author: kahu4
@date: 2024-01-17 17:38
@description分销海报
@update: 2024-01-17 17:38
-->
<script setup>
import { ref } from "vue";
import { useMainStore } from "@/store/store";
import { distributionShareBg } from '@/utils/images'
import { useImage } from "@/hooks/useImage";
import { generateMiniProgramQrCode } from "@/api/global";
import { useInterface } from "@/hooks/useInterface";
// =================================== hooks ============================================
const mainStore = useMainStore();
const {toast, loading, hideLoading} = useInterface()
const {getImageInfo, saveImageToPhotosAlbum, base64ToUrl} = useImage()
const show = ref(false)
const qrCodeValue = ref('')
/**
* 打开弹窗
* @param shareInfo 通过useShare生成的shareInfo
* @param distributorInformation 分销商详情
* @return {Promise<void>}
*/
async function open(shareInfo, distributorInformation) {
try {
loading({title: '生成中...'})
qrCodeValue.value = await generateMiniProgramQrCode({path: `pages/share/index`, name: shareInfo.query})
show.value = true
} finally {
hideLoading()
}
}
/**
* 关闭分享弹窗
*/
function close() {
show.value = false
}
defineExpose({open, close})
/**
* 保存到相册
* @returns {Promise<void>}
*/
async function save() {
uni.showLoading({title: '保存中'})
try {
const path = await base64ToUrl(qrCodeValue.value);
await saveImageToPhotosAlbum(path)
toast({title: '保存成功', type: 'success'})
close()
} finally {
uni.hideLoading()
}
}
</script>
<template>
<u-overlay
:show="show"
@click="close">
<view
class="poster">
<!-- 海报 -->
<view
class="poster__inner"
:style="{backgroundImage:`url(${distributionShareBg})`}"
@click.stop>
<view class="user-inner">
<image
class="header"
:src="mainStore.user.avatar" />
<view class="username">{{ mainStore.user.nickname }}</view>
<view class="subtitle">时不待我快来加入吧!</view>
</view>
<view class="qr-inner">
<image
class="qr-code"
:src="qrCodeValue" />
<view class="subtitle">长按识别图中二维码</view>
</view>
</view>
<!-- 按钮组合 -->
<view class="button-group">
<view
class="button line-button"
@click.stop="close">
取消
</view>
<view
class="button animation-button"
@click.stop="save">
保存
</view>
</view>
</view>
</u-overlay>
</template>
<style
scoped
lang="scss">
.poster {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.poster__inner {
width: 90%;
aspect-ratio: 654 / 872;
border-radius: 20rpx;
background-size: 100% 100%;
background-repeat: no-repeat;
position: relative;
.user-inner {
width: 80%;
margin: 60rpx auto 0 auto;
@include useFlex(center, center, column);
font-size: 24rpx;
.header {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
border: 2rpx solid #fff;
background: #fff;
box-shadow: 0 0 5rpx rgba(202, 202, 202, 0.6);
}
.username {
font-size: 36rpx;
padding-bottom: 5rpx;
padding-top: 25rpx;
}
}
.qr-inner {
width: 80%;
margin: 0 auto;
@include useFlex(center, center, column);
font-size: 24rpx;
color: $tips-color;
padding-top: 80rpx;
.qr-code {
width: 342rpx;
height: 342rpx;
box-sizing: border-box;
border-radius: 10rpx;
border: 2rpx solid #F8F8FA;
margin-bottom: 24rpx;
background: #fbfbfb;
}
}
}
.button-group {
width: 90%;
margin-top: 40rpx;
@include useFlex(center, center, row, nowrap, 20rpx);
.button {
flex-grow: 1;
@include useFlex(center, center);
height: 80rpx;
background: $primary-color;
color: $white-color;
border-radius: 10rpx;
box-sizing: border-box;
}
.line-button {
border: 4rpx solid $white-color;
background: transparent;
}
}
}
</style>