aslan-h5/src/views/Reward/RechargeReward.vue

208 lines
5.6 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.

<template>
<div>
<!-- Rewards0.png 使用相对定位容器 -->
<div style="position: relative">
<img :src="images.Rewards0" alt="" style="width: 100%; display: block" />
<!-- 绝对定位的覆盖层 Rewards0.png 同级 -->
<div
style="
position: absolute;
inset: 35% 22%;
height: 18%;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
"
>
<div style="display: grid; grid-template-columns: 4fr 6fr">
<div style="width: 100%; aspect-ratio: 1/1; position: relative">
<img
:src="images.frame"
alt=""
style="width: 100%; display: block; aspect-ratio: 1/1; position: relative; z-index: 1"
/>
<div
style="
position: absolute;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
z-index: 0;
"
>
<img
:src="userInfo.userAvatar || ''"
alt=""
style="
display: block;
width: 60%;
border-radius: 50%;
aspect-ratio: 1/1;
object-fit: cover;
"
@error="defaultAvatarUrl"
/>
</div>
</div>
<div
style="
width: 100%;
min-width: 0; /* 关键:允许在 flex 容器中正确截断 */
display: flex;
flex-direction: column;
justify-content: space-around;
"
>
<div
style="
font-weight: 700;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
"
>
{{ userInfo.userNickname }}
</div>
<div
style="
font-weight: 700;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
"
>
ID:{{ userInfo.account }}
</div>
</div>
</div>
<div class="textGold" style="font-size: 0.8em; font-weight: 700">
Accumulated recharge:${{ userInfo.recharge }}
</div>
<div class="textGold" style="font-size: 0.7em; font-weight: 700">
*Each user can only claim the reward for this event once.
</div>
<div class="textGold" style="font-size: 0.7em; font-weight: 900">
*يمكن لكل مستخدم المطالبة بالمكافأة لهذا الحدث مرة واحدة فقط.
</div>
</div>
</div>
<!-- 其他图片直接引入 -->
<img :src="images.Rewards1" alt="" style="width: 100%; display: block" />
<img :src="images.Rewards2" alt="" style="width: 100%; display: block" />
<img :src="images.Rewards3" alt="" style="width: 100%; display: block" />
<img :src="images.Rewards4" alt="" style="width: 100%; display: block" />
<img :src="images.Rewards5" alt="" style="width: 100%; display: block" />
</div>
</template>
<script setup>
import { ref, watch, onMounted } from 'vue'
import { connectToApp } from '@/utils/appConnector.js'
import { getMemberProfile, getTotalRecharge } from '@/api/wallet'
const userInfo = ref({
account: '',
userNickname: '',
userAvatar: '',
recharge: '',
}) //个人信息
// 使用与Lottery.vue相同的方式导入图片
const imageModules = import.meta.glob('@/assets/images/RechargeReward/*.{jpg,png,svg}', {
eager: true,
})
// 生成文件名映射对象(自动移除路径和扩展名)
const images = Object.fromEntries(
Object.entries(imageModules).map(([path, module]) => {
const fileName = path.split('/').pop().split('.')[0]
return [fileName, module.default]
})
)
//获取累积充值信息
const getTotalRechargeInfo = async () => {
// 连接成功回调
const resUserInfo = await getMemberProfile()
if (resUserInfo.status && resUserInfo.body) {
const res = await getTotalRecharge(resUserInfo.body.id)
if (res.status && res.body) {
console.log('resUserInfo:', resUserInfo.body)
userInfo.value = {
account: resUserInfo.body.account,
userNickname: resUserInfo.body.userNickname,
userAvatar: resUserInfo.body.userAvatar,
recharge: res.body,
}
}
}
}
// 出错头像
const defaultAvatarUrl = (e) => {
console.log('头像资源出错')
e.target.onerror = null //防止循环
e.target.src = new URL('/src/assets/images/WeeklyStar/defaultAvatar.png', import.meta.url).href
}
// 使用工具函数连接APP
const connectToAppHandler = async () => {
await connectToApp(() => {
getTotalRechargeInfo() //获取累积充值信息
})
}
onMounted(() => {
connectToAppHandler()
})
</script>
<style lang="scss" scoped>
* {
color: white;
font-family: 'SF Pro Text';
}
.textGold {
background: linear-gradient(
255deg,
#b77c44 28.08%,
#fee5bb 46.5%,
#bf854a 67.95%,
#fcdfb3 85.67%,
#c0864b 102.89%,
#fbe8d4 122.57%
);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
@media screen and (max-width: 360px) {
* {
font-size: 10px;
}
}
@media screen and (min-width: 360px) {
* {
font-size: 12px;
}
}
@media screen and (min-width: 768px) {
* {
font-size: 24px;
}
}
@media screen and (min-width: 1024px) {
* {
font-size: 32px;
}
}
</style>