This commit is contained in:
huangjinming 2023-05-08 12:03:56 +08:00
parent 7c371c723d
commit bed35b701e
54 changed files with 100 additions and 349 deletions

BIN
dist.rar Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 561 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 832 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 801 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 858 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1005 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 857 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 840 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 408 KiB

After

Width:  |  Height:  |  Size: 804 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -3,7 +3,7 @@
wrapClassName="web" wrapClassName="web"
:visible="visible" :visible="visible"
:footer="null" :footer="null"
width="60%" width="1100px"
:closable="false" :closable="false"
:centered="true" :centered="true"
@cancel="onCancel" @cancel="onCancel"
@ -16,15 +16,17 @@
class="max-w-full h-auto hero-img" class="max-w-full h-auto hero-img"
/> />
</div> </div>
<div class="exclusive"> <div></div>
<div class="cancel pr-2 pt-2 flex justify-end" @click="onCancel"> <div class="cancel pr-2 pt-2 flex justify-end" @click="onCancel">
<img <img
src="../../assets/img/badge/close.png" src="../../assets/img/badge/close.png"
alt="/hero.png" alt="/hero.png"
class="max-w-full h-auto" class="max-w-full h-auto"
/> />
</div> </div>
<div v-if="visible" class="pt-10 w-[450px] text-gray-100 text-content"> <div class="exclusive">
<div v-if="visible" class="w-[28rem] text-gray-100 text-content">
This is an exclusive badge for CEBG Genesis NFT holders. It will This is an exclusive badge for CEBG Genesis NFT holders. It will
serve as an identity credential for Genesis NFT holders to serve as an identity credential for Genesis NFT holders to
participate in all future activities participate in all future activities
@ -51,11 +53,26 @@ const onCancel = () => {
<style lang="scss" scoped> <style lang="scss" scoped>
.modal-content { .modal-content {
height: 302px; display: flex;
// height: 302px;
justify-content: space-between;
position: relative; position: relative;
.cancel{
position: absolute;
right: 0;}
} }
.hero-img {
position: absolute;
left: 0;
bottom: 0;
cursor: pointer;
width: 35%;
height: auto;
opacity: 0;
animation: slideInFromLeft 0.5s forwards;
}
.hero-img { .hero-img {
position: absolute; position: absolute;
left: 0; left: 0;
@ -67,13 +84,14 @@ const onCancel = () => {
animation: slideInFromLeft 0.5s forwards; animation: slideInFromLeft 0.5s forwards;
} }
.exclusive { // .exclusive {
width: 621px; // width: 621px;
margin-left: 529px; // margin-left: 529px;
} // }
.text-content { .text-content {
opacity: 0; opacity: 0;
font-size: 18px;
animation: slideInFromRight 0.5s forwards; animation: slideInFromRight 0.5s forwards;
} }
@ -98,6 +116,32 @@ const onCancel = () => {
opacity: 1; opacity: 1;
} }
} }
//
// @media screen and (max-width: 1424px) {
// .exclusive {
// width: 100%;
// margin-left: 0;
// }
// .text-content {
// font-size: 14px;
// padding: 0 10px;
// }
// }
.exclusive {
padding-top: 70px;
padding-bottom: 70px;
width:calc(100% - 432px) ;
// margin-left: 45%;
}
@media (max-width: 1400px) {
.exclusive {
width: 50%;
// margin-left: 35%;
}
}
</style> </style>
<style lang="scss"> <style lang="scss">
.web { .web {
@ -135,4 +179,5 @@ const onCancel = () => {
height: 100%; height: 100%;
background-color: rgba(0, 0, 0, 0.85)!important; background-color: rgba(0, 0, 0, 0.85)!important;
} }
</style> </style>

View File

@ -1,72 +0,0 @@
<template>
<div class="cards-container">
<div
class="card"
:style="cardStyle1"
@mousemove="startTracking1"
@mouseleave="stopTracking1"
>
<div
class="card-title text-xl font-bold mb-10 text-center text-yellow-color flex items-center justify-center cards-container"
>
<div class="mr-6">
<img src="../assets/img/badge/triangle-yellow.png" alt="" />
</div>
<div>GENESIS</div>
<div class="ml-6">
<img src="../assets/img/badge/triangle-yellow.png" alt="" />
</div>
</div>
</div>
<div
class="card"
:style="cardStyle2"
@mousemove="startTracking2"
@mouseleave="stopTracking2"
>
<div
class="text-xl font-bold card-title-right text-center mb-4 text-black-color-300 cards-container"
>
EXPL ORER
</div>
<div class="card-body cards-container flex pt-12">
<img src="../assets/img/badge/explorer BG.png" alt="" />
</div>
</div>
</div>
</template>
<script setup>
import { useMouseRotation } from "../hooks/useMouseRotation";
const {
cardStyle: cardStyle1,
startTracking: startTracking1,
stopTracking: stopTracking1,
} = useMouseRotation();
const {
cardStyle: cardStyle2,
startTracking: startTracking2,
stopTracking: stopTracking2,
} = useMouseRotation();
</script>
<style lang="scss" scoped>
.cards-container {
display: flex;
justify-content: space-around;
padding: 2rem;
.card {
width: 300px;
height: 450px;
border: 1px solid #ccc;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
overflow: hidden;
position: relative;
background-color: #fff;
}
}
</style>

View File

@ -1,98 +0,0 @@
<template>
<div class="timeline">
<div class="timeline-container">
<div class="timeline-item" v-for="item in timelineItems" :key="item.id">
<div class="timeline-content">
<div class="timeline-date">{{ item.date }}</div>
<h3>{{ item.title }}</h3>
<p>{{ item.description }}</p>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
const timelineItems = ref([
{
id: 1,
date: "2021",
title: "Event Title 1",
description: "Description for event 1",
},
{
id: 2,
date: "2022",
title: "Event Title 2",
description: "Description for event 2",
},
// Add more items as needed
]);
</script>
<style lang="scss" scoped>
.timeline {
padding: 2rem;
.timeline-container {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
&:before {
content: "";
position: absolute;
top: 0;
left: 50%;
width: 4px;
height: 100%;
background-color: #ccc;
transform: translateX(-50%);
}
.timeline-item {
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
padding: 1rem;
.timeline-content {
background-color: #fff;
border-radius: 5px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
padding: 1rem;
position: relative;
&:before {
content: "";
position: absolute;
top: 50%;
left: 50%;
width: 20px;
height: 20px;
background-color: #ccc;
border-radius: 50%;
transform: translate(-50%, -50%);
z-index: 1;
}
.timeline-date {
font-size: 1.2rem;
font-weight: bold;
color: #333;
margin-bottom: 0.5rem;
}
h3 {
font-size: 1.5rem;
font-weight: bold;
color: #333;
margin-bottom: 0.5rem;
}
p {
font-size: 1rem;
line-height: 1.5;
color: #666;
}
}
}
}
}
</style>

View File

@ -17,7 +17,7 @@
class="text-lg login-btn-item italic text-my-text-color font-poppins-semiBoldItalic decoration-1" class="text-lg login-btn-item italic text-my-text-color font-poppins-semiBoldItalic decoration-1"
@click="login" @click="login"
> >
WALLET CONNECT Log in
</div> </div>
</div> </div>
<div <div
@ -28,7 +28,7 @@
class="text-lg italic font-poppins-semiBoldItalic login-btn-item text-my-text-color decoration-1" class="text-lg italic font-poppins-semiBoldItalic login-btn-item text-my-text-color decoration-1"
@click="logout" @click="logout"
> >
loginout logout
</div> </div>
</div> </div>
</div> </div>
@ -113,6 +113,7 @@ const logout = async () => {
.login-btn-item{ .login-btn-item{
position: relative; position: relative;
padding-right: 20px; padding-right: 20px;
text-transform: uppercase;
} }
.login-btn-item::after { .login-btn-item::after {
content: ""; content: "";

View File

@ -22,15 +22,6 @@ function isMobileDevice(userAgent) {
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent); return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);
} }
router.beforeEach((to, from, next) => {
const isMobile = isMobileDevice(window.navigator.userAgent);
// 对于 PC 端官网项目:
if (!isMobile) {
next(); // 如果是 PC 设备,继续导航
} else {
window.location.href = 'https://mobile.cebg.games';
}
});
export default router; export default router;

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="bg"><img src="../assets/img/badge/bg.png" alt="" /></div> <div class="bg"><img src="../assets/img/badge/bg.png" alt="" /></div>
<div class="content mx-auto pb-60"> <div class="content mx-auto pb-60">
<div class="flex pt-20"> <div class="flex pt-20 pl-2">
<div class="card shadow-md rounded cards-container"> <div class="card shadow-md rounded cards-container">
<div></div> <div></div>
<div <div
@ -36,14 +36,13 @@
<div class="card-top-img"></div> <div class="card-top-img"></div>
<div class="top-active top-boder" id="top-boder-impot"></div> <div class="top-active top-boder" id="top-boder-impot"></div>
</div> </div>
<div><img src="../assets/img/badge/genesis BG.png" alt="" /></div> <!-- <div><img src="../assets/img/badge/explorerBG.png" alt="" /></div> -->
<!-- <div><div class="btn mx-auto mt-8">Claim</div></div> --> <!-- <div><div class="btn mx-auto mt-8">Claim</div></div> -->
</div> </div>
</div> </div>
<div class="genesicard"> <div class="genesicard">
<div class="genesis-title font-firaSans-blackItalic"> <div class="genesis-title font-firaSans-blackItalic">
Genesis NFT <br /> {{ displayedText }}
holder Only
</div> </div>
<div class="title-boder"> <div class="title-boder">
<img src="../assets/img/badge/title-boder.png" alt="" /> <img src="../assets/img/badge/title-boder.png" alt="" />
@ -91,7 +90,7 @@
</div> </div>
<div class="card shadow-md rounded cards-container"> <div class="card shadow-md rounded cards-container">
<div <div
class="text-xl font-bold font-firaSans-blackItalic card-title-right text-black-color-300 cards-container" class="text-xl font-firaSans-blackItalic card-title-right cards-container"
> >
EXPLORER EXPLORER
</div> </div>
@ -103,7 +102,7 @@
@mouseenter="startTracking2" @mouseenter="startTracking2"
@mouseleave="stopTracking2" @mouseleave="stopTracking2"
> >
<img src="../assets/img/badge/explorer BG.png" alt="" /> <img src="../assets/img/badge/explorerBG.png" alt="" />
</div> </div>
</div> </div>
</div> </div>
@ -114,7 +113,7 @@
<div class="pt-2"> <div class="pt-2">
<div class="flex more-btns"> <div class="flex more-btns">
<div class="btn-more-left" @click="handlHero"></div> <div class="btn-more-left" @click="handlHero"></div>
<div class="btn-more-right" > <div class="btn-more-right">
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li>Alpha Test</li> <li>Alpha Test</li>
<li>Beta Test I</li> <li>Beta Test I</li>
@ -148,10 +147,10 @@ import { useAppStore } from "@/store/app";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import { useMouse, useRafFn } from "@vueuse/core"; import { useMouse, useRafFn } from "@vueuse/core";
import { beginClaim, checkClaimStatus } from "../api/badge"; import { beginClaim, checkClaimStatus } from "../api/badge";
import { useMouseRotation } from "../hooks/useMouseRotation"; import { useMouseRotation } from "@/hooks/useMouseRotation";
import NavBar from "@/components/layout/NavBar.vue"; import NavBar from "@/components/layout/NavBar.vue";
import ImageTextModal from "../components/global/ImageTextModal.vue"; import ImageTextModal from "@/components/global/ImageTextModal.vue";
import GlobalLoading from "../components/global/GlobalLoading.vue"; import GlobalLoading from "@/components/global/GlobalLoading.vue";
import { useChainStore } from "@/store/chain"; import { useChainStore } from "@/store/chain";
const AppModule = useAppStore(); const AppModule = useAppStore();
const scrollOffset = ref("0%"); const scrollOffset = ref("0%");
@ -163,10 +162,23 @@ const chain = useChainStore();
const totalSupply = ref(0); const totalSupply = ref(0);
const mintableCount = ref(0); const mintableCount = ref(0);
const supplyLimit = ref(0); const supplyLimit = ref(0);
const message = ref("Youre not eligible for this stage."); const text = "Genesis NFT holder Only";
const chars = text.split("");
let shuffledChars = [...chars];
const displayedText = ref(shuffledChars.join(""));
const message = ref("You're not eligible for this stage.");
shuffledChars.sort(() => Math.random() - 0.5);
const handlHero = () => { const handlHero = () => {
visible.value = true; visible.value = true;
}; };
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
const handleScroll = () => { const handleScroll = () => {
const currentScrollTop = const currentScrollTop =
@ -273,7 +285,7 @@ const fetchData = async () => {
message.value !== "claim success" && message.value !== "claim success" &&
message.value !== "claim failure" message.value !== "claim failure"
) { ) {
message.value = "Youre not eligible for this stage."; message.value = "You're not eligible for this stage.";
} }
//mint //mint
supplyLimit.value = await chain.chainManager.bc.supplyLimit(); supplyLimit.value = await chain.chainManager.bc.supplyLimit();
@ -288,7 +300,7 @@ const resetData = () => {
totalSupply.value = 0; totalSupply.value = 0;
mintableCount.value = 0; mintableCount.value = 0;
supplyLimit.value = 0; supplyLimit.value = 0;
message.value = "Youre not eligible for this stage."; message.value = "You're not eligible for this stage.";
console.log("totalSupply.value:", totalSupply.value); console.log("totalSupply.value:", totalSupply.value);
console.log("mintableCount.value:", mintableCount.value); console.log("mintableCount.value:", mintableCount.value);
console.log("supplyLimit.value:", supplyLimit.value); console.log("supplyLimit.value:", supplyLimit.value);
@ -307,6 +319,18 @@ watch(
); );
// //
onMounted(async () => { onMounted(async () => {
let steps = 0;
const maxSteps = 20;
const interval = setInterval(() => {
steps++;
if (steps >= maxSteps) {
displayedText.value = text;
clearInterval(interval);
} else {
shuffle(shuffledChars);
displayedText.value = shuffledChars.join('');
}
}, 10);
if (AppModule.token && AppModule.step) { if (AppModule.token && AppModule.step) {
await fetchData(); await fetchData();
} }
@ -418,6 +442,7 @@ onUnmounted(() => {
font-size: 40px; font-size: 40px;
margin-top: 16px; margin-top: 16px;
text-align: center; text-align: center;
color: #686868;
// font-family: "Fira Sans"; // font-family: "Fira Sans";
font-weight: normal; font-weight: normal;
} }
@ -604,6 +629,8 @@ p {
pointer-events: none; pointer-events: none;
} }
.genesis-title { .genesis-title {
width: 287px;
height: 81px;
font-size: 40px; font-size: 40px;
letter-spacing: 3px; letter-spacing: 3px;
margin-top: 75px; margin-top: 75px;
@ -616,7 +643,7 @@ p {
position: relative; /* 添加相对定位以便伪元素定位 */ position: relative; /* 添加相对定位以便伪元素定位 */
width: 302px; width: 302px;
margin-left: 39px; margin-left: 39px;
margin-right: 162px; margin-right: 153px;
} }
.genesicard::before { .genesicard::before {

View File

@ -1,86 +0,0 @@
<template>
<div class="my-container">
<NavBar></NavBar>
<div class="content-top">
<div class="text-left">
<img src="../assets/img/badge/left-text.png" alt="" />
</div>
<div class="text-right">
<img src="../assets/img/badge/right-text.png" alt="" />
</div>
<div class="bg"><img src="../assets/img/badge/bg.png" alt="" /></div>
<CardsSection />
<TimelineSection />
</div>
<ImageTextModal v-model:visible="visible" />
</div>
</template>
<script setup>
import { ref } from 'vue';
import NavBar from '@/components/layout/NavBar.vue';
import ImageTextModal from '../components/global/ImageTextModal.vue';
import CardsSection from '../components/CardsSection.vue';
import TimelineSection from '../components/TimelineSection.vue';
const visible = ref(false);
const openModal = () => {
visible.value = true;
};
</script>
<style lang="scss" scoped>
.my-container {
.content-top {
position: relative;
.bg {
position: absolute;
left: 0;
top: -10px;
bottom: 0;
right: 0;
z-index: -1;
img {
width: 100%;
object-fit: cover;
height: 100%;
}
}
.text-left {
position: absolute;
left: 85px;
bottom: 30px;
animation: slide-up 1s ease-out;
}
.text-right {
position: absolute;
right: 85px;
top: 30px;
animation: slide-down 1s ease-out;
}
}
}
@keyframes slide-up {
0% {
transform: translateY(100%);
opacity: 0;
}
100% {
transform: translateY(0%);
opacity: 1;
}
}
@keyframes slide-down {
0% {
transform: translateY(-100%);
opacity: 0;
}
100% {
transform: translateY(0%);
opacity: 1;
}
}
</style>

View File

@ -1,57 +0,0 @@
<!-- MedalApp.vue -->
<template>
<div>
<h1>可领取的勋章数量{{ mintableCount }}</h1>
<button @click="mintMedals">领取勋章</button>
</div>
</template>
<script>
import { ref } from 'vue';
import { ethers } from 'ethers';
import MEDAL_REWARDS_ABI from './MEDAL_REWARDS_ABI.json'; // ABI
export default {
setup() {
const mintableCount = ref(0);
const medalRewardsAddress = '0x123...'; //
const provider = new ethers.providers.Web3Provider(window.ethereum); // 使 MetaMask provider
const medalRewardsContract = new ethers.Contract(medalRewardsAddress, MEDAL_REWARDS_ABI, provider);
const loadMintableCount = async () => {
try {
const userAddress = await provider.getSigner().getAddress(); //
const count = await medalRewardsContract.getMintableCount(userAddress);
mintableCount.value = count.toNumber();
} catch (error) {
console.error('Error fetching mintable count:', error);
}
};
const mintMedals = async () => {
try {
const signer = provider.getSigner(); //
const userAddress = await signer.getAddress(); //
const contractWithSigner = medalRewardsContract.connect(signer);
const tx = await contractWithSigner.mintToUser(userAddress, mintableCount.value);
await tx.wait(); //
//
await loadMintableCount();
} catch (error) {
console.error('Error minting medals:', error);
}
};
//
loadMintableCount();
return {
mintableCount,
mintMedals,
};
},
};
</script>

View File

@ -32,7 +32,7 @@ export default defineConfig({
// 打包文件名 // 打包文件名
assetsDir: 'static', assetsDir: 'static',
// 静态资源引用路径 // 静态资源引用路径
sourcemap: true, sourcemap: false,
assetsPublicPath: '/', assetsPublicPath: '/',
// 是否开启压缩 // 是否开启压缩
minify: 'terser', minify: 'terser',