palc-newyear2024/src/components/Result.vue
2024-07-18 18:31:47 +08:00

303 lines
7.0 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.

<script setup>
import { gsap } from "gsap";
import { debounceTap } from "@/plugins";
import { useMainStore } from "@/store";
import { posterCreate } from "@/plugins";
import { Toast } from "vant";
import QRCode from "qrcode";
import { reactive } from "vue";
// 页面配置初始化
const emit = defineEmits(["ResultPage"]);
const userStore = useMainStore();
const posterId = ref(Math.floor(Math.random() * 3) + 1); //海报背景id13
const posterTextSrc = new URL(`../assets/images/result/poster-text.png`, import.meta.url).href
const posterImgList = reactive([
new URL(`../assets/images/result/poster-1.jpg`, import.meta.url).href,
new URL(`../assets/images/result/poster-2.jpg`, import.meta.url).href,
new URL(`../assets/images/result/poster-3.jpg`, import.meta.url).href,
]);
// 生成二维码逻辑
const eqcodePic = ref();
onMounted(() => {
console.log("posterId:", posterId.value);
let eqCodeUrl = import.meta.env.VITE_URL;
QRCode.toDataURL(eqCodeUrl)
.then((url) => {
eqcodePic.value = url;
// console.log("eq", eqcodePic.value);
})
.catch((err) => {
console.error(err);
});
gsap.from(".result-bg", {
duration: 0.7,
scale: 1.2,
autoAlpha: 0,
});
});
// 生成海报逻辑
const createPoster = (event) => {
let e = event.target.parentElement;
debounceTap(e, () => {
// 海报生成
posterCreate(
{ width: 750, height: 1334 }, //海报尺寸
// 海报素材,按顺序依次渲染
[
// 背景
{
name: "bg",
src: posterImgList[posterId.value - 1],
pos: { w: 750, h: 1334, x: 0, y: 0 },
},
// 二维码
{
name: "eqcode",
src: eqcodePic.value,
pos: { w: 194, h: 195, x: 502, y: 1090 },
},
// 文案
{
name: "text",
src: posterTextSrc,
pos: { w: 337, h: 117, x: 81, y: 1133 },
},
]
);
// gsap.to('.posterPop',{duration:0.5,autoAlpha:1})
});
};
// 去抽奖
const goDraw = (event) => {
let e = event.target.parentElement;
console.log('e',e);
debounceTap(e, () => {
if (userStore.hasDraw) {
emit("ResultPage", { action: "showDraw" });
} else {
Toast("今日暂无抽奖机会");
}
});
};
// 隐藏海报弹窗
const hidePop = (event) => {
let e = event.target;
debounceTap(e, () => {
gsap.to(".posterPop", { duration: 0.5, autoAlpha: 0 });
});
};
// 展示分享
const goShare = (event) => {
let e = event.target;
debounceTap(e, () => {
gsap.to(".sharePop", { duration: 0.5, autoAlpha: 1 });
});
};
// 隐藏分享提示
const hideShare = () => {
gsap.to(".sharePop", { duration: 0.5, autoAlpha: 0 });
};
</script>
<template>
<div class="ResultPage" @touchmove.prevent>
<div :class="'result-bg-' + posterId"></div>
<div class="result-container">
<!-- 标题 -->
<div class="result-title"></div>
<!-- 文案 -->
<div :class="'r-text-' + posterId" class="r-text"></div>
<!-- 生成海报按钮 -->
<div class="create-poster" >
<div class="r-click-area" @click="createPoster($event)"></div>
</div>
</div>
</div>
<!-- 海报弹窗 -->
<div class="posterPop" @touchmove.prevent>
<div class="cls-btn-box">
<div class="cls-btn" @click="hidePop($event)"></div>
</div>
<div class="poster-box">
<div class="poster" :class="'poster-' + posterId">
<img id="posterSrc" src="" alt="" srcset="" />
</div>
</div>
<div class="save-tips">*长按保存海报</div>
<div class="btn-box">
<div class="go-draw" >
<div class="r-click-area" @click="goDraw($event)"></div>
</div>
<div class="go-share" >
<div class="r-click-area" @click="goShare($event)"></div>
</div>
</div>
</div>
<!-- 分享提示 -->
<div class="sharePop" @click="hideShare">
<div class="tips-pic"></div>
<div class="tips-text">点击右上角分享给你的好友</div>
</div>
</template>
<style lang="scss" scoped>
.ResultPage {
@include fixed();
background-color: azure;
.result-bg-1 {
@include pos(750px, 1624px, 0px, 50%);
@include bg_pos("result/r-bg-1.jpg");
transform: translateY(-50%);
pointer-events: none;
}
.result-bg-2 {
@include pos(750px, 1624px, 0px, 50%);
@include bg_pos("result/r-bg-2.jpg");
transform: translateY(-50%);
pointer-events: none;
}
.result-bg-3 {
@include pos(750px, 1624px, 0px, 50%);
@include bg_pos("result/r-bg-3.jpg");
transform: translateY(-50%);
pointer-events: none;
}
.result-container {
@include pos(750px, 1624px, 0px, 50%);
transform: translateY(-50%);
.result-title {
@include pos(537px, 116px, 118px, 258px);
@include bg_pos("result/title.png");
pointer-events: none;
}
.r-text {
pointer-events: none;
}
.r-text-1 {
@include pos(638px, 814px, 67px, 396px);
@include bg_pos("result/text-1.png");
}
.r-text-2 {
@include pos(643px, 814px, 67px, 396px);
@include bg_pos("result/text-2.png");
}
.r-text-3 {
@include pos(643px, 844px, 63px, 392px);
@include bg_pos("result/text-3.png");
}
.create-poster {
@include pos(337px, 151px, 206px, 1253px);
@include bg_pos("result/create-btn.png");
.r-click-area {
@include pos(256px, 69px, 35px, 14px);
}
}
}
}
.posterPop {
@include fixed();
@include flexCen();
background-color: rgba($color: #000000, $alpha: 0.6);
visibility: hidden;
.cls-btn-box {
width: 617px;
display: flex;
justify-content: flex-end;
.cls-btn {
@include box(43px, 43px);
@include bg_pos("result/cls-btn.png");
margin-right: -20px;
}
}
.save-tips {
font-size: 20px;
line-height: 20px;
margin-top: 20px;
color: #fff;
letter-spacing: 2px;
}
.poster-box {
@include box(617px, 881px);
margin-top: 20px;
overflow: hidden;
.poster {
@include box(100%, 100%);
overflow: hidden;
display: flex;
justify-content: center;
#posterSrc {
// @include box(100%, 100%);
width: 80%;
border: 1px solid #fff;
border-radius: 20px;
// opacity: 0;
}
}
}
.btn-box {
@include box(650px, 76px);
display: flex;
justify-content: space-around;
margin-top: 20px;
.r-click-area {
@include pos(256px, 69px, 35px, 14px);
}
.go-draw {
@include box(337px, 151px);
@include bg_pos("result/go-draw-btn.png");
position: relative;
}
.go-share {
@include box(337px, 151px);
@include bg_pos("result/go-share-btn.png");
position: relative;
}
}
}
.sharePop {
@include fixed();
background-color: rgba($color: #000000, $alpha: 0.54);
visibility: hidden;
.tips-pic {
@include pos(100px, 100px, 600px, 100px);
@include bg_pos("result/share-tips.svg");
stroke: #ffffff;
}
.tips-text {
font-size: 25px;
@include pos(750px, 100px, 0px, 220px);
color: #ffffff;
text-align: right;
}
}
</style>