Files
2024-02-22 18:37:23 +08:00

198 lines
4.4 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.

<!--
@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/modules/useMainStore";
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('')
const userInfo = ref(undefined)
/**
* 打开弹窗
* @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})
userInfo.value = distributorInformation
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>
<uv-overlay
:show="show"
@click="close">
<view
class="poster"
v-if="userInfo">
<!-- 海报 -->
<view
class="poster__inner"
:style="{backgroundImage:`url(${distributionShareBg})`}"
@click.stop>
<view class="user-inner">
<image
class="header"
:src="mainStore.user.avatar" />
<view class="username">{{ userInfo.realName }}</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>
</uv-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>