staff/pagesA/invite/components/SharePopup.vue

174 lines
4.4 KiB
Vue

<template>
<wd-popup v-model="innerVisible" position="bottom" :safe-area-inset-bottom="true" @close="handleClose">
<view class="share-popup">
<view class="share-header li-flex li-justify-between li-items-center li-px-30 li-py-20">
<text class="li-text-32">分享</text>
<text class="ri-close-line li-text-48 li-text-#999" @click="handleClose"></text>
</view>
<view class="share-content li-p-30">
<view class="share-methods li-flex li-justify-around">
<view class="share-item li-flex li-flex-col li-items-center" @click="handleShare('wechat')">
<view class="icon-wrapper li-bg-#07c160 li-mb-15">
<text class="ri-wechat-line li-text-white li-text-48"></text>
</view>
<text class="li-text-26">微信好友</text>
</view>
<view class="share-item li-flex li-flex-col li-items-center" @click="handleGenerate">
<view class="icon-wrapper li-bg-#0070F0 li-mb-15">
<text class="ri-image-line li-text-white li-text-48"></text>
</view>
<text class="li-text-26">生成海报</text>
</view>
</view>
</view>
</view>
<!-- 海报预览弹窗 -->
<wd-popup v-model="showPoster" position="center" :safe-area-inset-bottom="true">
<view class="poster-preview">
<canvas canvas-id="posterCanvas" class="poster-canvas"></canvas>
<view class="poster-actions li-flex li-justify-around li-mt-30">
<wd-button size="small" @click="showPoster = false">取消</wd-button>
<wd-button size="small" type="primary" @click="savePoster">保存图片</wd-button>
</view>
</view>
</wd-popup>
</wd-popup>
</template>
<script setup>
import { ref, defineProps, defineEmits, watch } from 'vue'
import { useToast } from '@/uni_modules/wot-design-uni'
const Toast = useToast()
const props = defineProps({
visible: {
type: Boolean,
default: false
}
})
const innerVisible = ref(false)
// 监听props的变化
watch(() => props.visible, (val) => {
innerVisible.value = val
})
const emit = defineEmits(['update:visible', 'close', 'generate', 'share'])
const showPoster = ref(false)
// 关闭弹窗
const handleClose = () => {
emit('update:visible', false)
emit('close')
}
// 处理分享
const handleShare = (type) => {
emit('share', type)
handleClose()
}
// 处理生成海报
const handleGenerate = async () => {
showPoster.value = true
await generatePoster()
}
// 生成海报
const generatePoster = async () => {
try {
const ctx = uni.createCanvasContext('posterCanvas')
// 设置画布大小
const canvasWidth = 300
const canvasHeight = 450
// 绘制背景
ctx.setFillStyle('#ffffff')
ctx.fillRect(0, 0, canvasWidth, canvasHeight)
// 绘制标题
ctx.setFillStyle('#333333')
ctx.setFontSize(16)
ctx.setTextAlign('center')
ctx.fillText('邀请您加入我们的物业管理平台', canvasWidth / 2, 40)
// 绘制二维码(示例)
ctx.setFillStyle('#000000')
ctx.fillRect(100, 200, 100, 100)
// 绘制底部文字
ctx.setFillStyle('#666666')
ctx.setFontSize(14)
ctx.fillText('扫码加入', canvasWidth / 2, 350)
// 执行绘制
ctx.draw()
} catch (error) {
Toast.error('生成海报失败')
}
}
// 保存海报
const savePoster = () => {
uni.canvasToTempFilePath({
canvasId: 'posterCanvas',
success: (res) => {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: () => {
Toast.success('保存成功')
showPoster.value = false
handleClose()
},
fail: () => {
Toast.error('保存失败')
}
})
},
fail: () => {
Toast.error('生成图片失败')
}
})
}
</script>
<style lang="scss">
.share-popup {
.share-header {
border-bottom: 2rpx solid rgba(0, 0, 0, 0.05);
}
.share-methods {
.share-item {
.icon-wrapper {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
}
}
}
.poster-preview {
background: #fff;
padding: 30rpx;
border-radius: 20rpx;
.poster-canvas {
width: 600rpx;
height: 900rpx;
background: #fff;
}
.poster-actions {
padding: 0 40rpx;
}
}
</style>