This commit is contained in:
yixu
2025-09-14 18:29:52 +08:00
parent 5bcd9057fd
commit e26aae5805
8 changed files with 163 additions and 48 deletions

View File

@@ -141,7 +141,6 @@ globalToastEvent.on(ToastType.SHOW_ADDRESS, (id) => {
@address-close="addressShow = false"></Address> @address-close="addressShow = false"></Address>
<Ad :show="adShow" @close="adShow = false"></Ad> <Ad :show="adShow" @close="adShow = false"></Ad>
<Lottery :show="lotteryShow" @close="lotteryShow = false"></Lottery> <Lottery :show="lotteryShow" @close="lotteryShow = false"></Lottery>
<Login :show="loginShow" @login-success="handleLoginSuccess" />
</template> </template>
<style scoped> <style scoped>

View File

@@ -19,7 +19,7 @@ onMounted(() => {
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { Plus } from '@element-plus/icons-vue'; import { Plus } from '@element-plus/icons-vue';
import { tr } from "element-plus/es/locales.mjs" import { tr } from "element-plus/es/locales.mjs"
const router = useRouter();
// 上传前的校验 // 上传前的校验
const beforeUpload = (file) => { const beforeUpload = (file) => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
@@ -83,7 +83,12 @@ const handleError = (error) => {
const uploadItems = ref([]) const uploadItems = ref([])
const initializeUploadItems = () => { const initializeUploadItems = (item) => {
if (!item) {
router.push({
name: 'home'
});
}
const count = globalStore.people_count; const count = globalStore.people_count;
const items = Array(count).fill(null).map(() => ({ const items = Array(count).fill(null).map(() => ({
@@ -97,8 +102,8 @@ const initializeUploadItems = () => {
const route = useRoute() const route = useRoute()
const imageUrl = ref(globalStore.select_template); const imageUrl = ref(globalStore.select_template);
watch(imageUrl, () => { watch(imageUrl, (item) => {
initializeUploadItems() initializeUploadItems(item)
}, { immediate: true }) }, { immediate: true })
const uploadRefs = ref([]); const uploadRefs = ref([]);
@@ -210,7 +215,6 @@ const generateImage = async (options) => {
} }
} }
const router = useRouter();
const goBack = () => { const goBack = () => {
router.back(); router.back();
}; };
@@ -370,7 +374,6 @@ const showPhotoSquare = () => {
isPhotoSquareVisible.value = true; isPhotoSquareVisible.value = true;
}; };
</script> </script>
<template> <template>
@@ -421,7 +424,7 @@ const showPhotoSquare = () => {
> >
<el-button class="upload-img-wrapper upload-btn" :style="buttonPosition(index + 1)"> <el-button class="upload-img-wrapper upload-btn" :style="buttonPosition(index + 1)">
<div class="scene-item item scene-item-img" :class="{ uploaded: item.imageUrl, 'no-pointer-events': disableClick }" <div class="scene-item item scene-item-img" :class="{ uploaded: item.imageUrl, 'no-pointer-events': disableClick }"
:style="{ width: buttonPosition(index + 1)['--item-width'] }"> :style="{ width: buttonPosition(index + 1)['--item-width'], 'z-index': 11 }">
<img <img
v-if="!item.imageUrl" v-if="!item.imageUrl"
src="../assets/images/upload-img.png" src="../assets/images/upload-img.png"
@@ -454,12 +457,10 @@ const showPhotoSquare = () => {
</div> </div>
</div> </div>
<MyPhoto <MyPhoto
v-if="isMyPhotoVisible"
@go-photo-square="showPhotoSquare" @go-photo-square="showPhotoSquare"
v-model:show="isMyPhotoVisible" v-model:show="isMyPhotoVisible"
/> />
<PhotoSquare <PhotoSquare
v-else
@go-my-photo="showMyPhoto" @go-my-photo="showMyPhoto"
v-model:show="isPhotoSquareVisible" v-model:show="isPhotoSquareVisible"
/> />

View File

@@ -1,12 +1,13 @@
<script setup> <script setup>
import { ref, computed, watch, onMounted } from "vue" import { ref, computed, watch, onMounted } from "vue"
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { Request, Storage } from "../libs/utils"
import faceFamily from "../assets/audio/faceFamily.mp3" import faceFamily from "../assets/audio/faceFamily.mp3"
import MyPhoto from './MyPhoto.vue' import MyPhoto from './MyPhoto.vue'
import PhotoSquare from './PhotoSquare.vue' import PhotoSquare from './PhotoSquare.vue'
import globalToastEvent, { ToastType } from '../globalToastEvent'; import globalToastEvent, { ToastType } from '../globalToastEvent';
import { globalStore } from "../globalstore.js"; import { globalStore } from "../globalstore.js";
import Login from '../components/Login.vue'
import { isWeixin, isLogin, getParam, Storage, Request } from "../libs/utils"
defineProps({ defineProps({
show: true show: true
@@ -86,6 +87,66 @@ const showPhotoSquare=()=>{
isMyPhotoVisible.value = false; isMyPhotoVisible.value = false;
isPhotoSquareVisible.value = true; isPhotoSquareVisible.value = true;
} }
const loginShow = ref(false)
// 登录状态
const userStatus = async (callback) => {
const pageCode = getParam("code")
const userinfos = Storage.get("userinfos")
if (isWeixin()) {
if (!pageCode) {
weui.alert("未获取到code")
return
}
const weixinResult = await Request("wechat/login", {
code: pageCode
})
Storage.set("userinfos", weixinResult.json)
if (weixinResult.json && weixinResult.json.phone) {
loginShow.value = false
callback && callback()
} else {
loginShow.value = true
}
} else {
loginShow.value = true
}
}
//初始化持久数据
const initUserGameInfos = async (refresh_official, refresh_cap_scan) => {
const result = await Request('game/info', { refresh_official: refresh_official, refresh_cap_scan: refresh_cap_scan }, "GET")
if (result.res.status === 200) {
globalStore.draw_chances = result.json.draw_chances
globalStore.game_chances = result.json.game_chances
globalStore.invitees = result.json.invitees
globalStore.followed_official = result.json.followed_official
globalStore.cap_scan = result.json.cap_scan
globalStore.game_chances_view_recipes = result.json.game_chances_view_recipes
globalStore.MAX_VIEW_RECIPES_DAILY = result.json.constants.MAX_VIEW_RECIPES_DAILY
globalStore.CONSUME_POINT_1_PER_DRAW = result.json.constants.CONSUME_POINT_1_PER_DRAW
globalStore.MAX_CAP_SCAN = result.json.constants.MAX_CAP_SCAN
globalStore.MAX_INVITE_DAILY = result.json.constants.MAX_INVITE_DAILY
globalToastEvent.emit(ToastType.MOUNTED)
}
}
const handleLoginSuccess = async () => {
console.log("已登录")
loginShow.value = false
await initUserGameInfos(true, true)
}
if (isLogin()) {
handleLoginSuccess()
} else {
userStatus(handleLoginSuccess)
}
</script> </script>
<template> <template>
@@ -132,6 +193,7 @@ const showPhotoSquare=()=>{
<MyPhoto @go-photo-square="showPhotoSquare" v-model:show="isMyPhotoVisible" /> <MyPhoto @go-photo-square="showPhotoSquare" v-model:show="isMyPhotoVisible" />
<PhotoSquare @go-my-photo="showMyPhoto" v-model:show="isPhotoSquareVisible" /> <PhotoSquare @go-my-photo="showMyPhoto" v-model:show="isPhotoSquareVisible" />
<Login :show="loginShow" @login-success="handleLoginSuccess" />
</template> </template>
<style scoped> <style scoped>

View File

@@ -16,9 +16,7 @@ watch(() => props.show, async (newVal) => {
if (!newVal) { if (!newVal) {
return return
} }
if (newVal) { fetchImages();
fetchImages();
}
}) })
const emit = defineEmits(['go-photo-square', 'update:show']); const emit = defineEmits(['go-photo-square', 'update:show']);
@@ -47,6 +45,7 @@ const fetchImages = async () => {
images.value = data.data; images.value = data.data;
const foundItem = data.data.find(item => item.is_public === true); const foundItem = data.data.find(item => item.is_public === true);
if (foundItem) { if (foundItem) {
globalStore.result_url = foundItem.result_url;
displayZhuli.value = true; displayZhuli.value = true;
} else { } else {
displayZhuli.value = false; displayZhuli.value = false;
@@ -148,7 +147,15 @@ import Haibao from "@/libs/haibao";
import mask from "../assets/images/haibao-mask.png"; import mask from "../assets/images/haibao-mask.png";
import haibaoCoverBorder from "../assets/images/haibao-cover.png"; import haibaoCoverBorder from "../assets/images/haibao-cover.png";
import bg from "../assets/images/haibao-bg.png" import bg from "../assets/images/haibao-bg.png"
// import userPicture from "../assets/images/home-bg.png"; //TODO: globalStore.result_url 这里得图片后面要换成用户参榜的图片 const loadImage = (src)=> {
return new Promise((resolve, reject) => {
const img = new Image();
img.crossOrigin = "Anonymous";
img.onload = () => resolve(img);
img.onerror = () => reject(new Error(`无法加载图片: ${src}`));
img.src = src;
});
}
const haibaoShow = ref(false); const haibaoShow = ref(false);
const haibaoUrl = ref(''); const haibaoUrl = ref('');
@@ -170,6 +177,7 @@ const handleHaibao = async () => {
const loading = weui.loading() const loading = weui.loading()
const infos = Storage.get("userinfos") const infos = Storage.get("userinfos")
const haibaoCover = new Haibao(951, 1607) const haibaoCover = new Haibao(951, 1607)
const userPicture = await loadImage(globalStore.result_url)
haibaoCover.add(userPicture, 0, 0) haibaoCover.add(userPicture, 0, 0)
haibaoCover.add(mask, 10, 100) haibaoCover.add(mask, 10, 100)
haibaoCover.add(haibaoCoverBorder, 0, 0) haibaoCover.add(haibaoCoverBorder, 0, 0)
@@ -204,7 +212,7 @@ const handleHaibao = async () => {
const markers = ref([]); const markers = ref([]);
markers.value = [ markers.value = [
{ x: 50, y: 50, width: 100, height: 80 } { x: 0, y: 32, width: 50, height: 14 }
]; ];
</script> </script>
@@ -220,10 +228,10 @@ markers.value = [
:key="index" :key="index"
class="marker" class="marker"
:style="{ :style="{
left: marker.x + 'px', left: marker.x + 'vw',
top: marker.y + 'px', top: marker.y + 'vw',
width: marker.width + 'px', width: marker.width + 'vw',
height: marker.height + 'px' height: marker.height + 'vw'
}" }"
@click.stop="$emit('go-photo-square')"> @click.stop="$emit('go-photo-square')">
</div> </div>
@@ -298,10 +306,6 @@ markers.value = [
line-height: 50px; line-height: 50px;
} }
.marker { .marker {
left: 0 !important;
top: 32vw !important;
width: 50vw !important;
height: 14vw !important;
position: absolute; position: absolute;
} }
.fullsection { .fullsection {

View File

@@ -15,9 +15,7 @@ watch(() => props.show, async (newVal) => {
if (!newVal) { if (!newVal) {
return return
} }
if (newVal) { fetchImages();
fetchImages();
}
}) })
const emit = defineEmits(['go-my-photo', 'update:show']); const emit = defineEmits(['go-my-photo', 'update:show']);
@@ -73,7 +71,7 @@ watch(() => mergeId, async (newVal) => {
return return
} }
if (newVal.value) { if (newVal.value) {
fetchImages(); getInviteInfo();
} }
}) })
@@ -127,7 +125,7 @@ const inviteHelp = ()=> {
// }) // })
const markers = ref([]); const markers = ref([]);
markers.value = [ markers.value = [
{ x: 50, y: 50, width: 100, height: 80 } { x: 50, y: 32, width: 50, height: 14 }
]; ];
</script> </script>
@@ -143,10 +141,10 @@ markers.value = [
:key="index" :key="index"
class="marker" class="marker"
:style="{ :style="{
left: marker.x + 'px', left: marker.x + 'vw',
top: marker.y + 'px', top: marker.y + 'vw',
width: marker.width + 'px', width: marker.width + 'vw',
height: marker.height + 'px' height: marker.height + 'vw'
}" }"
@click.stop="$emit('go-my-photo')"> @click.stop="$emit('go-my-photo')">
</div> </div>
@@ -244,10 +242,6 @@ markers.value = [
line-height: 50px; line-height: 50px;
} }
.marker { .marker {
left: 50vw !important;
top: 32vw !important;
width: 50vw !important;
height: 14vw !important;
position: absolute; position: absolute;
} }
.flex-container-detail-invite { .flex-container-detail-invite {

View File

@@ -27,8 +27,7 @@ const goToGenerateImgPage = (item) => {
if (!hasVisitedBefore) { if (!hasVisitedBefore) {
localStorage.setItem('hasVisitedGenerateImg', 'true'); localStorage.setItem('hasVisitedGenerateImg', 'true');
router.push({ router.push({
name: 'generateImgConfirm', name: 'generateImgConfirm'
query: { imageUrl: item.imageUrl }
}); });
} else { } else {
router.push({ router.push({

View File

@@ -47,6 +47,16 @@ const openHaibao = (e) => {
handleHaibao() handleHaibao()
} }
onMounted(openHaibao) onMounted(openHaibao)
const loadImage = (src)=> {
return new Promise((resolve, reject) => {
const img = new Image();
img.crossOrigin = "Anonymous";
img.onload = () => resolve(img);
img.onerror = () => reject(new Error(`无法加载图片: ${src}`));
img.src = src;
});
}
const handleHaibao = async () => { const handleHaibao = async () => {
if (haibaoUrl.value) { if (haibaoUrl.value) {
return return
@@ -55,6 +65,12 @@ const handleHaibao = async () => {
const loading = weui.loading() const loading = weui.loading()
const infos = Storage.get("userinfos") const infos = Storage.get("userinfos")
const haibaoCover = new Haibao(951, 1607) const haibaoCover = new Haibao(951, 1607)
if (!globalStore.result_url) {
router.push({
name: 'home'
});
}
const userPicture = await loadImage(globalStore.result_url)
haibaoCover.add(userPicture, 0, 0) haibaoCover.add(userPicture, 0, 0)
haibaoCover.add(mask, 10, 100) haibaoCover.add(mask, 10, 100)
haibaoCover.add(haibaoCoverBorder, 0, 0) haibaoCover.add(haibaoCoverBorder, 0, 0)
@@ -84,8 +100,15 @@ const handleHaibao = async () => {
}) })
}) })
}) })
} }
let userPictureVal = userPicture;
const getBackgroundImage = () => {
if (globalStore.result_url) {
return userPictureVal = globalStore.result_url;
} else {
return userPictureVal;
}
};
</script> </script>
<template> <template>
@@ -95,13 +118,13 @@ const handleHaibao = async () => {
<img src="../assets/images/go-home-btn.png" @click="navigateToHome" alt="回到首页"> <img src="../assets/images/go-home-btn.png" @click="navigateToHome" alt="回到首页">
</div> </div>
<!-- <div class="mask-background mask-image" :style="{ backgroundImage: `url(${globalStore.result_url})` }"> <!-- <div class="mask-background image-container" :style="{ backgroundImage: `url(${getBackgroundImage()})` }">
</div> </div>
<img src="../assets/images/mengban-border.png" class="mengban-border" alt="蒙版"> --> <img src="../assets/images/mengban-border.png" class="mengban-border" alt="蒙版"> -->
<div class="fullsection" v-show="haibaoShow"> <div class="fullsection" v-show="haibaoShow">
<div class="haibao" :style="userhaibaoCover"> <div class="haibao" :style="userhaibaoCover">
<img :src="haibaoUrl" alt=""> <img :src="haibaoUrl" alt="">
<div class="close" @click="haibaoShow = false"></div> <!-- <div class="close" @click="haibaoShow = false"></div> -->
</div> </div>
</div> </div>
@@ -119,6 +142,35 @@ const handleHaibao = async () => {
</template> </template>
<style scoped> <style scoped>
.mask-background {
-webkit-mask-image: url("../assets/images/my-photo-mengban.png");
mask-image: url("../assets/images/my-photo-mengban.png");
-webkit-mask-size: contain;
mask-size: contain;
-webkit-mask-position: center;
mask-position: center;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
}
.mengban-border {
width: 81vw;
position: absolute;
top: 28vw;
}
.image-container {
width: 80vw;
top: 5.2vw;
margin-bottom: 3vw;
background-image: url('../assets/images/home-bg.png');
background-size: cover;
background-repeat: no-repeat;
min-height: -webkit-fill-available;
position: absolute;
cursor: pointer;
}
.fullsection { .fullsection {
position: fixed; position: fixed;
top: 0; top: 0;
@@ -128,12 +180,12 @@ const handleHaibao = async () => {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
background-color: rgba(0, 0, 0, .7); /* background-color: rgba(0, 0, 0, .7); */
} }
.haibao { .haibao {
position: relative; position: relative;
width: 65.37037vw; width: 70vw;
height: 119.444444vw; height: 119.444444vw;
background-image: url("../assets/images/haibao-cover.webp"); background-image: url("../assets/images/haibao-cover.webp");
background-repeat: no-repeat; background-repeat: no-repeat;

View File

@@ -53,13 +53,17 @@ const handleHaibao = async () => {
if (haibaoUrl.value) { if (haibaoUrl.value) {
return return
} }
// let userPicture = 'https://lzlj123.oss-cn-shanghai.aliyuncs.com/face-merged/20250914/face-merge-5c90bb95-d1d2-479a-a13b-ada7ba8e7152.jpg'
const loading = weui.loading() let userPicture = '';
const userPicture = await loadImage('https://lzlj123.oss-cn-shanghai.aliyuncs.com/face-merged/20250910/face-merge-406c6990-249c-4248-b719-ecedf6e20848.jpg') if (!globalStore.result_url) {
weui.alert("请先参与活动合成图片并打榜!")
} else {
userPicture = await loadImage(globalStore.result_url)
}
const infos = Storage.get("userinfos") const infos = Storage.get("userinfos")
const haibaoCover = new Haibao(951, 1607) const haibaoCover = new Haibao(951, 1607)
haibaoCover.add(userPicture, 0, 0) haibaoCover.add(userPicture, 50, 50)
haibaoCover.add(mask, 10, 100) haibaoCover.add(mask, 10, 100)
haibaoCover.add(haibaoCoverBorder, 0, 0) haibaoCover.add(haibaoCoverBorder, 0, 0)
haibaoCover.draw('destination-in').then(() => { haibaoCover.draw('destination-in').then(() => {