init
This commit is contained in:
commit
1b7565207f
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.zip
|
143
404.html
Normal file
143
404.html
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
|
||||||
|
<!-- Preloader-->
|
||||||
|
<div id="preloader">
|
||||||
|
<div class="pyramid-loader">
|
||||||
|
<div class="wrapper">
|
||||||
|
<span class="side side1"></span>
|
||||||
|
<span class="side side2"></span>
|
||||||
|
<span class="side side3"></span>
|
||||||
|
<span class="side side4"></span>
|
||||||
|
<span class="shadow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Preloader-->
|
||||||
|
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="scroll-container">
|
||||||
|
|
||||||
|
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<!-- BG-ERROR PAGE # 1 START -->
|
||||||
|
<div class="signup-page error-page-bg">
|
||||||
|
|
||||||
|
<!-- ERROR SECTION START -->
|
||||||
|
<div class="error-page">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="error-wrapper text-center">
|
||||||
|
<h2 class="fw-700 black">404</h2>
|
||||||
|
<div class="content-box">
|
||||||
|
<h6 class="h2 light-gray mb-12 fw-500">Page not found.</h6>
|
||||||
|
<p class="light-gray mb-48">Lorem ipsum dolor sit amet consectetur. Cras ut enim volutpat tristique. Consectetur sit sed <br class="d-sm-block d-none"> ultrices
|
||||||
|
nisl ornare nisl ipsum. Accumsan pellentesque tellus quam condimentum.</p>
|
||||||
|
<a href="index.html" class="cus-btn-3 m-auto">
|
||||||
|
<span>Back to Home Page</span>
|
||||||
|
<span>Back to Home Page</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- ERROR SECTION END -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- FOOTER START -->
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- FOOTER END -->
|
||||||
|
<!-- 钱包选择弹窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 钱包地址弹窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
<!-- Main Wrapper End -->
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
<script src="static/js/jquery-validator.js"></script>
|
||||||
|
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻译文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 获取用户信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
405
about.html
Normal file
405
about.html
Normal file
@ -0,0 +1,405 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
<link rel="stylesheet" href="static/js/element-ui-min.css">
|
||||||
|
<style>
|
||||||
|
.el-carousel__item{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
|
||||||
|
<!-- Preloader-->
|
||||||
|
<div id="preloader">
|
||||||
|
<div class="pyramid-loader">
|
||||||
|
<div class="wrapper">
|
||||||
|
<span class="side side1"></span>
|
||||||
|
<span class="side side2"></span>
|
||||||
|
<span class="side side3"></span>
|
||||||
|
<span class="side side4"></span>
|
||||||
|
<span class="shadow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Preloader-->
|
||||||
|
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="app" v-cloak>
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<div class="about-page">
|
||||||
|
|
||||||
|
<section class="title-banner py-80">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<h1 class="fw-500 text-center">{{currentLanguage == 'zh'?'關於我們':'About Us'}}</h1>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ABOUT US SECTION START -->
|
||||||
|
<section class="about-us-section mb-80">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="about-container mb-80">
|
||||||
|
<div class="row align-items-center" style="height: 400px;">
|
||||||
|
<div
|
||||||
|
style="height: 100%;overflow: auto;"
|
||||||
|
class="col-lg-6"
|
||||||
|
id="aboutContent"
|
||||||
|
v-html="currentLanguage == 'zh' ? aboutObj.cn : aboutObj.en"
|
||||||
|
></div>
|
||||||
|
<div class="col-lg-6" style="height: 100%;">
|
||||||
|
<img src="static/ui/about/us.png" alt="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row align-items-center" style="margin-top: 10vh;height: 400px;">
|
||||||
|
<div class="col-lg-6">
|
||||||
|
<el-carousel
|
||||||
|
height="400px"
|
||||||
|
arrow="always"
|
||||||
|
:autoplay="false"
|
||||||
|
indicator-position="none"
|
||||||
|
@change="nowTeam($event)"
|
||||||
|
>
|
||||||
|
<el-carousel-item v-for="(item,index) in aboutObj.teamlist" :key="item.id">
|
||||||
|
<img :src="baseUrl + item.img" style="height: 100%;" alt="">
|
||||||
|
</el-carousel-item>
|
||||||
|
</el-carousel>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6" style="height: 100%;overflow: auto;">
|
||||||
|
<h3 class="fw-500 mb-24">{{ currentLanguage == 'zh' ? nowteaminfos.title_cn : nowteaminfos.title_en}}</h3>
|
||||||
|
<div v-html="currentLanguage == 'zh' ? nowteaminfos.desc_cn : nowteaminfos.desc_en"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<!-- ABOUT US SECTION END -->
|
||||||
|
|
||||||
|
<!-- SIGN UP BANNER START -->
|
||||||
|
<section class="mb-80" style="width: 90%;margin: 0 auto;">
|
||||||
|
<h4 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '合作伙伴':'Cooperative Partner'}}</h4>
|
||||||
|
<el-carousel
|
||||||
|
height="30vh"
|
||||||
|
arrow="always"
|
||||||
|
:autoplay="true"
|
||||||
|
indicator-position="none"
|
||||||
|
>
|
||||||
|
<el-carousel-item>
|
||||||
|
<img src="./static/ui/about/t1.png" style="height: 100%;" alt="">
|
||||||
|
<img src="./static/ui/about/t2.png" style="height: 100%;" alt="">
|
||||||
|
<img src="./static/ui/about/t3.png" style="height: 100%;" alt="">
|
||||||
|
<img src="./static/ui/about/t4.png" style="height: 100%;" alt="">
|
||||||
|
</el-carousel-item>
|
||||||
|
<el-carousel-item>
|
||||||
|
<img src="./static/ui/about/t4.png" style="height: 100%;" alt="">
|
||||||
|
<img src="./static/ui/about/t5.png" style="height: 100%;" alt="">
|
||||||
|
<img src="./static/ui/about/t6.png" style="height: 100%;" alt="">
|
||||||
|
<img src="./static/ui/about/t6.png" style="height: 100%;" alt="">
|
||||||
|
</el-carousel-item>
|
||||||
|
</el-carousel>
|
||||||
|
</section>
|
||||||
|
<!-- team -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- 钱包选择弹窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 钱包地址弹窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
<!-- Main Wrapper End -->
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻譯文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 獲取用戶信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
<!-- 引入 Vue.js -->
|
||||||
|
<script src="static/js/vue.js" ></script>
|
||||||
|
<!-- 引入 axios -->
|
||||||
|
<script src="static/js/axios.min.js"></script>
|
||||||
|
<!-- 引入 Element UI JS -->
|
||||||
|
<script src="static/js/element-ui.js"></script>
|
||||||
|
<script>
|
||||||
|
// 創建一個增強版的 localStorage
|
||||||
|
const enhancedStorage = {
|
||||||
|
setItem: function(key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
// 觸發自定義事件
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
getItem: function(key) {
|
||||||
|
return localStorage.getItem(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 替換原始的 setItem 方法
|
||||||
|
const originalSetItem = localStorage.setItem;
|
||||||
|
localStorage.setItem = function(key, value) {
|
||||||
|
originalSetItem.call(localStorage, key, value);
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
var $vm = new Vue({
|
||||||
|
el: "#app",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 钱包登录开始
|
||||||
|
userMoneyAdressAll:"",
|
||||||
|
showMoneyAdress:false,
|
||||||
|
hasAdress:false,
|
||||||
|
moneyTipMessage:"",
|
||||||
|
selectMoney:{},
|
||||||
|
wallets: [
|
||||||
|
{
|
||||||
|
name: 'MetaMask',
|
||||||
|
icon: 'static/metamask.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'TokenPocket',
|
||||||
|
icon: 'static/tokenpocket.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'OKX Wallet',
|
||||||
|
icon: 'static/okx-wallet.png'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
moneyDialogVisible: false,
|
||||||
|
userIsLogin: false,
|
||||||
|
userMoneyAdress: "",
|
||||||
|
// 钱包登录结尾
|
||||||
|
currentLanguage: localStorage.getItem('languageNow') || 'en',
|
||||||
|
aboutObj: {},
|
||||||
|
baseUrl,
|
||||||
|
nowteaminfos:{},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async created(){
|
||||||
|
const user = window.localStorage.getItem("userInfo")
|
||||||
|
if (user) {
|
||||||
|
this.userIsLogin = true;
|
||||||
|
}
|
||||||
|
// 钱包登录开始
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let accounts1 = [];
|
||||||
|
let accounts2 = [];
|
||||||
|
let accounts3 = [];
|
||||||
|
if(provider){
|
||||||
|
accounts1 = await provider.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
accounts2 = await window.tokenpocket.ethereum.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum?.isOKExWallet)){
|
||||||
|
accounts3 = await window.okxwallet.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
console.log(accounts1,accounts2,accounts3,'see');
|
||||||
|
let _adressM = accounts1[0] || accounts2[0] || accounts3[0];
|
||||||
|
if(_adressM){
|
||||||
|
this.userMoneyAdressAll = _adressM;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
}
|
||||||
|
// 钱包登录结尾
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('localStorageChange', (event) => {
|
||||||
|
if (event.detail.key === 'languageNow') {
|
||||||
|
this.currentLanguage = event.detail.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.getAbouts();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// <-- -------------------------钱包登录开始 --------------------------->
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
allMoney(){
|
||||||
|
this.showMoneyAdress = true;
|
||||||
|
},
|
||||||
|
userMoneyAdressOptions(adress){
|
||||||
|
if(adress){
|
||||||
|
return adress
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moneyTip(txt){
|
||||||
|
if(txt){
|
||||||
|
return txt
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '請選擇連接錢包' : 'Please choose to connect the wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectWallet(wallet) {
|
||||||
|
this.selectMoney = {};
|
||||||
|
if(wallet.name == 'MetaMask') {
|
||||||
|
if(window.web3?.currentProvider){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'MetaMask未安裝' : 'MetaMask not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wallet.name == 'TokenPocket') {
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'TokenPocket未安裝' : 'TokenPocket not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(wallet.name == "OKX Wallet"){
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum.isOKExWallet)){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? '欧易钱包未安装' : 'OKX Wallet not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(walletType){
|
||||||
|
let account = "";
|
||||||
|
try {
|
||||||
|
if (walletType == 'MetaMask') {
|
||||||
|
const provider = window.web3.currentProvider;
|
||||||
|
const accounts = await provider.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = accounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'TokenPocket') {
|
||||||
|
const tpAccounts = await window.tokenpocket.ethereum.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = tpAccounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'OKX Wallet') {
|
||||||
|
const okxAccounts = await window.okxwallet.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = okxAccounts[0];
|
||||||
|
}
|
||||||
|
console.log(account,'xxaa');
|
||||||
|
let _adressM = account;
|
||||||
|
this.userMoneyAdressAll = account;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
this.moneyDialogVisible = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toConnectWallet() {
|
||||||
|
if(this.userMoneyAdress){
|
||||||
|
if(this.isShowSale){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.hasAdress = !this.hasAdress;
|
||||||
|
return
|
||||||
|
};
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},
|
||||||
|
//<-- -------------------------钱包登录结尾 --------------------------->
|
||||||
|
mobileLang(){
|
||||||
|
this.currentLanguage = mobileLang()
|
||||||
|
},
|
||||||
|
nowTeam(index){
|
||||||
|
this.nowteaminfos = this.aboutObj.teamlist[index];
|
||||||
|
},
|
||||||
|
async getAbouts(){
|
||||||
|
let res = await axios.get(baseUrl+'api/index/about');
|
||||||
|
if (res.data.code === 1) {
|
||||||
|
this.aboutObj = res.data.data;
|
||||||
|
this.nowteaminfos = this.aboutObj.teamlist[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
747
all-order.html
Normal file
747
all-order.html
Normal file
@ -0,0 +1,747 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
<link rel="stylesheet" href="static/js/element-ui-min.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="app">
|
||||||
|
|
||||||
|
<!-- HEADER MENU START -->
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<!-- HEADER MENU END -->
|
||||||
|
|
||||||
|
<!-- BG-GAME PAGE # 1 START -->
|
||||||
|
<div class="order-h5-page" v-loading="tableLoading" element-loading-background="rgba(0, 0, 0, 0.8)" element-loading-spinner="el-icon-loading">
|
||||||
|
<!-- 订单状态标签 -->
|
||||||
|
<div class="order-tabs">
|
||||||
|
<div class="tab-item" :class="{active: activeTab === ''}" @click="changeTab('')">{{ currentLanguage == 'zh' ? '全部訂單' : 'All orders' }}</div>
|
||||||
|
<div class="tab-item" :class="{active: activeTab === 'waitpay'}" @click="changeTab('waitpay')">{{ currentLanguage == 'zh' ? '待支付' : 'Payment to be made' }}</div>
|
||||||
|
<div class="tab-item" :class="{active: activeTab === 'paying'}" @click="changeTab('paying')">{{ currentLanguage == 'zh' ? '交易中' : 'Trading' }}</div>
|
||||||
|
<div class="tab-item" :class="{active: activeTab === 'finish'}" @click="changeTab('finish')">{{ currentLanguage == 'zh' ? '已完成' : 'Completed' }}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 时间筛选 -->
|
||||||
|
<div class="filter-section">
|
||||||
|
<el-select v-model="timeFilter" :placeholder="currentLanguage == 'zh' ? '請選擇':'Please select'" style="width: 120px">
|
||||||
|
<el-option :label="currentLanguage == 'zh' ? '買入':'Buy it in'" value="buyer"></el-option>
|
||||||
|
<el-option :label="currentLanguage == 'zh' ? '求購賣出':'Buy Sell'" value="seller"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 订单列表 -->
|
||||||
|
<div class="order-list">
|
||||||
|
<div class="order-item" v-for="order in orderListObj.data" :key="order.id">
|
||||||
|
<!-- 订单头部 -->
|
||||||
|
<div class="order-header">
|
||||||
|
<div class="order-info">
|
||||||
|
<span class="order-time">{{ expirationTimeOp(order.createtime * 1000) }}</span>
|
||||||
|
<span class="order-no">{{ currentLanguage == 'zh' ? '訂單編號:' : 'Order Number:' }}{{order.order_no}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="order-status">
|
||||||
|
<span v-if="order.status == '等待支付上架费'">{{ currentLanguage == 'zh' ? '等待支付上架費' : 'Waiting for payment of listing fee' }}</span>
|
||||||
|
<span v-if="order.status == '待支付'" style="color: blue;">{{ currentLanguage == 'zh' ? '待支付' : 'Payment to be made' }}</span>
|
||||||
|
<span v-if="order.status == '已支付'" style="color: green;">{{ currentLanguage == 'zh' ? '已支付' : 'Paid' }}</span>
|
||||||
|
<span v-if="order.status == '已完成'" style="color: green;">{{ currentLanguage == 'zh' ? '已完成' : 'Completed' }}</span>
|
||||||
|
<span v-if="order.status == '支付失败'">{{ currentLanguage == 'zh' ? '支付失敗' : 'Payment failed' }}</span>
|
||||||
|
<span v-if="order.status == '已取消'">{{ currentLanguage == 'zh' ? '已取消' : 'Cancelled' }}</span>
|
||||||
|
<span v-if="order.status == '求购中'" style="color: orange;">{{ currentLanguage == 'zh' ? '求購中' : 'Buying' }}</span>
|
||||||
|
<span v-if="order.status == '交易中'" style="color: orange;">{{ currentLanguage == 'zh' ? '交易中' : 'Trading' }}</span>
|
||||||
|
<span v-if="order.status == '成功'" style="color: green;">{{ currentLanguage == 'zh' ? '成功' : 'success' }}</span>
|
||||||
|
<span v-if="order.status == '失败'">{{ currentLanguage == 'zh' ? '失敗' : 'fail' }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 订单商品列表 -->
|
||||||
|
<div class="product-list">
|
||||||
|
<div class="product-item" v-for="(product, index) in order.items" :key="product.id">
|
||||||
|
<div class="product-info">
|
||||||
|
<img :src="baseUrl + product.tplinfo.img" class="product-thumb">
|
||||||
|
<div class="product-detail">
|
||||||
|
<div class="product-name">{{ currentLanguage == 'zh' ? product.tplinfo.name_cn : product.tplinfo.name_en }}</div>
|
||||||
|
<div class="product-spec">{{ currentLanguage == 'zh' ? product.tplinfo.desc_cn : product.tplinfo.desc_en }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 订单底部 -->
|
||||||
|
<div class="order-footer">
|
||||||
|
<div class="order-amount">
|
||||||
|
<span>{{ currentLanguage == 'zh' ? `共 ${order.items.length} 件商品` : `Total ${order.items.length} item`}}</span>
|
||||||
|
<span class="total-price">{{ currentLanguage == 'zh' ? `合計:${order.bnb} BNB`: `Total: ${order.bnb} BNB` }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="order-actions">
|
||||||
|
<template v-if="order.status === '待支付'">
|
||||||
|
<el-button type="primary" size="small" @click="goToPay(order)">{{ currentLanguage == 'zh' ? '去付款' : 'Go to payment' }}</el-button>
|
||||||
|
<el-button type="primary" size="small" @click="goToPaid(order)">{{ currentLanguage == 'zh' ? '我已支付' : 'I have paid' }}</el-button>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 分页 -->
|
||||||
|
<div style="height: 60px;display: flex;justify-content: flex-end;align-items: center;">
|
||||||
|
<el-pagination
|
||||||
|
background
|
||||||
|
layout="prev, pager, next"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
:total="orderListObj.total"
|
||||||
|
:current-page.sync="orderSearchObj.page"
|
||||||
|
>
|
||||||
|
</el-pagination>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- BG-GAME PAGE # 1 END -->
|
||||||
|
|
||||||
|
<!-- FOOTER START -->
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- FOOTER END -->
|
||||||
|
<!-- 錢包選擇彈窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 錢包地址彈窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 已支付但未完成订单 -->
|
||||||
|
<el-dialog :title="currentLanguage == 'zh' ? '提示' : 'hint'" :visible.sync="paymentDialogVisible" width="25%" custom-class="bid-dialog" :show-close="true"
|
||||||
|
center>
|
||||||
|
<div class="price-section">
|
||||||
|
<el-input v-model="paymentTxId" :placeholder="currentLanguage == 'zh' ? '請輸入支付訂單hash':'Please enter the payment order hash'" class="price-input"></el-input>
|
||||||
|
</div>
|
||||||
|
<div slot="footer" class="dialog-footer" style="display: flex;justify-content: flex-end;">
|
||||||
|
<el-button type="danger" @click="paymentDialogVisible = false" class="confirm-btn">{{ currentLanguage == 'zh' ? '取消' : 'Cancel'}}</el-button>
|
||||||
|
<el-button type="primary" @click="submitPaymentHash" class="confirm-btn">{{ currentLanguage == 'zh' ? '確定' : 'Sure'}}</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
<!-- Main Wrapper End -->
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻譯文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 獲取用戶信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
<!-- 引入 Vue.js -->
|
||||||
|
<script src="static/js/vue.js" ></script>
|
||||||
|
<!-- 引入 axios -->
|
||||||
|
<script src="static/js/axios.min.js"></script>
|
||||||
|
<!-- 引入 Element UI JS -->
|
||||||
|
<script src="static/js/element-ui.js"></script>
|
||||||
|
<script>
|
||||||
|
// 創建一個增強版的 localStorage
|
||||||
|
const enhancedStorage = {
|
||||||
|
setItem: function (key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
// 觸發自定義事件
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
getItem: function (key) {
|
||||||
|
return localStorage.getItem(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 替換原始的 setItem 方法
|
||||||
|
const originalSetItem = localStorage.setItem;
|
||||||
|
localStorage.setItem = function (key, value) {
|
||||||
|
originalSetItem.call(localStorage, key, value);
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
new Vue({
|
||||||
|
el: "#app",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
userInfoObj:{},
|
||||||
|
// 錢包登錄開始
|
||||||
|
userMoneyAdressAll: "",
|
||||||
|
showGoodClass: false,
|
||||||
|
showMoneyAdress: false,
|
||||||
|
hasAdress: false,
|
||||||
|
moneyTipMessage: "",
|
||||||
|
selectMoney: {},
|
||||||
|
wallets: [
|
||||||
|
{
|
||||||
|
name: 'MetaMask',
|
||||||
|
icon: 'static/metamask.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'TokenPocket',
|
||||||
|
icon: 'static/tokenpocket.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'OKX Wallet',
|
||||||
|
icon: 'static/okx-wallet.png'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
moneyDialogVisible: false,
|
||||||
|
userIsLogin: false,
|
||||||
|
userMoneyAdress: "",
|
||||||
|
// 錢包登錄結尾
|
||||||
|
currentLanguage: localStorage.getItem('languageNow') || 'en',
|
||||||
|
baseUrl,
|
||||||
|
activeTab: '',
|
||||||
|
timeFilter: 'buyer',
|
||||||
|
orderSearchObj:{
|
||||||
|
page:1,
|
||||||
|
listrow:5
|
||||||
|
},
|
||||||
|
orderListObj: {},
|
||||||
|
tableLoading: false,
|
||||||
|
paymentDialogVisible:false,
|
||||||
|
paymentTxId:"",
|
||||||
|
nowPaidOrderObj:{},//已支付但订单未完成信息
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async created(){
|
||||||
|
const user = window.localStorage.getItem("userInfo");
|
||||||
|
this.userInfoObj = JSON.parse(user);
|
||||||
|
if (user) {
|
||||||
|
this.userIsLogin = true;
|
||||||
|
}
|
||||||
|
// 錢包登錄開始
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let accounts1 = [];
|
||||||
|
let accounts2 = [];
|
||||||
|
let accounts3 = [];
|
||||||
|
if(provider){
|
||||||
|
accounts1 = await provider.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
accounts2 = await window.tokenpocket.ethereum.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum?.isOKExWallet)){
|
||||||
|
accounts3 = await window.okxwallet.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
console.log(accounts1,accounts2,accounts3,'see');
|
||||||
|
let _adressM = accounts1[0] || accounts2[0] || accounts3[0];
|
||||||
|
if(_adressM){
|
||||||
|
this.userMoneyAdressAll = _adressM;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
}
|
||||||
|
if(accounts1[0]?.length > 0){
|
||||||
|
this.connectWalletType = "MetaMask";
|
||||||
|
}
|
||||||
|
if(accounts2[0]?.length > 0){
|
||||||
|
this.connectWalletType = "TokenPocket";
|
||||||
|
}
|
||||||
|
if(accounts3[0]?.length > 0){
|
||||||
|
this.connectWalletType = "OKX Wallet";
|
||||||
|
}
|
||||||
|
// 錢包登錄結尾
|
||||||
|
},
|
||||||
|
watch:{
|
||||||
|
timeFilter:{
|
||||||
|
handler(val){
|
||||||
|
this.orderSearchObj.page = 1;
|
||||||
|
this.orderListObj = {};
|
||||||
|
this.getallorderList();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deep:true
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('localStorageChange', (event) => {
|
||||||
|
if (event.detail.key === 'languageNow') {
|
||||||
|
this.currentLanguage = event.detail.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.getallorderList();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
expirationTimeOp(timestamp){
|
||||||
|
const date = new Date(timestamp); // 创建 Date 对象
|
||||||
|
const year = date.getFullYear(); // 获取年份
|
||||||
|
const month = String(date.getMonth() + 1).padStart(2, '0'); // 获取月份,注意月份从0开始
|
||||||
|
const day = String(date.getDate()).padStart(2, '0'); // 获取日期
|
||||||
|
const hours = String(date.getHours()).padStart(2, '0'); // 获取小时
|
||||||
|
const minutes = String(date.getMinutes()).padStart(2, '0'); // 获取分钟
|
||||||
|
const seconds = String(date.getSeconds()).padStart(2, '0'); // 获取秒钟
|
||||||
|
|
||||||
|
// 返回格式化后的日期字符串
|
||||||
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
||||||
|
},
|
||||||
|
getallorderList(){
|
||||||
|
this.tableLoading = true;
|
||||||
|
let _that = this;
|
||||||
|
$.ajax({
|
||||||
|
url: `${baseUrl}api/project/getorderlist`,
|
||||||
|
type: "get",
|
||||||
|
data: {
|
||||||
|
..._that.orderSearchObj,
|
||||||
|
trade: _that.timeFilter,
|
||||||
|
state: _that.activeTab
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
token: _that.userInfoObj.token
|
||||||
|
},
|
||||||
|
success(res){
|
||||||
|
if (res.code === 1) {
|
||||||
|
_that.orderListObj = res.data;
|
||||||
|
_that.tableLoading = false;
|
||||||
|
} else {
|
||||||
|
_that.$message.error(res.msg)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error(error) {
|
||||||
|
_that.$message.error(error)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
changeTab(tab) {
|
||||||
|
this.activeTab = tab;
|
||||||
|
this.orderSearchObj.page = 1;
|
||||||
|
this.getallorderList();
|
||||||
|
},
|
||||||
|
submitPaymentHash(){
|
||||||
|
let message = "";
|
||||||
|
this.currentLanguage == 'zh' ? message = '請輸入支付訂單hash' : message = 'Please enter the payment order hash'
|
||||||
|
if(!this.paymentTxId){
|
||||||
|
this.$message.error(message);
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.paymentDialogVisible = false;
|
||||||
|
let tipMessage = this.currentLanguage == 'zh' ? '查詢中,請勿刷新頁面...' : 'Querying, please do not refresh the page';
|
||||||
|
this.orderLoading = this.$loading({ lock: true, text: tipMessage, spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.7)' });
|
||||||
|
this.submitOrderHash(this.nowPaidOrderObj.id,this.paymentTxId);
|
||||||
|
},
|
||||||
|
goToPaid(order){
|
||||||
|
this.nowPaidOrderObj = {...order};
|
||||||
|
this.paymentDialogVisible = true;
|
||||||
|
},
|
||||||
|
goToPay(order) {
|
||||||
|
let _that = this;
|
||||||
|
let message1 = this.currentLanguage == 'zh' ? '請連接錢包' : 'Please connect the wallet';
|
||||||
|
let tip = this.currentLanguage == 'zh' ? '提示' : 'tips';
|
||||||
|
let confirm = this.currentLanguage == 'zh' ? '確定' : 'confirm';
|
||||||
|
let cancel = this.currentLanguage == 'zh' ? '取消' : 'cancel';
|
||||||
|
if(!this.userMoneyAdressAll){
|
||||||
|
this.$message.error(message1);
|
||||||
|
setTimeout(()=>{
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},1000)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let tipmessage = _that.currentLanguage == 'zh' ? `是否前往支付訂單費用?` : `Do you want to pay for the order?`;
|
||||||
|
if(_that.timeFilter == 'seller'){
|
||||||
|
tipmessage = _that.currentLanguage == 'zh' ? `是否前往支付版權費?` : `Do you want to pay the copyright fee?`;
|
||||||
|
}
|
||||||
|
_that.$confirm(tipmessage, tip, {
|
||||||
|
confirmButtonText: confirm,
|
||||||
|
cancelButtonText: cancel,
|
||||||
|
type: 'warning'
|
||||||
|
}).then(() => {
|
||||||
|
let tipMessage = _that.currentLanguage == 'zh' ? '交易中,請勿刷新頁面...' : 'During the transaction, please do not refresh the page';
|
||||||
|
_that.orderLoading = _that.$loading({ lock: true, text: tipMessage, spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.7)' });
|
||||||
|
_that.payOrderFee(order);
|
||||||
|
}).catch(() => {
|
||||||
|
_that.$message("Failed");
|
||||||
|
});
|
||||||
|
},
|
||||||
|
async payOrderFee(item){
|
||||||
|
let _that = this;
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let web3 = null;
|
||||||
|
if(this.connectWalletType == "MetaMask"){
|
||||||
|
web3 = new Web3(provider);
|
||||||
|
await provider.request({method: 'eth_requestAccounts'});
|
||||||
|
}
|
||||||
|
if(this.connectWalletType == "TokenPocket"){
|
||||||
|
web3 = new Web3(window.tokenpocket.ethereum);
|
||||||
|
await window.tokenpocket.ethereum.request({method: 'eth_requestAccounts'});
|
||||||
|
}
|
||||||
|
if(this.connectWalletType == "OKX Wallet"){
|
||||||
|
web3 = new Web3(window.okxwallet);
|
||||||
|
await window.okxwallet.request({method: 'eth_requestAccounts'});
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const transactions = {
|
||||||
|
from: _that.userMoneyAdressAll,
|
||||||
|
to: item.toaddress,
|
||||||
|
value: web3.utils.toWei(item.bnb, 'ether'),
|
||||||
|
gas: 21000
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = await web3.eth.sendTransaction(transactions);
|
||||||
|
|
||||||
|
if(result.transactionHash){
|
||||||
|
this.submitOrderHash(item.id,result.transactionHash);
|
||||||
|
}else{
|
||||||
|
let canaltip = this.currentLanguage == 'zh' ? '交易失敗!' : 'Transaction failed!';
|
||||||
|
this.$message.error(canaltip);
|
||||||
|
this.orderLoading.close();
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error,'交易失败原因');
|
||||||
|
let canaltip = this.currentLanguage == 'zh' ? '交易失敗!' : 'Transaction failed!';
|
||||||
|
this.$message.error(canaltip);
|
||||||
|
this.orderLoading.close();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
submitOrderHash(id,tx){
|
||||||
|
//求购卖出支付结果api/project/wtbrevpayres
|
||||||
|
//买入支付结果api/common/payresult
|
||||||
|
let api = "";
|
||||||
|
let obj = {};
|
||||||
|
let _that = this;
|
||||||
|
if(this.timeFilter == 'buyer'){
|
||||||
|
api = "api/common/payresult";
|
||||||
|
obj = { id,tx }
|
||||||
|
}else{
|
||||||
|
api = "api/project/wtbrevpayres";
|
||||||
|
obj = { wtbid: id,tx }
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
$.ajax({
|
||||||
|
url: `${baseUrl + api}`,
|
||||||
|
type: "post",
|
||||||
|
data: {...obj},
|
||||||
|
headers: {
|
||||||
|
token: _that.userInfoObj.token
|
||||||
|
},
|
||||||
|
success(res){
|
||||||
|
if (res.code === 1) {
|
||||||
|
_that.$message.success('success');
|
||||||
|
_that.orderLoading.close();
|
||||||
|
setTimeout(()=>{
|
||||||
|
_that.getallorderList();
|
||||||
|
},1000);
|
||||||
|
} else {
|
||||||
|
_that.$message.error(res.msg)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error(err) {
|
||||||
|
_that.$message.error(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
_that.$message.error(error)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleCurrentChange(newPage) {
|
||||||
|
this.orderSearchObj.page = newPage;
|
||||||
|
this.getallorderList();
|
||||||
|
},
|
||||||
|
// <-- -------------------------錢包登錄開始 --------------------------->
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
allMoney(){
|
||||||
|
this.showMoneyAdress = true;
|
||||||
|
},
|
||||||
|
userMoneyAdressOptions(adress){
|
||||||
|
if(adress){
|
||||||
|
return adress
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moneyTip(txt){
|
||||||
|
if(txt){
|
||||||
|
return txt
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '請選擇連接錢包' : 'Please choose to connect the wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectWallet(wallet) {
|
||||||
|
this.selectMoney = {};
|
||||||
|
if(wallet.name == 'MetaMask') {
|
||||||
|
if(window.web3?.currentProvider){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'MetaMask未安裝' : 'MetaMask not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wallet.name == 'TokenPocket') {
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'TokenPocket未安裝' : 'TokenPocket not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(wallet.name == "OKX Wallet"){
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum.isOKExWallet)){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? '歐易錢包未安裝' : 'OKX Wallet not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(walletType){
|
||||||
|
let account = "";
|
||||||
|
this.connectWalletType = walletType;
|
||||||
|
try {
|
||||||
|
if (walletType == 'MetaMask') {
|
||||||
|
const provider = window.web3.currentProvider;
|
||||||
|
const accounts = await provider.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = accounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'TokenPocket') {
|
||||||
|
const tpAccounts = await window.tokenpocket.ethereum.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = tpAccounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'OKX Wallet') {
|
||||||
|
const okxAccounts = await window.okxwallet.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = okxAccounts[0];
|
||||||
|
}
|
||||||
|
console.log(account,'xxaa');
|
||||||
|
let _adressM = account;
|
||||||
|
this.userMoneyAdressAll = account;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
this.moneyDialogVisible = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toConnectWallet() {
|
||||||
|
if(this.userMoneyAdress){
|
||||||
|
if(this.isShowSale){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.hasAdress = !this.hasAdress;
|
||||||
|
return
|
||||||
|
};
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},
|
||||||
|
//<-- -------------------------錢包登錄結尾 --------------------------->
|
||||||
|
mobileLang(){
|
||||||
|
this.currentLanguage = mobileLang()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.order-h5-page {
|
||||||
|
padding: 20px;
|
||||||
|
background: #f5f7fa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-tabs {
|
||||||
|
display: flex;
|
||||||
|
background: #fff;
|
||||||
|
padding: 10px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-item {
|
||||||
|
flex: 1;
|
||||||
|
text-align: center;
|
||||||
|
padding: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-item.active {
|
||||||
|
color: #409EFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-section {
|
||||||
|
margin: 15px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-item {
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 8px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-header {
|
||||||
|
padding: 15px;
|
||||||
|
border-bottom: 1px solid #f0f0f0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-info {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 15px;
|
||||||
|
color: #666;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jd-icon {
|
||||||
|
color: #e1251b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-status {
|
||||||
|
color: #e1251b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-list {
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-item {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-item:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-info {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-thumb {
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-right: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-detail {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-name {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-spec {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-quantity {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-footer {
|
||||||
|
padding: 15px;
|
||||||
|
border-top: 1px solid #f0f0f0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-amount {
|
||||||
|
font-size: 13px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-price {
|
||||||
|
margin-left: 15px;
|
||||||
|
color: #333;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment-status {
|
||||||
|
margin-left: 15px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-actions {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-actions .el-button--text {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.delete-btn {
|
||||||
|
color: #999 !important;
|
||||||
|
}
|
||||||
|
</style>
|
434
contact.html
Normal file
434
contact.html
Normal file
@ -0,0 +1,434 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
<link rel="stylesheet" href="static/js/element-ui-min.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
|
||||||
|
<!-- Preloader-->
|
||||||
|
<div id="preloader">
|
||||||
|
<div class="pyramid-loader">
|
||||||
|
<div class="wrapper">
|
||||||
|
<span class="side side1"></span>
|
||||||
|
<span class="side side2"></span>
|
||||||
|
<span class="side side3"></span>
|
||||||
|
<span class="side side4"></span>
|
||||||
|
<span class="shadow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Preloader-->
|
||||||
|
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="app">
|
||||||
|
|
||||||
|
<!-- HEADER MENU START -->
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<!-- HEADER MENU END -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BG-CONTACT PAGE # 1 START -->
|
||||||
|
<div class="contact-page">
|
||||||
|
|
||||||
|
<section class="title-banner py-40">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<h1 class="fw-500 text-center" data-i18n="header.title6">Contact Us</h1>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- CONTACT PAGE START -->
|
||||||
|
<section class="contact-us-warpper pb-40">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="contact-container">
|
||||||
|
<div class="row align-items-center row-gap-4">
|
||||||
|
<div class="col-xl-5">
|
||||||
|
<img src="static/picture/signup-image.png" style="width: 95%;" alt="">
|
||||||
|
</div>
|
||||||
|
<div class="col-xl-7">
|
||||||
|
<div class="contact-input-form">
|
||||||
|
<div class="row row-gap-4">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="input-block mb-24">
|
||||||
|
<input type="text" v-model="firstName" class="form-control form-control-3" :placeholder="currentLanguage == 'zh' ? '名字' : 'First Name'">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 20 20" fill="none">
|
||||||
|
<path d="M10 0C7.09223 0 4.72656 2.36566 4.72656 5.27344C4.72656 8.18121 7.09223 10.5469 10 10.5469C12.9078 10.5469 15.2734 8.18121 15.2734 5.27344C15.2734 2.36566 12.9078 0 10 0ZM10 9.375C7.7384 9.375 5.89844 7.53504 5.89844 5.27344C5.89844 3.01184 7.7384 1.17188 10 1.17188C12.2616 1.17188 14.1016 3.01184 14.1016 5.27344C14.1016 7.53504 12.2616 9.375 10 9.375Z" fill="#92949F"></path>
|
||||||
|
<path d="M16.5612 13.992C15.1174 12.5261 13.2035 11.7188 11.1719 11.7188H8.82812C6.79656 11.7188 4.88258 12.5261 3.43883 13.992C2.00215 15.4507 1.21094 17.3763 1.21094 19.4141C1.21094 19.7377 1.47328 20 1.79688 20H18.2031C18.5267 20 18.7891 19.7377 18.7891 19.4141C18.7891 17.3763 17.9979 15.4507 16.5612 13.992ZM2.40859 18.8281C2.70215 15.5045 5.46918 12.8906 8.82812 12.8906H11.1719C14.5308 12.8906 17.2979 15.5045 17.5914 18.8281H2.40859Z" fill="#92949F"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="input-block mb-24">
|
||||||
|
<input type="text" v-model="secondName" class="form-control form-control-3" :placeholder="currentLanguage == 'zh' ? '姓氏' : 'Last Name'">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 20 20" fill="none">
|
||||||
|
<path d="M10 0C7.09223 0 4.72656 2.36566 4.72656 5.27344C4.72656 8.18121 7.09223 10.5469 10 10.5469C12.9078 10.5469 15.2734 8.18121 15.2734 5.27344C15.2734 2.36566 12.9078 0 10 0ZM10 9.375C7.7384 9.375 5.89844 7.53504 5.89844 5.27344C5.89844 3.01184 7.7384 1.17188 10 1.17188C12.2616 1.17188 14.1016 3.01184 14.1016 5.27344C14.1016 7.53504 12.2616 9.375 10 9.375Z" fill="#92949F"></path>
|
||||||
|
<path d="M16.5612 13.992C15.1174 12.5261 13.2035 11.7188 11.1719 11.7188H8.82812C6.79656 11.7188 4.88258 12.5261 3.43883 13.992C2.00215 15.4507 1.21094 17.3763 1.21094 19.4141C1.21094 19.7377 1.47328 20 1.79688 20H18.2031C18.5267 20 18.7891 19.7377 18.7891 19.4141C18.7891 17.3763 17.9979 15.4507 16.5612 13.992ZM2.40859 18.8281C2.70215 15.5045 5.46918 12.8906 8.82812 12.8906H11.1719C14.5308 12.8906 17.2979 15.5045 17.5914 18.8281H2.40859Z" fill="#92949F"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="input-block mb-24">
|
||||||
|
<input type="text" v-model="contactObj.email" class="form-control form-control-3" :placeholder="currentLanguage == 'zh' ? '你的郵箱' : 'Your Email' ">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 20 20" fill="none">
|
||||||
|
<path d="M18.2422 2.96875H1.75781C0.786602 2.96875 0 3.76023 0 4.72656V15.2734C0 16.2455 0.792383 17.0312 1.75781 17.0312H18.2422C19.2053 17.0312 20 16.2488 20 15.2734V4.72656C20 3.76195 19.2165 2.96875 18.2422 2.96875ZM17.996 4.14062C17.6369 4.49785 11.4564 10.6458 11.243 10.8581C10.9109 11.1901 10.4695 11.3729 10 11.3729C9.53047 11.3729 9.08906 11.1901 8.75594 10.857C8.61242 10.7142 2.50012 4.63414 2.00398 4.14062H17.996ZM1.17188 15.0349V4.96582L6.23586 10.0031L1.17188 15.0349ZM2.00473 15.8594L7.06672 10.8296L7.9284 11.6867C8.48176 12.2401 9.21746 12.5448 10 12.5448C10.7825 12.5448 11.5182 12.2401 12.0705 11.6878L12.9333 10.8296L17.9953 15.8594H2.00473ZM18.8281 15.0349L13.7641 10.0031L18.8281 4.96582V15.0349Z" fill="#92949F"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="input-block mb-24">
|
||||||
|
<textarea v-model="contactObj.contact" cols="30" rows="5" class="form-control form-control-3" :placeholder="currentLanguage == 'zh' ? '留言' : 'Write Your Message' "></textarea>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 20 20" fill="none">
|
||||||
|
<path d="M19.3774 2.43355L17.5651 0.621049C16.737 -0.207036 15.3897 -0.206997 14.5616 0.621049C13.782 1.40077 1.87359 13.3101 1.07777 14.1059C0.993003 14.1907 0.936206 14.3034 0.915971 14.4136L0.00980134 19.3073C-0.0253158 19.497 0.0351529 19.6919 0.171598 19.8284C0.308199 19.965 0.503121 20.0253 0.692613 19.9902L5.58592 19.0839C5.69901 19.0628 5.81018 19.0055 5.89354 18.9221L19.3774 5.43717C20.2074 4.60717 20.2075 3.26366 19.3774 2.43355ZM1.31722 18.6826L1.86538 15.7223L4.27733 18.1344L1.31722 18.6826ZM5.47924 17.6791L2.3207 14.5203L13.8523 2.9878L17.0109 6.14658L5.47924 17.6791ZM18.5488 4.60854L17.8395 5.31795L14.6809 2.15917L15.3902 1.44976C15.7614 1.07859 16.3652 1.07855 16.7364 1.44976L18.5488 3.26225C18.9209 3.63432 18.9209 4.23643 18.5488 4.60854Z" fill="#92949F"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-12">
|
||||||
|
<button @click="sendContact" class="cus-btn-3">
|
||||||
|
<span>{{ currentLanguage == "zh" ? "發送信息" : "Send Message" }}</span>
|
||||||
|
<span>{{ currentLanguage == "zh" ? "發送信息" : "Send Message" }}</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<!-- CONTACT PAGE END -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- BG-CONTACT PAGE # 1 END -->
|
||||||
|
|
||||||
|
<!-- FOOTER START -->
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- FOOTER END -->
|
||||||
|
<!-- 錢包選擇彈窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 錢包地址彈窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
<!-- Main Wrapper End -->
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
<script src="static/js/jquery-validator.js"></script>
|
||||||
|
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻譯文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 獲取用戶信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
<!-- 引入 Vue.js -->
|
||||||
|
<script src="static/js/vue.js" ></script>
|
||||||
|
<!-- 引入 axios -->
|
||||||
|
<script src="static/js/axios.min.js"></script>
|
||||||
|
<!-- 引入 Element UI JS -->
|
||||||
|
<script src="static/js/element-ui.js"></script>
|
||||||
|
<script>
|
||||||
|
// 創建一個增強版的 localStorage
|
||||||
|
const enhancedStorage = {
|
||||||
|
setItem: function (key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
// 觸發自定義事件
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
getItem: function (key) {
|
||||||
|
return localStorage.getItem(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 替換原始的 setItem 方法
|
||||||
|
const originalSetItem = localStorage.setItem;
|
||||||
|
localStorage.setItem = function (key, value) {
|
||||||
|
originalSetItem.call(localStorage, key, value);
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
new Vue({
|
||||||
|
el: "#app",
|
||||||
|
data(){
|
||||||
|
return{
|
||||||
|
userToken:"",
|
||||||
|
firstName:"",
|
||||||
|
secondName:"",
|
||||||
|
contactObj:{
|
||||||
|
name:"",
|
||||||
|
email:"",
|
||||||
|
contact:""
|
||||||
|
},
|
||||||
|
// 錢包登錄開始
|
||||||
|
userMoneyAdressAll:"",
|
||||||
|
showMoneyAdress:false,
|
||||||
|
hasAdress:false,
|
||||||
|
moneyTipMessage:"",
|
||||||
|
selectMoney:{},
|
||||||
|
wallets: [
|
||||||
|
{
|
||||||
|
name: 'MetaMask',
|
||||||
|
icon: 'static/metamask.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'TokenPocket',
|
||||||
|
icon: 'static/tokenpocket.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'OKX Wallet',
|
||||||
|
icon: 'static/okx-wallet.png'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
moneyDialogVisible: false,
|
||||||
|
userIsLogin: false,
|
||||||
|
userMoneyAdress: "",
|
||||||
|
// 錢包登錄結尾
|
||||||
|
currentLanguage: localStorage.getItem('languageNow') || 'en',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async created(){
|
||||||
|
const user = window.localStorage.getItem("userInfo")
|
||||||
|
user && (this.userToken = JSON.parse(user)?.token)
|
||||||
|
if (user) {
|
||||||
|
this.userIsLogin = true;
|
||||||
|
}
|
||||||
|
// 錢包登錄開始
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let accounts1 = [];
|
||||||
|
let accounts2 = [];
|
||||||
|
let accounts3 = [];
|
||||||
|
if(provider){
|
||||||
|
accounts1 = await provider.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
accounts2 = await window.tokenpocket.ethereum.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum?.isOKExWallet)){
|
||||||
|
accounts3 = await window.okxwallet.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
console.log(accounts1,accounts2,accounts3,'see');
|
||||||
|
let _adressM = accounts1[0] || accounts2[0] || accounts3[0];
|
||||||
|
if(_adressM){
|
||||||
|
this.userMoneyAdressAll = _adressM;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
}
|
||||||
|
// 錢包登錄結尾
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('localStorageChange', (event) => {
|
||||||
|
if (event.detail.key === 'languageNow') {
|
||||||
|
this.currentLanguage = event.detail.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
sendContact(){
|
||||||
|
let _that = this;
|
||||||
|
let tipMessage = this.currentLanguage == 'zh' ? '請輸入完整信息' : "Please enter complete information";
|
||||||
|
if(!this.firstName || !this.secondName || !this.contactObj.email || !this.contactObj.contact){
|
||||||
|
this.$message.error(tipMessage)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.contactObj.name = this.firstName + this.secondName;
|
||||||
|
$.ajax({
|
||||||
|
url:`${baseUrl}api/common/contactus`,
|
||||||
|
data:{
|
||||||
|
..._that.contactObj
|
||||||
|
},
|
||||||
|
headers:{
|
||||||
|
token: this.userToken
|
||||||
|
},
|
||||||
|
type:"post",
|
||||||
|
success(res){
|
||||||
|
if(res.code === 1){
|
||||||
|
_that.firstName = "";
|
||||||
|
_that.secondName = "";
|
||||||
|
_that.contactObj = {};
|
||||||
|
_that.$message.success("success");
|
||||||
|
}else{
|
||||||
|
_that.$message.error("failed");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error(err){
|
||||||
|
_that.$message.error("failed");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// <-- -------------------------錢包登錄開始 --------------------------->
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
allMoney(){
|
||||||
|
this.showMoneyAdress = true;
|
||||||
|
},
|
||||||
|
userMoneyAdressOptions(adress){
|
||||||
|
if(adress){
|
||||||
|
return adress
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moneyTip(txt){
|
||||||
|
if(txt){
|
||||||
|
return txt
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '請選擇連接錢包' : 'Please choose to connect the wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectWallet(wallet) {
|
||||||
|
this.selectMoney = {};
|
||||||
|
if(wallet.name == 'MetaMask') {
|
||||||
|
if(window.web3?.currentProvider){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'MetaMask未安裝' : 'MetaMask not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wallet.name == 'TokenPocket') {
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'TokenPocket未安裝' : 'TokenPocket not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(wallet.name == "OKX Wallet"){
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum.isOKExWallet)){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? '歐易錢包未安裝' : 'OKX Wallet not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(walletType){
|
||||||
|
let account = "";
|
||||||
|
try {
|
||||||
|
if (walletType == 'MetaMask') {
|
||||||
|
const provider = window.web3.currentProvider;
|
||||||
|
const accounts = await provider.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = accounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'TokenPocket') {
|
||||||
|
const tpAccounts = await window.tokenpocket.ethereum.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = tpAccounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'OKX Wallet') {
|
||||||
|
const okxAccounts = await window.okxwallet.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = okxAccounts[0];
|
||||||
|
}
|
||||||
|
console.log(account,'xxaa');
|
||||||
|
let _adressM = account;
|
||||||
|
this.userMoneyAdressAll = account;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
this.moneyDialogVisible = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toConnectWallet() {
|
||||||
|
if(this.userMoneyAdress){
|
||||||
|
if(this.isShowSale){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.hasAdress = !this.hasAdress;
|
||||||
|
return
|
||||||
|
};
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},
|
||||||
|
//<-- -------------------------錢包登錄結尾 --------------------------->
|
||||||
|
mobileLang(){
|
||||||
|
this.currentLanguage = mobileLang()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
418
game-detail.html
Normal file
418
game-detail.html
Normal file
@ -0,0 +1,418 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
<link rel="stylesheet" href="static/js/element-ui-min.css">
|
||||||
|
<style>
|
||||||
|
.abouut_container h4{
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.game-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 5vh;
|
||||||
|
margin-bottom: 3vh;
|
||||||
|
background: white;
|
||||||
|
padding: 4vh;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-icon {
|
||||||
|
height: 20vh;
|
||||||
|
border-radius: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-info h1 {
|
||||||
|
margin: 0;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-info p {
|
||||||
|
margin: 5px 0;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide-section >div{
|
||||||
|
background: white;
|
||||||
|
padding: 5vh;
|
||||||
|
border-radius: 10px;
|
||||||
|
margin-top: 3vh;
|
||||||
|
}
|
||||||
|
.guide-section h4{
|
||||||
|
height: 10vh;
|
||||||
|
line-height: 10vh;
|
||||||
|
background: url(./static/ui/title_line.png) no-repeat bottom;
|
||||||
|
background-size: 100% 10%;
|
||||||
|
}
|
||||||
|
.guide-item {
|
||||||
|
margin-bottom: 24px;
|
||||||
|
padding-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide-item:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
margin-bottom: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide-item h3 {
|
||||||
|
color: #1a73e8;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide-item p {
|
||||||
|
margin: 8px 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
|
||||||
|
<!-- Preloader-->
|
||||||
|
<div id="preloader">
|
||||||
|
<div class="pyramid-loader">
|
||||||
|
<div class="wrapper">
|
||||||
|
<span class="side side1"></span>
|
||||||
|
<span class="side side2"></span>
|
||||||
|
<span class="side side3"></span>
|
||||||
|
<span class="side side4"></span>
|
||||||
|
<span class="shadow"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Preloader-->
|
||||||
|
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="app" v-cloak>
|
||||||
|
|
||||||
|
<!-- HEADER MENU START -->
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<!-- HEADER MENU END -->
|
||||||
|
|
||||||
|
<div style="background-color: #F2F2F2; padding: 10vh;">
|
||||||
|
<div class="abouut_container">
|
||||||
|
<div class="game-header">
|
||||||
|
<img :src="baseUrl + gamesinfomation.gameicon" alt="" class="game-icon">
|
||||||
|
<div class="game-info">
|
||||||
|
<h4>{{currentLanguage == 'zh' ? gamesinfomation.gametitlecn : gamesinfomation.gametitleen}}</h4>
|
||||||
|
<p style="margin-top: 3vh;" v-html="currentLanguage == 'zh' ? gamesinfomation.gamesubtitlecn : gamesinfomation.gamesubtitleen"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="guide-section">
|
||||||
|
<h4>{{currentLanguage == 'zh' ? "新手指南" : "Beginner's Guide"}}</h4>
|
||||||
|
<div>
|
||||||
|
<div class="guide-item" v-html="currentLanguage == 'zh' ? gamesinfomation.beginnerguidecn : gamesinfomation.beginnerguideen"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="guide-section">
|
||||||
|
<h4>{{currentLanguage == 'zh' ? "高級指南" : "Advanced Guide"}}</h4>
|
||||||
|
<div>
|
||||||
|
<div class="guide-item" v-html="currentLanguage == 'zh' ? gamesinfomation.advanceguidecn : gamesinfomation.advanceguideen"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- FOOTER START -->
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- FOOTER END -->
|
||||||
|
<!-- 钱包选择弹窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 钱包地址弹窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
<!-- Main Wrapper End -->
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻译文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 获取用户信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
<script src="static/js/axios.min.js"></script>
|
||||||
|
<!-- 引入 Vue.js -->
|
||||||
|
<script src="static/js/vue.js" ></script>
|
||||||
|
<!-- 引入 Element UI JS -->
|
||||||
|
<script src="static/js/element-ui.js"></script>
|
||||||
|
<script>
|
||||||
|
// 創建一個增強版的 localStorage
|
||||||
|
const enhancedStorage = {
|
||||||
|
setItem: function (key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
// 觸發自定義事件
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
getItem: function (key) {
|
||||||
|
return localStorage.getItem(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 替換原始的 setItem 方法
|
||||||
|
const originalSetItem = localStorage.setItem;
|
||||||
|
localStorage.setItem = function (key, value) {
|
||||||
|
originalSetItem.call(localStorage, key, value);
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
new Vue({
|
||||||
|
el:"#app",
|
||||||
|
data(){
|
||||||
|
return{
|
||||||
|
// 钱包登录开始
|
||||||
|
userMoneyAdressAll:"",
|
||||||
|
showMoneyAdress:false,
|
||||||
|
hasAdress:false,
|
||||||
|
moneyTipMessage:"",
|
||||||
|
selectMoney:{},
|
||||||
|
wallets: [
|
||||||
|
{
|
||||||
|
name: 'MetaMask',
|
||||||
|
icon: 'static/metamask.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'TokenPocket',
|
||||||
|
icon: 'static/tokenpocket.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'OKX Wallet',
|
||||||
|
icon: 'static/okx-wallet.png'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
moneyDialogVisible: false,
|
||||||
|
userIsLogin: false,
|
||||||
|
userMoneyAdress: "",
|
||||||
|
// 钱包登录结尾
|
||||||
|
currentLanguage: localStorage.getItem('languageNow') || 'en',
|
||||||
|
gamesinfomation:{},
|
||||||
|
baseUrl,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async created(){
|
||||||
|
const user = window.localStorage.getItem("userInfo")
|
||||||
|
if (user) {
|
||||||
|
this.userIsLogin = true;
|
||||||
|
}
|
||||||
|
this.getgamesInfo();
|
||||||
|
// 钱包登录开始
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let accounts1 = [];
|
||||||
|
let accounts2 = [];
|
||||||
|
let accounts3 = [];
|
||||||
|
if(provider){
|
||||||
|
accounts1 = await provider.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
accounts2 = await window.tokenpocket.ethereum.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum?.isOKExWallet)){
|
||||||
|
accounts3 = await window.okxwallet.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
console.log(accounts1,accounts2,accounts3,'see');
|
||||||
|
let _adressM = accounts1[0] || accounts2[0] || accounts3[0];
|
||||||
|
if(_adressM){
|
||||||
|
this.userMoneyAdressAll = _adressM;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
}
|
||||||
|
// 钱包登录结尾
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('localStorageChange', (event) => {
|
||||||
|
if (event.detail.key === 'languageNow') {
|
||||||
|
this.currentLanguage = event.detail.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.getgamesInfo();
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
// <-- -------------------------钱包登录开始 --------------------------->
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
allMoney(){
|
||||||
|
this.showMoneyAdress = true;
|
||||||
|
},
|
||||||
|
userMoneyAdressOptions(adress){
|
||||||
|
if(adress){
|
||||||
|
return adress
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moneyTip(txt){
|
||||||
|
if(txt){
|
||||||
|
return txt
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '請選擇連接錢包' : 'Please choose to connect the wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectWallet(wallet) {
|
||||||
|
this.selectMoney = {};
|
||||||
|
if(wallet.name == 'MetaMask') {
|
||||||
|
if(window.web3?.currentProvider){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'MetaMask未安裝' : 'MetaMask not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wallet.name == 'TokenPocket') {
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'TokenPocket未安裝' : 'TokenPocket not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(wallet.name == "OKX Wallet"){
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum.isOKExWallet)){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? '欧易钱包未安装' : 'OKX Wallet not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(walletType){
|
||||||
|
let account = "";
|
||||||
|
try {
|
||||||
|
if (walletType == 'MetaMask') {
|
||||||
|
const provider = window.web3.currentProvider;
|
||||||
|
const accounts = await provider.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = accounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'TokenPocket') {
|
||||||
|
const tpAccounts = await window.tokenpocket.ethereum.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = tpAccounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'OKX Wallet') {
|
||||||
|
const okxAccounts = await window.okxwallet.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = okxAccounts[0];
|
||||||
|
}
|
||||||
|
console.log(account,'xxaa');
|
||||||
|
let _adressM = account;
|
||||||
|
this.userMoneyAdressAll = account;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
this.moneyDialogVisible = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toConnectWallet() {
|
||||||
|
if(this.userMoneyAdress){
|
||||||
|
if(this.isShowSale){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.hasAdress = !this.hasAdress;
|
||||||
|
return
|
||||||
|
};
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},
|
||||||
|
//<-- -------------------------钱包登录结尾 --------------------------->
|
||||||
|
mobileLang(){
|
||||||
|
this.currentLanguage = mobileLang()
|
||||||
|
},
|
||||||
|
async getgamesInfo(){
|
||||||
|
let res = await axios.get(baseUrl+"api/index/gameinfo");
|
||||||
|
if(res.data.code == 1){
|
||||||
|
this.gamesinfomation = res.data.data;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
1039
index.html
Normal file
1039
index.html
Normal file
File diff suppressed because it is too large
Load Diff
616
login.html
Normal file
616
login.html
Normal file
@ -0,0 +1,616 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
<meta http-equiv="Cross-Origin-Opener-Policy" content="same-origin-allow-popups">
|
||||||
|
<!-- <meta name="google-signin-client_id" content="690739106236-0fes19um1auc9tknfetrlmbg41m1tm15.apps.googleusercontent.com"> -->
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
<link rel="stylesheet" href="static/js/element-ui-min.css">
|
||||||
|
<script src="https://accounts.google.com/gsi/client" async defer></script>
|
||||||
|
<style>
|
||||||
|
.pro_txt{
|
||||||
|
height: 5vh;
|
||||||
|
margin-bottom: 3vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 10px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 2px solid #99B1FF;
|
||||||
|
border-radius: 33px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.pro_txt input{
|
||||||
|
flex: 1;
|
||||||
|
height: 100%;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
.pro_txt img{
|
||||||
|
height: 50%;
|
||||||
|
margin: 0 10px;
|
||||||
|
}
|
||||||
|
.signup_page{
|
||||||
|
background: url(./static/picture/sign_bg.png) no-repeat;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.signup_page_img{
|
||||||
|
width: 50%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.signup_page_img img{
|
||||||
|
position: absolute;
|
||||||
|
width: 70%;
|
||||||
|
bottom: 14%;
|
||||||
|
}
|
||||||
|
.signup_page_login{
|
||||||
|
width: 50%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.signup_box{
|
||||||
|
width: 60%;
|
||||||
|
height: 70%;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 30px;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 20%;
|
||||||
|
left: 20%;
|
||||||
|
padding: 10%;
|
||||||
|
}
|
||||||
|
.signup_box h5{
|
||||||
|
color: #446FFA;
|
||||||
|
margin-bottom: 10%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.send_code{
|
||||||
|
width: 35%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: #446FFA;
|
||||||
|
border-radius: 33px;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.pro_txt_btn{
|
||||||
|
margin-top: 15%;
|
||||||
|
padding: 1vh 0;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 33px;
|
||||||
|
background-color: #446FFA;
|
||||||
|
color: #fff;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.el-dialog{
|
||||||
|
border-radius: 10px !important;
|
||||||
|
}
|
||||||
|
.dialog_txt{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
.dialog_title{
|
||||||
|
height: 40px;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
.el-dialog__header{
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
.sub_dialog{
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
margin-left: 30px;
|
||||||
|
}
|
||||||
|
.sub_dialog .pro_txt_btn{
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="app" v-cloak>
|
||||||
|
|
||||||
|
<!-- HEADER MENU START -->
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<!-- HEADER MENU END -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BG-SIGN*UP PAGE # 1 START -->
|
||||||
|
<div class="signup_page">
|
||||||
|
<div class="signup_page_img">
|
||||||
|
<img src="static/picture/signup-image.png" alt="">
|
||||||
|
</div>
|
||||||
|
<div class="signup_page_login">
|
||||||
|
<div class="signup_box">
|
||||||
|
<h5>{{currentLanguage == 'zh' ? '歡迎登錄' : 'Welcome to log in'}}</h5>
|
||||||
|
<div class="pro_txt">
|
||||||
|
<img src="static/ui/user.png" alt="">
|
||||||
|
<input type="text" v-model="userobj.account" :placeholder="currentLanguage == 'zh' ? '請輸入郵箱':'Please enter your email address'" >
|
||||||
|
</div>
|
||||||
|
<div class="pro_txt">
|
||||||
|
<img src="static/ui/pwd.png" alt="">
|
||||||
|
<input type="password" v-model="userobj.password" :placeholder="currentLanguage == 'zh' ? '請輸入密碼':'Please enter your password'" >
|
||||||
|
</div>
|
||||||
|
<div class="pro_txt" style="padding-right: 0;">
|
||||||
|
<input type="password" v-model="userobj.googleauthcode" :placeholder="currentLanguage == 'zh' ? '請輸入谷歌驗證碼':'Please enter the Google verification code'" >
|
||||||
|
<button class="send_code" v-if="showtimer">{{beginnum + 's'}}</button>
|
||||||
|
<button class="send_code" v-else @click="getregcode">{{currentLanguage == 'zh' ? '發送驗證碼': 'Send code'}}</button>
|
||||||
|
</div>
|
||||||
|
<button class="pro_txt_btn" @click="pageLogin">{{currentLanguage == 'zh' ? '登錄':'Login'}}</button>
|
||||||
|
<div class="input-block text-center mb-12" style="margin-top: 2vh;">
|
||||||
|
<p>or</p>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="row row-gap-4 mb-48"
|
||||||
|
style="
|
||||||
|
justify-content: center;
|
||||||
|
border: 2px solid #446FFA;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 33px;
|
||||||
|
margin-top: 2vh;
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<div style="display: flex;justify-content: center;align-items: center;padding: 2% 0;">
|
||||||
|
<a href="javascript:void(0);" onclick="googleLoginBtn()" class="media-link">
|
||||||
|
{{currentLanguage == 'zh' ? '使用谷歌登錄':'Use Google login'}}
|
||||||
|
<img src="static/picture/google-icon.png" alt="" style="margin-left: 10px;">
|
||||||
|
</a>
|
||||||
|
<div id="g_id_onload"
|
||||||
|
data-client_id="690739106236-0fes19um1auc9tknfetrlmbg41m1tm15.apps.googleusercontent.com"
|
||||||
|
data-login_uri="https://www.samsaradao.com"
|
||||||
|
data-auto_prompt="false">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- BG-SIGN*UP PAGE # 1 END -->
|
||||||
|
|
||||||
|
<!-- FOOTER START -->
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- FOOTER END -->
|
||||||
|
<el-dialog :visible.sync="dialogFormVisible" width="500px" :close-on-click-modal="false">
|
||||||
|
|
||||||
|
<div class="dialog_box">
|
||||||
|
<div class="dialog_title"></div>
|
||||||
|
<div class="dialog_txt">
|
||||||
|
<div class="sub_dialog">
|
||||||
|
<div class="pro_txt">
|
||||||
|
<input type="password" v-model="googleCode" :placeholder="currentLanguage == 'zh' ? '請輸入谷歌驗證碼':'Please enter the Google verification code'" >
|
||||||
|
</div>
|
||||||
|
<button class="pro_txt_btn" @click="googleCodeLogin">{{currentLanguage == 'zh' ? '登錄':'Login'}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 钱包选择弹窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 钱包地址弹窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Main Wrapper End -->
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
<script src="static/js/jquery-validator.js"></script>
|
||||||
|
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻譯文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 獲取用戶信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
<!-- 引入 Vue.js -->
|
||||||
|
<script src="static/js/vue.js" ></script>
|
||||||
|
<!-- 引入 axios -->
|
||||||
|
<script src="static/js/axios.min.js"></script>
|
||||||
|
<!-- 引入 Element UI JS -->
|
||||||
|
<script src="static/js/element-ui.js"></script>
|
||||||
|
<script>
|
||||||
|
let isGoogleBtn = false
|
||||||
|
window.onload = function() {
|
||||||
|
google.accounts.id.initialize({
|
||||||
|
client_id: "690739106236-0fes19um1auc9tknfetrlmbg41m1tm15.apps.googleusercontent.com", // 替換為你的客戶端ID
|
||||||
|
callback: handleCredentialResponse
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function handleCredentialResponse(res) {
|
||||||
|
$.ajax({
|
||||||
|
url:baseUrl+"api/user/onekeylogin",
|
||||||
|
type:"post",
|
||||||
|
data:{
|
||||||
|
id_token:res.credential
|
||||||
|
},
|
||||||
|
success(res){
|
||||||
|
$vm.googleSuccess(res.data.email);
|
||||||
|
},
|
||||||
|
error(err){
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
function googleLoginBtn(){
|
||||||
|
google.accounts.id.prompt();
|
||||||
|
isGoogleBtn = true
|
||||||
|
}
|
||||||
|
// 創建一個增強版的 localStorage
|
||||||
|
const enhancedStorage = {
|
||||||
|
setItem: function (key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
// 觸發自定義事件
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
getItem: function (key) {
|
||||||
|
return localStorage.getItem(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 替換原始的 setItem 方法
|
||||||
|
const originalSetItem = localStorage.setItem;
|
||||||
|
localStorage.setItem = function (key, value) {
|
||||||
|
originalSetItem.call(localStorage, key, value);
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
var $vm = new Vue({
|
||||||
|
el: "#app",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 钱包登录开始
|
||||||
|
userMoneyAdressAll:"",
|
||||||
|
showMoneyAdress:false,
|
||||||
|
hasAdress:false,
|
||||||
|
moneyTipMessage:"",
|
||||||
|
selectMoney:{},
|
||||||
|
wallets: [
|
||||||
|
{
|
||||||
|
name: 'MetaMask',
|
||||||
|
icon: 'static/metamask.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'TokenPocket',
|
||||||
|
icon: 'static/tokenpocket.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'OKX Wallet',
|
||||||
|
icon: 'static/okx-wallet.png'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
moneyDialogVisible: false,
|
||||||
|
userIsLogin: false,
|
||||||
|
userMoneyAdress: "",
|
||||||
|
// 钱包登录结尾
|
||||||
|
currentLanguage: localStorage.getItem('languageNow') || 'en',
|
||||||
|
userobj:{},
|
||||||
|
dialogFormVisible:false,
|
||||||
|
googleErwei:"",
|
||||||
|
googleCode:"",
|
||||||
|
returnGoogleEmail:"",
|
||||||
|
googleTip:"",
|
||||||
|
showtimer:false,
|
||||||
|
codetimer:null,
|
||||||
|
beginnum:60,
|
||||||
|
isClickBtn:false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async created(){
|
||||||
|
const user = window.localStorage.getItem("userInfo")
|
||||||
|
if (user) {
|
||||||
|
this.userIsLogin = true;
|
||||||
|
}
|
||||||
|
// 钱包登录开始
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let accounts1 = [];
|
||||||
|
let accounts2 = [];
|
||||||
|
let accounts3 = [];
|
||||||
|
if(provider){
|
||||||
|
accounts1 = await provider.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
accounts2 = await window.tokenpocket.ethereum.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum?.isOKExWallet)){
|
||||||
|
accounts3 = await window.okxwallet.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
console.log(accounts1,accounts2,accounts3,'see');
|
||||||
|
let _adressM = accounts1[0] || accounts2[0] || accounts3[0];
|
||||||
|
if(_adressM){
|
||||||
|
this.userMoneyAdressAll = _adressM;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
}
|
||||||
|
// 钱包登录结尾
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('localStorageChange', (event) => {
|
||||||
|
if (event.detail.key === 'languageNow') {
|
||||||
|
this.currentLanguage = event.detail.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
// <-- -------------------------钱包登录开始 --------------------------->
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
allMoney(){
|
||||||
|
this.showMoneyAdress = true;
|
||||||
|
},
|
||||||
|
userMoneyAdressOptions(adress){
|
||||||
|
if(adress){
|
||||||
|
return adress
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moneyTip(txt){
|
||||||
|
if(txt){
|
||||||
|
return txt
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '請選擇連接錢包' : 'Please choose to connect the wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectWallet(wallet) {
|
||||||
|
this.selectMoney = {};
|
||||||
|
if(wallet.name == 'MetaMask') {
|
||||||
|
if(window.web3?.currentProvider){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'MetaMask未安裝' : 'MetaMask not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wallet.name == 'TokenPocket') {
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'TokenPocket未安裝' : 'TokenPocket not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(wallet.name == "OKX Wallet"){
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum.isOKExWallet)){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? '欧易钱包未安装' : 'OKX Wallet not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(walletType){
|
||||||
|
let account = "";
|
||||||
|
try {
|
||||||
|
if (walletType == 'MetaMask') {
|
||||||
|
const provider = window.web3.currentProvider;
|
||||||
|
const accounts = await provider.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = accounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'TokenPocket') {
|
||||||
|
const tpAccounts = await window.tokenpocket.ethereum.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = tpAccounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'OKX Wallet') {
|
||||||
|
const okxAccounts = await window.okxwallet.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = okxAccounts[0];
|
||||||
|
}
|
||||||
|
console.log(account,'xxaa');
|
||||||
|
let _adressM = account;
|
||||||
|
this.userMoneyAdressAll = account;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
this.moneyDialogVisible = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toConnectWallet() {
|
||||||
|
if(this.userMoneyAdress){
|
||||||
|
if(this.isShowSale){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.hasAdress = !this.hasAdress;
|
||||||
|
return
|
||||||
|
};
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},
|
||||||
|
//<-- -------------------------钱包登录结尾 --------------------------->
|
||||||
|
getregcode(){
|
||||||
|
this.isClickBtn = true;
|
||||||
|
this.showtimer = true;
|
||||||
|
this.codetimer = setInterval(()=>{
|
||||||
|
this.beginnum--;
|
||||||
|
if(this.beginnum <= 0){
|
||||||
|
this.beginnum = 60;
|
||||||
|
this.showtimer = false;
|
||||||
|
clearInterval(this.codetimer);
|
||||||
|
}
|
||||||
|
},1000)
|
||||||
|
},
|
||||||
|
mobileLang(){
|
||||||
|
this.currentLanguage = mobileLang()
|
||||||
|
},
|
||||||
|
googleSuccess(googleEmail){
|
||||||
|
let _that = this;
|
||||||
|
_that.returnGoogleEmail = googleEmail;
|
||||||
|
$.ajax({
|
||||||
|
url:"api/user/getgoogleauthurl",
|
||||||
|
type:"post",
|
||||||
|
dataType: "json",
|
||||||
|
data:{
|
||||||
|
email:googleEmail
|
||||||
|
},
|
||||||
|
success: function(res) {
|
||||||
|
_that.googleErwei = res.data;
|
||||||
|
if(!_that.googleErwei){
|
||||||
|
_that.googleTip = _that.currentLanguage == 'zh' ? '請輸入谷歌驗證碼' : 'Please enter the Google verification code';
|
||||||
|
}else{
|
||||||
|
_that.googleTip = _that.currentLanguage == 'zh' ? '掃一掃獲取谷歌驗證碼' : 'Scan to get Google verification code';
|
||||||
|
}
|
||||||
|
_that.dialogFormVisible = true;
|
||||||
|
},
|
||||||
|
error: function(rej){
|
||||||
|
console.log("failed");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
googleCodeLogin(){
|
||||||
|
let _that = this;
|
||||||
|
let message = this.currentLanguage == 'zh' ? '請輸入谷歌驗證碼' : 'Please enter the Google verification code';
|
||||||
|
let message2 = this.currentLanguage == 'zh' ? '請點擊獲取驗證碼' : 'Please click to obtain the verification code';
|
||||||
|
if(!this.googleCode){
|
||||||
|
this.$message.error(message);
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if(!this.isClickBtn && !isGoogleBtn){
|
||||||
|
this.$message.error(message2);
|
||||||
|
return
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url:baseUrl+"api/user/onekeylogin2",
|
||||||
|
type:"post",
|
||||||
|
dataType: "json",
|
||||||
|
data:{
|
||||||
|
email:_that.returnGoogleEmail,
|
||||||
|
googleauthcode:_that.googleCode
|
||||||
|
},
|
||||||
|
success: function(res) {
|
||||||
|
console.log(res);
|
||||||
|
_that.dialogFormVisible = false;
|
||||||
|
window.localStorage.setItem("userInfo",JSON.stringify(res.data.userinfo));
|
||||||
|
setTimeout(()=>{
|
||||||
|
window.location.href = "index.html";
|
||||||
|
},1000)
|
||||||
|
},
|
||||||
|
error: function(rej){
|
||||||
|
console.log("failed");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
pageLogin(){
|
||||||
|
isGoogleBtn = false
|
||||||
|
let _that = this;
|
||||||
|
let message = this.currentLanguage == 'zh' ? '請輸入完整信息' : 'Please enter complete information';
|
||||||
|
if(!this.userobj.account && !this.userobj.password && !this.googleauthcode){
|
||||||
|
this.$message.error(message);
|
||||||
|
return
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url:baseUrl+"api/user/login",
|
||||||
|
type: "post",
|
||||||
|
dataType: "json",
|
||||||
|
data: this.userobj,
|
||||||
|
success: function(res) {
|
||||||
|
if(res.code === 1){
|
||||||
|
_that.$message.success('Login successful!');
|
||||||
|
window.localStorage.setItem("userInfo",JSON.stringify(res.data.userinfo));
|
||||||
|
_that.userobj = {};
|
||||||
|
setTimeout(()=>{
|
||||||
|
window.location.href = "index.html";
|
||||||
|
},1000)
|
||||||
|
}else{
|
||||||
|
_that.$message.error(res.msg);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function(rej){
|
||||||
|
alert("failed")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
401
mechanism.html
Normal file
401
mechanism.html
Normal file
@ -0,0 +1,401 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
<link rel="stylesheet" href="static/js/element-ui-min.css">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.mechanism_page {
|
||||||
|
background-color: #F2F2F2;
|
||||||
|
padding: 6vh;
|
||||||
|
}
|
||||||
|
.mechanism_title{
|
||||||
|
font-weight: 700;
|
||||||
|
height: 8vh;
|
||||||
|
font-size: clamp(34px, 2.031vw, 48px);
|
||||||
|
background: url(./static/ui/title_line.png) no-repeat bottom;
|
||||||
|
background-size: 100% 30%;
|
||||||
|
margin-bottom: 5vh;
|
||||||
|
}
|
||||||
|
.mechanism_txt{
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 4vh;
|
||||||
|
}
|
||||||
|
.txt_box{
|
||||||
|
margin-bottom: 4vh;
|
||||||
|
color: #3A3A3A;
|
||||||
|
}
|
||||||
|
.txt_box .title{
|
||||||
|
padding: 2vh 0;
|
||||||
|
font-weight: 700;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.txt_box .title span{
|
||||||
|
width: 1.5vh;
|
||||||
|
height: 1.5vh;
|
||||||
|
background-color: #446FFA;
|
||||||
|
margin-right: 1vh;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="app" v-cloak>
|
||||||
|
|
||||||
|
<!-- HEADER MENU START -->
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<!-- HEADER MENU END -->
|
||||||
|
|
||||||
|
<!-- BG-SIGN*UP PAGE # 1 START -->
|
||||||
|
<div class="mechanism_page">
|
||||||
|
<div class="mechanism_title">{{currentLanguage == 'zh' ? '輪迴道推廣機制':"Promotion mechanism of Samsara Dao"}}</div>
|
||||||
|
<div class="mechanism_txt">
|
||||||
|
<div class="txt_box">
|
||||||
|
<div class="title"><span></span>{{currentLanguage == 'zh' ? '新人三大獎勵' : 'Three major rewards for newcomers'}}</div>
|
||||||
|
<div>
|
||||||
|
<div>1、{{currentLanguage == 'zh' ? '註冊就送15積分' : 'Register and receive 15 bonus points.'}}</div>
|
||||||
|
<div>2、{{currentLanguage == 'zh' ? '購買NFT再送20積分' : 'Purchase NFT and receive 20 bonus points'}}</div>
|
||||||
|
<div>3、{{currentLanguage == 'zh' ? '註冊有權獲得遊戲推廣獎勵' : 'Registration entitles you to game promotion rewards.'}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="txt_box">
|
||||||
|
<div class="title"><span></span>{{currentLanguage == 'zh' ? 'KOL獎勵' : 'KOL Rewards'}}</div>
|
||||||
|
<div>
|
||||||
|
<div>1) {{currentLanguage == 'zh' ? '推薦註冊送15積分/個' : 'Recommend registration and receive 15 points per item'}}</div>
|
||||||
|
<div>2) {{currentLanguage == 'zh' ? '推薦購買NFT再送20積分/個' : 'Recommend purchasing NFTs and getting 20 bonus points per unit'}}</div>
|
||||||
|
<div>3) {{currentLanguage == 'zh' ? '推薦購買NFT立反10%BNB' : 'Recommend purchasing NFT and get an immediate 10% BNB rebateon commission.'}}</div>
|
||||||
|
<div>4) {{currentLanguage == 'zh' ? '參與推廣達人和排行榜獎勵' : 'Participate in promoting influencers and ranking rewards'}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="txt_box">
|
||||||
|
<div class="title"><span></span>{{currentLanguage == 'zh' ? '推廣達人獎' : 'Promotion Expert Award'}}</div>
|
||||||
|
<div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '推薦購買(3-10)人送500積分+空投1個寶箱' : 'Recommended purchase (3-10) people will receive 500 points and 1 treasure chest airdrop'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '推薦購買(11-20)人送2000積分+空投3個寶箱+空投1個NFT' : 'Recommended purchase: (11-20) people will receive 2000 points+3 treasure chests airdropped+1 NFT airdropped'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '推薦購買(21-50)人送5000積分+空投5個寶箱+空投2個NFT' : 'Recommended purchase (21-50): Get 5000 points+5 treasure chests airdropped+2 NFTs airdropped'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '推薦購買(51-100)人送20000積分+空投10個寶箱+空投5個NFT' : 'Recommended purchase (51-100) people will receive 20000 points+airdrop of 10 treasure chests+airdrop of 5 NFTs'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '推薦購買(101-200)人送50000積分+空投20個寶箱+空投8個NFT' : 'Recommended purchase (101-200): Get 50000 points+airdrop of 20 treasure chests+airdrop of 8 NFTs for free'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '推薦購買(201-500)人送100000積分+空投30個寶箱+空投15個NFT' : 'Recommended purchase (201-500) people will receive 100000 points+airdrop of 30 treasure chests+airdrop of 15 NFTs'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '推薦購買(501以上)人送300000積分+空投50個寶箱+空投30個NFT' : 'Recommended purchases (501 or above) will receive 300000 points, 50 treasure chests airdropped, and 30 NFTs airdropped'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '備註:以上階梯不重複獎勵,比如500以上就是按照最後一檔結算,不包含前面階梯獎勵獎勵' : 'Note: The above tiers do not have duplicate rewards. For example, if the reward is over 500, it will be settled according to the last tier and does not include rewards from the previous tiers'}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="txt_box">
|
||||||
|
<div class="title"><span></span>{{currentLanguage == 'zh' ? '推廣排行榜獎勵' : 'Promotion ranking rewards'}}</div>
|
||||||
|
<div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '第1名 20個BNB+10個NFT+200000積分' : 'First place: 20 BNB+10 NFT+200000 points'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '第2名 15個BNB+7個NFT+150000積分' : '2nd place: 15 BNBs+7 NFTs+150000 points'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '第3名 10個BNB+5個NFT+100000積分' : '3rd place: 10 BNBs+5 NFTs+100000 points'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '第(4-10)名 5個BNB+2個NFT+50000積分' : '5th place (4-10), 5 BNBs+2 NFTs+50000 points'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '第(11-20)名 2個BNB+1個NFT+20000積分' : '2nd place (11-20) 2 BNB+1 NFT+20000 points'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '第(21-50)名 1個BNB+NFT寶箱*3個+10000積分' : 'Place (21-50): 1 BNB+NFT chest * 3+10000 points'}}</div>
|
||||||
|
<div>{{currentLanguage == 'zh' ? '第(51-100)名 0.5個BNB+NFT寶箱*2個+5000積分' : 'Place (51-100): 0.5 BNB+NFT chests * 2+5000 points'}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="color: #8D8D8D;">{{currentLanguage == 'zh' ? '註釋:積分可以兌換AI Agent 生態平臺幣,《輪迴道》是AI Agent 生態引流產品之一;NFT寶箱是《輪迴道》遊戲重要道具;NFT是《輪迴道》遊戲打金的重要裝備。' : 'Note: Points can be exchanged for AI Agent ecological platform coins, and Samsara Dao is one of the AI Agent ecological drainage products; NFT treasure chest is an important item in the game Samsara Dao; NFT is an important equipment for gold mining in the game Samsara Dao.'}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- BG-SIGN*UP PAGE # 1 END -->
|
||||||
|
|
||||||
|
<!-- FOOTER START -->
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- FOOTER END -->
|
||||||
|
<!-- 钱包选择弹窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 钱包地址弹窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
<script src="static/js/jquery-validator.js"></script>
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻譯文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 獲取用戶信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
<!-- 引入 Vue.js -->
|
||||||
|
<script src="static/js/vue.js" ></script>
|
||||||
|
<!-- 引入 axios -->
|
||||||
|
<script src="static/js/axios.min.js"></script>
|
||||||
|
<!-- 引入 Element UI JS -->
|
||||||
|
<script src="static/js/element-ui.js"></script>
|
||||||
|
<script>
|
||||||
|
// 創建一個增強版的 localStorage
|
||||||
|
const enhancedStorage = {
|
||||||
|
setItem: function (key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
// 觸發自定義事件
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
getItem: function (key) {
|
||||||
|
return localStorage.getItem(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 替換原始的 setItem 方法
|
||||||
|
const originalSetItem = localStorage.setItem;
|
||||||
|
localStorage.setItem = function (key, value) {
|
||||||
|
originalSetItem.call(localStorage, key, value);
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
new Vue({
|
||||||
|
el: "#app",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 钱包登录开始
|
||||||
|
userMoneyAdressAll:"",
|
||||||
|
showMoneyAdress:false,
|
||||||
|
hasAdress:false,
|
||||||
|
moneyTipMessage:"",
|
||||||
|
selectMoney:{},
|
||||||
|
wallets: [
|
||||||
|
{
|
||||||
|
name: 'MetaMask',
|
||||||
|
icon: 'static/metamask.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'TokenPocket',
|
||||||
|
icon: 'static/tokenpocket.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'OKX Wallet',
|
||||||
|
icon: 'static/okx-wallet.png'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
moneyDialogVisible: false,
|
||||||
|
userIsLogin: false,
|
||||||
|
userMoneyAdress: "",
|
||||||
|
// 钱包登录结尾
|
||||||
|
currentLanguage: localStorage.getItem('languageNow') || 'en',
|
||||||
|
rewardRules: {},
|
||||||
|
baseUrl,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async created(){
|
||||||
|
const user = window.localStorage.getItem("userInfo")
|
||||||
|
if (user) {
|
||||||
|
this.userIsLogin = true;
|
||||||
|
}
|
||||||
|
// 钱包登录开始
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let accounts1 = [];
|
||||||
|
let accounts2 = [];
|
||||||
|
let accounts3 = [];
|
||||||
|
if(provider){
|
||||||
|
accounts1 = await provider.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
accounts2 = await window.tokenpocket.ethereum.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum?.isOKExWallet)){
|
||||||
|
accounts3 = await window.okxwallet.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
console.log(accounts1,accounts2,accounts3,'see');
|
||||||
|
let _adressM = accounts1[0] || accounts2[0] || accounts3[0];
|
||||||
|
if(_adressM){
|
||||||
|
this.userMoneyAdressAll = _adressM;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
}
|
||||||
|
// 钱包登录结尾
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('localStorageChange', (event) => {
|
||||||
|
if (event.detail.key === 'languageNow') {
|
||||||
|
this.currentLanguage = event.detail.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.getonrules();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// <-- -------------------------钱包登录开始 --------------------------->
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
allMoney(){
|
||||||
|
this.showMoneyAdress = true;
|
||||||
|
},
|
||||||
|
userMoneyAdressOptions(adress){
|
||||||
|
if(adress){
|
||||||
|
return adress
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moneyTip(txt){
|
||||||
|
if(txt){
|
||||||
|
return txt
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '請選擇連接錢包' : 'Please choose to connect the wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectWallet(wallet) {
|
||||||
|
this.selectMoney = {};
|
||||||
|
if(wallet.name == 'MetaMask') {
|
||||||
|
if(window.web3?.currentProvider){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'MetaMask未安裝' : 'MetaMask not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wallet.name == 'TokenPocket') {
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'TokenPocket未安裝' : 'TokenPocket not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(wallet.name == "OKX Wallet"){
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum.isOKExWallet)){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? '欧易钱包未安装' : 'OKX Wallet not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(walletType){
|
||||||
|
let account = "";
|
||||||
|
try {
|
||||||
|
if (walletType == 'MetaMask') {
|
||||||
|
const provider = window.web3.currentProvider;
|
||||||
|
const accounts = await provider.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = accounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'TokenPocket') {
|
||||||
|
const tpAccounts = await window.tokenpocket.ethereum.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = tpAccounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'OKX Wallet') {
|
||||||
|
const okxAccounts = await window.okxwallet.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = okxAccounts[0];
|
||||||
|
}
|
||||||
|
console.log(account,'xxaa');
|
||||||
|
let _adressM = account;
|
||||||
|
this.userMoneyAdressAll = account;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
this.moneyDialogVisible = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toConnectWallet() {
|
||||||
|
if(this.userMoneyAdress){
|
||||||
|
if(this.isShowSale){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.hasAdress = !this.hasAdress;
|
||||||
|
return
|
||||||
|
};
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},
|
||||||
|
//<-- -------------------------钱包登录结尾 --------------------------->
|
||||||
|
mobileLang(){
|
||||||
|
this.currentLanguage = mobileLang()
|
||||||
|
},
|
||||||
|
handleCurrentChange(val) {
|
||||||
|
this.page = val;
|
||||||
|
},
|
||||||
|
async getonrules() {
|
||||||
|
let res = await axios.get(baseUrl+'api/user/getrewardrule');
|
||||||
|
if (res.data.code == 1) {
|
||||||
|
this.rewardRules = res.data.data;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
<style>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</html>
|
376
news-detail.html
Normal file
376
news-detail.html
Normal file
@ -0,0 +1,376 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
<link rel="stylesheet" href="static/js/element-ui-min.css">
|
||||||
|
<style>
|
||||||
|
.news-detail-page{
|
||||||
|
background-color: #F2F2F2;
|
||||||
|
padding: 6vh;
|
||||||
|
}
|
||||||
|
.n_d_title{
|
||||||
|
font-weight: 700;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.n_d_time{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
border-bottom: 1px solid #D3D3D3;
|
||||||
|
border-top: 1px solid #D3D3D3;
|
||||||
|
margin: 5vh 0;
|
||||||
|
padding: 2vh 0;
|
||||||
|
}
|
||||||
|
.n_d_img{
|
||||||
|
margin-bottom: 5vh;
|
||||||
|
}
|
||||||
|
.n_d_img img{
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
.returnnews{
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="app" v-cloak>
|
||||||
|
|
||||||
|
<!-- HEADER MENU START -->
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<!-- HEADER MENU END -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BG-LIVE STREAMS PAGE # 1 START -->
|
||||||
|
<div class="news-detail-page">
|
||||||
|
<h4 class="n_d_title">{{currentLanguage == 'zh' ? readeDetalObj.title_cn : readeDetalObj.title_en}}</h4>
|
||||||
|
<div class="n_d_time">
|
||||||
|
<div>
|
||||||
|
{{currentLanguage == 'zh' ? '發佈時間:' : 'Release time:'}}
|
||||||
|
<span>{{optionsTemp(readeDetalObj.createtime * 1000)}}</span>
|
||||||
|
</div>
|
||||||
|
<a href="news.html" class="returnnews">{{currentLanguage == "zh" ? '< 返回' : '< return'}}</a>
|
||||||
|
</div>
|
||||||
|
<div class="n_d_img">
|
||||||
|
<img :src="baseUrl + currentLanguage == 'zh' ? readeDetalObj.cn_img : readeDetalObj.en_img" alt="">
|
||||||
|
</div>
|
||||||
|
<div class="n_d_txt" v-html="currentLanguage == 'zh' ? readeDetalObj.text_cn : readeDetalObj.text_en"></div>
|
||||||
|
</div>
|
||||||
|
<!-- BG-LIVE STREAMS PAGE # 1 END -->
|
||||||
|
|
||||||
|
<!-- FOOTER START -->
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- FOOTER END -->
|
||||||
|
<!-- 钱包选择弹窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 钱包地址弹窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
<!-- Main Wrapper End -->
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
<script src="static/js/slick.min.js"></script>
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻譯文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 獲取用戶信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
<!-- 引入 Vue.js -->
|
||||||
|
<script src="static/js/vue.js" ></script>
|
||||||
|
<!-- 引入 axios -->
|
||||||
|
<script src="static/js/axios.min.js"></script>
|
||||||
|
<!-- 引入 Moment.js -->
|
||||||
|
<script src="static/js/element-ui.js"></script>
|
||||||
|
<script>
|
||||||
|
// 創建一個增強版的 localStorage
|
||||||
|
const enhancedStorage = {
|
||||||
|
setItem: function (key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
// 觸發自定義事件
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
getItem: function (key) {
|
||||||
|
return localStorage.getItem(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 替換原始的 setItem 方法
|
||||||
|
const originalSetItem = localStorage.setItem;
|
||||||
|
localStorage.setItem = function (key, value) {
|
||||||
|
originalSetItem.call(localStorage, key, value);
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
new Vue({
|
||||||
|
el:"#app",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 钱包登录开始
|
||||||
|
userMoneyAdressAll:"",
|
||||||
|
showMoneyAdress:false,
|
||||||
|
hasAdress:false,
|
||||||
|
moneyTipMessage:"",
|
||||||
|
selectMoney:{},
|
||||||
|
wallets: [
|
||||||
|
{
|
||||||
|
name: 'MetaMask',
|
||||||
|
icon: 'static/metamask.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'TokenPocket',
|
||||||
|
icon: 'static/tokenpocket.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'OKX Wallet',
|
||||||
|
icon: 'static/okx-wallet.png'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
moneyDialogVisible: false,
|
||||||
|
userIsLogin: false,
|
||||||
|
userMoneyAdress: "",
|
||||||
|
// 钱包登录结尾
|
||||||
|
currentLanguage: localStorage.getItem('languageNow') || 'en',
|
||||||
|
readId: "",
|
||||||
|
readeDetalObj: {},
|
||||||
|
baseUrl,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async created() {
|
||||||
|
const user = window.localStorage.getItem("userInfo")
|
||||||
|
if (user) {
|
||||||
|
this.userIsLogin = true;
|
||||||
|
}
|
||||||
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
|
this.readId = urlParams.get('id');
|
||||||
|
// 钱包登录开始
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let accounts1 = [];
|
||||||
|
let accounts2 = [];
|
||||||
|
let accounts3 = [];
|
||||||
|
if(provider){
|
||||||
|
accounts1 = await provider.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
accounts2 = await window.tokenpocket.ethereum.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum?.isOKExWallet)){
|
||||||
|
accounts3 = await window.okxwallet.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
console.log(accounts1,accounts2,accounts3,'see');
|
||||||
|
let _adressM = accounts1[0] || accounts2[0] || accounts3[0];
|
||||||
|
if(_adressM){
|
||||||
|
this.userMoneyAdressAll = _adressM;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
}
|
||||||
|
// 钱包登录结尾
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('localStorageChange', (event) => {
|
||||||
|
if (event.detail.key === 'languageNow') {
|
||||||
|
this.currentLanguage = event.detail.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.getReadDetail();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// <-- -------------------------钱包登录开始 --------------------------->
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
allMoney(){
|
||||||
|
this.showMoneyAdress = true;
|
||||||
|
},
|
||||||
|
userMoneyAdressOptions(adress){
|
||||||
|
if(adress){
|
||||||
|
return adress
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moneyTip(txt){
|
||||||
|
if(txt){
|
||||||
|
return txt
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '請選擇連接錢包' : 'Please choose to connect the wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectWallet(wallet) {
|
||||||
|
this.selectMoney = {};
|
||||||
|
if(wallet.name == 'MetaMask') {
|
||||||
|
if(window.web3?.currentProvider){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'MetaMask未安裝' : 'MetaMask not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wallet.name == 'TokenPocket') {
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'TokenPocket未安裝' : 'TokenPocket not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(wallet.name == "OKX Wallet"){
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum.isOKExWallet)){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? '欧易钱包未安装' : 'OKX Wallet not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(walletType){
|
||||||
|
let account = "";
|
||||||
|
try {
|
||||||
|
if (walletType == 'MetaMask') {
|
||||||
|
const provider = window.web3.currentProvider;
|
||||||
|
const accounts = await provider.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = accounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'TokenPocket') {
|
||||||
|
const tpAccounts = await window.tokenpocket.ethereum.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = tpAccounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'OKX Wallet') {
|
||||||
|
const okxAccounts = await window.okxwallet.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = okxAccounts[0];
|
||||||
|
}
|
||||||
|
console.log(account,'xxaa');
|
||||||
|
let _adressM = account;
|
||||||
|
this.userMoneyAdressAll = account;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
this.moneyDialogVisible = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toConnectWallet() {
|
||||||
|
if(this.userMoneyAdress){
|
||||||
|
if(this.isShowSale){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.hasAdress = !this.hasAdress;
|
||||||
|
return
|
||||||
|
};
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},
|
||||||
|
//<-- -------------------------钱包登录结尾 --------------------------->
|
||||||
|
mobileLang(){
|
||||||
|
this.currentLanguage = mobileLang()
|
||||||
|
},
|
||||||
|
optionsTemp(timestamp) {
|
||||||
|
let date = new Date(timestamp);
|
||||||
|
let Y = date.getFullYear() + '-';
|
||||||
|
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
|
||||||
|
let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate());
|
||||||
|
return Y + M + D;
|
||||||
|
},
|
||||||
|
async getReadDetail() {
|
||||||
|
let res = await axios.get(`
|
||||||
|
${baseUrl}api/index/getdetail?
|
||||||
|
id=${this.readId}
|
||||||
|
`);
|
||||||
|
if (res.data.code === 1) {
|
||||||
|
let news = JSON.stringify(res.data.data);
|
||||||
|
news = news.replaceAll('samsar Dao','Samsara Dao').replaceAll('Samsar Dao','Samsara Dao')
|
||||||
|
this.readeDetalObj = JSON.parse(news)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
443
news.html
Normal file
443
news.html
Normal file
@ -0,0 +1,443 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
<link rel="stylesheet" href="static/js/element-ui-min.css">
|
||||||
|
<style>
|
||||||
|
.news_pages {
|
||||||
|
background-color: #F2F2F2;
|
||||||
|
padding: 6vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new_item {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 5vh;
|
||||||
|
height: 350px;
|
||||||
|
padding: 2vh;
|
||||||
|
box-sizing: border-box;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.new_item:hover{
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 2vh;
|
||||||
|
}
|
||||||
|
.new_item:hover h4{
|
||||||
|
color: #446FFA;
|
||||||
|
}
|
||||||
|
.new_item:hover .to_detail .img_box{
|
||||||
|
background: url(./static/ui/news/yes.png) no-repeat;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new_item h4 {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new_item .new_img {
|
||||||
|
width: 30%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new_item .new_img img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new_item .new_center {
|
||||||
|
margin-left: 5vh;
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new_item .to_detail {
|
||||||
|
width: 10%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new_item .to_detail .img_box{
|
||||||
|
width: 4vh;
|
||||||
|
height: 4vh;
|
||||||
|
background: url(./static/ui/news/no.png) no-repeat;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
.news_pagination{
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
margin-top: 5vh;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="app" v-cloak>
|
||||||
|
|
||||||
|
<!-- HEADER MENU START -->
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<!-- HEADER MENU END -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BG-LIVE STREAMS PAGE # 1 START -->
|
||||||
|
<div class="news_pages">
|
||||||
|
<div
|
||||||
|
v-for="item in categoriesTabList.data"
|
||||||
|
:key="item.id"
|
||||||
|
class="new_item"
|
||||||
|
@click="tonewsdetail(item.id)"
|
||||||
|
>
|
||||||
|
<div class="new_img">
|
||||||
|
<img :src="baseUrl.slice(0,-1)+item.en_img" alt="">
|
||||||
|
</div>
|
||||||
|
<div class="new_center">
|
||||||
|
<h4>{{ currentLanguage == 'zh' ? item.title_cn : item.title_en}}</h4>
|
||||||
|
<p style="margin: 2vh 0;">{{ optionsTemp(item.createtime * 1000) }}</p>
|
||||||
|
<div v-html="currentLanguage == 'zh' ? item.text_cn : item.text_en"></div>
|
||||||
|
</div>
|
||||||
|
<div class="to_detail">
|
||||||
|
<div class="img_box"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="news_pagination">
|
||||||
|
<el-pagination
|
||||||
|
background
|
||||||
|
layout="prev, pager, next"
|
||||||
|
:page-size="6"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
:total="categoriesTabList.total">
|
||||||
|
</el-pagination>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- BG-LIVE STREAMS PAGE # 1 END -->
|
||||||
|
|
||||||
|
<!-- FOOTER START -->
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- FOOTER END -->
|
||||||
|
<!-- 钱包选择弹窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 钱包地址弹窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
<!-- Main Wrapper End -->
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻譯文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 獲取用戶信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
<!-- 引入 Vue.js -->
|
||||||
|
<script src="static/js/vue.js" ></script>
|
||||||
|
<!-- 引入 axios -->
|
||||||
|
<script src="static/js/axios.min.js"></script>
|
||||||
|
<script src="static/js/element-ui.js"></script>
|
||||||
|
<script>
|
||||||
|
// 創建一個增強版的 localStorage
|
||||||
|
const enhancedStorage = {
|
||||||
|
setItem: function (key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
// 觸發自定義事件
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
getItem: function (key) {
|
||||||
|
return localStorage.getItem(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 替換原始的 setItem 方法
|
||||||
|
const originalSetItem = localStorage.setItem;
|
||||||
|
localStorage.setItem = function (key, value) {
|
||||||
|
originalSetItem.call(localStorage, key, value);
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
new Vue({
|
||||||
|
el: "#app",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 钱包登录开始
|
||||||
|
userMoneyAdressAll:"",
|
||||||
|
showMoneyAdress:false,
|
||||||
|
hasAdress:false,
|
||||||
|
moneyTipMessage:"",
|
||||||
|
selectMoney:{},
|
||||||
|
wallets: [
|
||||||
|
{
|
||||||
|
name: 'MetaMask',
|
||||||
|
icon: 'static/metamask.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'TokenPocket',
|
||||||
|
icon: 'static/tokenpocket.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'OKX Wallet',
|
||||||
|
icon: 'static/okx-wallet.png'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
moneyDialogVisible: false,
|
||||||
|
userIsLogin: false,
|
||||||
|
userMoneyAdress: "",
|
||||||
|
// 钱包登录结尾
|
||||||
|
currentLanguage: localStorage.getItem('languageNow') || 'en',
|
||||||
|
categoriesTabList: {},
|
||||||
|
page: 1,
|
||||||
|
listrow: 6,
|
||||||
|
baseUrl,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async created(){
|
||||||
|
const user = window.localStorage.getItem("userInfo")
|
||||||
|
if (user) {
|
||||||
|
this.userIsLogin = true;
|
||||||
|
}
|
||||||
|
// 钱包登录开始
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let accounts1 = [];
|
||||||
|
let accounts2 = [];
|
||||||
|
let accounts3 = [];
|
||||||
|
if(provider){
|
||||||
|
accounts1 = await provider.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
accounts2 = await window.tokenpocket.ethereum.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum?.isOKExWallet)){
|
||||||
|
accounts3 = await window.okxwallet.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
console.log(accounts1,accounts2,accounts3,'see');
|
||||||
|
let _adressM = accounts1[0] || accounts2[0] || accounts3[0];
|
||||||
|
if(_adressM){
|
||||||
|
this.userMoneyAdressAll = _adressM;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
}
|
||||||
|
// 钱包登录结尾
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('localStorageChange', (event) => {
|
||||||
|
if (event.detail.key === 'languageNow') {
|
||||||
|
this.currentLanguage = event.detail.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.getCategoriestable();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// <-- -------------------------钱包登录开始 --------------------------->
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
allMoney(){
|
||||||
|
this.showMoneyAdress = true;
|
||||||
|
},
|
||||||
|
userMoneyAdressOptions(adress){
|
||||||
|
if(adress){
|
||||||
|
return adress
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moneyTip(txt){
|
||||||
|
if(txt){
|
||||||
|
return txt
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '請選擇連接錢包' : 'Please choose to connect the wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectWallet(wallet) {
|
||||||
|
this.selectMoney = {};
|
||||||
|
if(wallet.name == 'MetaMask') {
|
||||||
|
if(window.web3?.currentProvider){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'MetaMask未安裝' : 'MetaMask not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wallet.name == 'TokenPocket') {
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'TokenPocket未安裝' : 'TokenPocket not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(wallet.name == "OKX Wallet"){
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum.isOKExWallet)){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? '欧易钱包未安装' : 'OKX Wallet not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(walletType){
|
||||||
|
let account = "";
|
||||||
|
try {
|
||||||
|
if (walletType == 'MetaMask') {
|
||||||
|
const provider = window.web3.currentProvider;
|
||||||
|
const accounts = await provider.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = accounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'TokenPocket') {
|
||||||
|
const tpAccounts = await window.tokenpocket.ethereum.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = tpAccounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'OKX Wallet') {
|
||||||
|
const okxAccounts = await window.okxwallet.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = okxAccounts[0];
|
||||||
|
}
|
||||||
|
console.log(account,'xxaa');
|
||||||
|
let _adressM = account;
|
||||||
|
this.userMoneyAdressAll = account;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
this.moneyDialogVisible = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toConnectWallet() {
|
||||||
|
if(this.userMoneyAdress){
|
||||||
|
if(this.isShowSale){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.hasAdress = !this.hasAdress;
|
||||||
|
return
|
||||||
|
};
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},
|
||||||
|
//<-- -------------------------钱包登录结尾 --------------------------->
|
||||||
|
mobileLang(){
|
||||||
|
this.currentLanguage = mobileLang()
|
||||||
|
},
|
||||||
|
tonewsdetail(id){
|
||||||
|
window.location.href = `news-detail.html?id=${id}`;
|
||||||
|
},
|
||||||
|
handleCurrentChange(val){
|
||||||
|
this.page = val;
|
||||||
|
this.getCategoriestable();
|
||||||
|
},
|
||||||
|
optionsTemp(timestamp) {
|
||||||
|
let date = new Date(timestamp);
|
||||||
|
let Y = date.getFullYear() + '-';
|
||||||
|
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
|
||||||
|
let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate());
|
||||||
|
return Y + M + D;
|
||||||
|
},
|
||||||
|
async getCategoriestable() {
|
||||||
|
let res = await axios.get(`${baseUrl}api/index/getlist?
|
||||||
|
cateid=3&
|
||||||
|
keywordsen=&
|
||||||
|
keywordscn=&
|
||||||
|
page=${this.page}&
|
||||||
|
listrow=${this.listrow}&
|
||||||
|
`);
|
||||||
|
if (res.data.code === 1) {
|
||||||
|
this.categoriesTabList = res.data.data
|
||||||
|
this.categoriesTabList.data = res.data.data.data.map(item=>{
|
||||||
|
item.sub_en = item.sub_en.replaceAll('samsar Dao','Samsara Dao').replaceAll('Samsar Dao','Samsara Dao')
|
||||||
|
item.title_en = item.title_en.replaceAll('samsar Dao','Samsara Dao').replaceAll('Samsar Dao','Samsara Dao')
|
||||||
|
item.text_en = item.text_en.replaceAll('samsar Dao','Samsara Dao').replaceAll('Samsar Dao','Samsara Dao')
|
||||||
|
return item
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
769
profile.html
Normal file
769
profile.html
Normal file
@ -0,0 +1,769 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
<link rel="stylesheet" href="static/js/element-ui-min.css">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.pro_title{
|
||||||
|
flex: 1;
|
||||||
|
height: 4vh;
|
||||||
|
}
|
||||||
|
.pro_txt{
|
||||||
|
background-color: #DAE2FE;
|
||||||
|
height: 5vh;
|
||||||
|
margin-bottom: 2vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 10px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
width: 70%;
|
||||||
|
}
|
||||||
|
.pro_txt input{
|
||||||
|
flex: 1;
|
||||||
|
height: 100%;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
background-color: #DAE2FE;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.pro_txt .pro_adresss{
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.pro_txt img{
|
||||||
|
width: 3vh;
|
||||||
|
height: 3vh;
|
||||||
|
margin: 0 3%;
|
||||||
|
}
|
||||||
|
.bind_btn{
|
||||||
|
background-color: #446FFA;
|
||||||
|
width: 30%;
|
||||||
|
height: 5vh;
|
||||||
|
line-height: 5vh;
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.copy_img{
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.profile_page{
|
||||||
|
background-color: #F2F2F2;
|
||||||
|
padding: 6vh;
|
||||||
|
}
|
||||||
|
.profile_title{
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
background-color: #446FFA;
|
||||||
|
padding: 1vh 0;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 700;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
.signup-container >div{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
.profile_page .container-fluid{
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
.pro_pagination{
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
align-items: center;
|
||||||
|
margin-top: 4vh;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="app" v-cloak>
|
||||||
|
|
||||||
|
<!-- HEADER MENU START -->
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<!-- HEADER MENU END -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BG-SIGN*UP PAGE # 1 START -->
|
||||||
|
<div class="signup-page profile_page" style="background-color: #fff;">
|
||||||
|
<h4 class="profile_title">{{currentLanguage == 'zh' ? '我的':'profile'}}</h4>
|
||||||
|
<!-- SIGN UP SECTION START -->
|
||||||
|
<section class="signup-wrapper py-80">
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-descriptions size="small" :column="2" :title="currentLanguage ==='en'?'My balance':'我的余额'">
|
||||||
|
<el-descriptions-item label="BNB">
|
||||||
|
<el-row style="width: 100%;">
|
||||||
|
<el-col :span="6" ><label style="font-weight: 600;font-size: 14px; ">{{userInfos?.bnb||'0.00'}}</label></el-col>
|
||||||
|
<el-col :span="16" style="text-align: center;">
|
||||||
|
<!-- <el-button size="small" type="primary" plain>{{currentLanguage ==='zh'?'明細':'Detailed'}}</el-button> -->
|
||||||
|
<el-button :disabled="!userInfos?.token" size="small" type="primary" @click="showCashoutDialog()">{{currentLanguage ==='zh'?'提 現':'Withdrawal'}}</el-button>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="USDT">
|
||||||
|
<el-row style="width: 100%;">
|
||||||
|
<el-col :span="6"><label style="font-weight: 600; font-size: 14px;">0.00</label></el-col>
|
||||||
|
<el-col :span="16" style="text-align: center;">
|
||||||
|
<!-- <el-button size="small" type="primary" plain disabled>{{currentLanguage ==='zh'?'明細':'Detailed'}}</el-button> -->
|
||||||
|
<el-button size="small" type="primary" disabled>{{currentLanguage ==='zh'?'提 現':'Withdrawal'}}</el-button>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24" style="margin-top: 24px;">
|
||||||
|
<el-descriptions size="small" :column="2" :title="currentLanguage ==='en'?'Essential Information':'基本信息'">
|
||||||
|
<el-descriptions-item :label="currentLanguage ==='en'?'nickname':'昵称'">{{userInfos?.nickname}}</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="currentLanguage ==='en'?'NFT':'NFT'">{{userInfos?.money||0}}</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="currentLanguage ==='en'?'Email':'郵箱'">{{userInfos?.email?.replace(/(\w{1})\w+(\w{1})@/g, '$1****$2@')||''}}</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="currentLanguage ==='en'?'Promotion link':'推廣鏈接'">
|
||||||
|
<template v-if="userInfos?.token">
|
||||||
|
<label @click="copyText(userInfos.icode)"> {{baseBindUrl + userInfos?.icode}}</label>
|
||||||
|
<i style="margin-left: 12px; cursor: pointer;" @click="copyText(baseBindUrl + userInfos.icode)" class="el-icon-copy-document"></i>
|
||||||
|
</template>
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="currentLanguage ==='en'?'score':'積分'">{{userInfos?.score||0}}</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="currentLanguage ==='en'?'My invitation code':'我的邀請碼'">
|
||||||
|
<template v-if="userInfos?.token">
|
||||||
|
<label @click="copyText(userInfos.icode)"> {{ userInfos.icode}}</label>
|
||||||
|
<i style="margin-left: 12px; cursor: pointer;" @click="copyText(userInfos.icode)" class="el-icon-copy-document"></i>
|
||||||
|
</template>
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="currentLanguage ==='en'?'NFT Treasure chest':'NFT 寶箱'">{{userInfos?.box||0}}</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="currentLanguage == 'zh' ? '綁定邀請碼':'Bind invitation code'">
|
||||||
|
{{userInfos?.paddress}}
|
||||||
|
<el-input style="width: 45%;" size="mini" placeholder="請輸入邀請碼" v-if="!userInfos?.paddress && userInfos?.token" v-model="bindIcode" class="input-with-select">
|
||||||
|
<el-button slot="append" class="send" size="mini" @click="toBind">{{currentLanguage == 'zh'?'綁 定':'Binding'}}</el-button>
|
||||||
|
</el-input>
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="currentLanguage == 'zh' ? '关联元智算的钱包地址':'Wallet address associated with meta computing power'">
|
||||||
|
{{userInfos?.wallet}}
|
||||||
|
<el-input style="width: 38%;" size="mini" placeholder="請輸入" v-if="!userInfos?.wallet && userInfos?.token" v-model="wallet" class="input-with-select">
|
||||||
|
<el-button :disabled="!wallet" slot="append" class="send" :class="{'disabled':!wallet}" size="mini" @click="toWallet">{{currentLanguage == 'zh'?'提 交':'Submit'}}</el-button>
|
||||||
|
</el-input>
|
||||||
|
</el-descriptions-item>
|
||||||
|
|
||||||
|
</el-descriptions>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24" style="margin-top: 24px;">
|
||||||
|
<el-descriptions size="small" :column="1" :title="currentLanguage ==='zh'?'記錄':'Record'"></el-descriptions>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-row style=" width: 100%;">
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-radio-group v-model="ifications" @change="()=>{ page=1; getonrules()}">
|
||||||
|
<el-radio-button :label="item.value" v-for="item in classIfications" :key="item.value" >{{currentLanguage ==='zh'?item.name_zh:item.name_en}}</el-radio-button>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-table
|
||||||
|
:data="rewardRules.data"
|
||||||
|
:empty-text="currentLanguage == 'zh' ?'暫無數據':'No Data'"
|
||||||
|
style="width: 100%;margin-top: 24px;">
|
||||||
|
<el-table-column
|
||||||
|
:prop="ifications"
|
||||||
|
align="center"
|
||||||
|
:label="changeText()">
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
prop="before"
|
||||||
|
align="center"
|
||||||
|
:label="currentLanguage == 'zh' ?'變動前':'Before the change'">
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
prop="after"
|
||||||
|
align="center"
|
||||||
|
:label="currentLanguage == 'zh' ?'變動後':'After the change'">
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
:prop="currentLanguage == 'zh'?'memo_cn':'memo'"
|
||||||
|
align="center"
|
||||||
|
:label="currentLanguage == 'zh' ?'變動原因':'Reason for change'" >
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
prop="createtime"
|
||||||
|
align="center"
|
||||||
|
:formatter="formatDate"
|
||||||
|
:label="currentLanguage == 'zh' ?'时间':'Date'">
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="24">
|
||||||
|
<div class="pro_pagination">
|
||||||
|
<el-pagination
|
||||||
|
background
|
||||||
|
layout="prev, pager, next"
|
||||||
|
:page-size="10"
|
||||||
|
:current-page.sync="page"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
:total="rewardRules.total">
|
||||||
|
</el-pagination>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</section>
|
||||||
|
<!-- SIGN UP SECTION END -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- BG-SIGN*UP PAGE # 1 END -->
|
||||||
|
<el-dialog size="small" :visible.sync="showDialog" width="600" :before-close="closeDialog" :close-on-click-modal="false">
|
||||||
|
<label slot="title">{{currentLanguage ==='zh'?'提現':'Withdrawal'}}</label>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="22">
|
||||||
|
<el-form ref="form" :rules="rules" :model="cashout" label-width="200px">
|
||||||
|
<el-form-item prop="amount" :label="currentLanguage ==='zh'?'數量:':'Quantity:'">
|
||||||
|
<el-input placeholder="請輸入" v-model="cashout.amount"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item prop="googleauthcode" :label="currentLanguage ==='zh'?'Google驗證碼:':'Google captcha:'">
|
||||||
|
<el-input v-model="cashout.googleauthcode" placeholder="請輸入">
|
||||||
|
<el-button class="send" @click="sendCode" v-if="showSendCodeTimer == 0" slot="append" type="primary">
|
||||||
|
{{currentLanguage ==='zh'?'發送驗證碼':'Send Code'}}
|
||||||
|
</el-button>
|
||||||
|
<el-button class="send" v-else slot="append" type="primary">
|
||||||
|
{{showSendCodeTimer + 's'}}
|
||||||
|
</el-button>
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item prop="emailcode" :label="currentLanguage ==='zh'?'Email驗證碼:':'Email captcha:'">
|
||||||
|
<el-input v-model="cashout.emailcode" placeholder="請輸入">
|
||||||
|
<el-button class="send" :class="{'disabled':emailSending}" :disabled="emailSending" @click="sendCode('e')" slot="append" type="primary">
|
||||||
|
{{currentLanguage ==='zh'?'發送驗證碼':'Send Code'}}
|
||||||
|
</el-button>
|
||||||
|
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item prop="address" :label="currentLanguage ==='zh'?'提幣地址:':'Withdrawal address:'">
|
||||||
|
<el-input v-model="cashout.address" placeholder="請輸入"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="closeDialog"> {{currentLanguage == 'zh' ? '取 消':'Cancel'}}</el-button>
|
||||||
|
<el-button type="primary" @click="submitCashout">{{currentLanguage == 'zh' ? '確 認':'Confirm'}}</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- FOOTER START -->
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- FOOTER END -->
|
||||||
|
<!-- 钱包选择弹窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 钱包地址弹窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
<script src="static/js/jquery-validator.js"></script>
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻譯文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 獲取用戶信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
<!-- 引入 Vue.js -->
|
||||||
|
<script src="static/js/vue.js"></script>
|
||||||
|
<!-- 引入 axios -->
|
||||||
|
<script src="static/js/axios.min.js"></script>
|
||||||
|
<!-- 引入 Element UI JS -->
|
||||||
|
<script src="static/js/element-ui.js"></script>
|
||||||
|
<script src="static/js/moment.min.js"></script>
|
||||||
|
<script>
|
||||||
|
console.log(baseUrl , 8888888)
|
||||||
|
// 創建一個增強版的 localStorage
|
||||||
|
const enhancedStorage = {
|
||||||
|
setItem: function (key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
// 觸發自定義事件
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
getItem: function (key) {
|
||||||
|
return localStorage.getItem(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 替換原始的 setItem 方法
|
||||||
|
const originalSetItem = localStorage.setItem;
|
||||||
|
localStorage.setItem = function (key, value) {
|
||||||
|
originalSetItem.call(localStorage, key, value);
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
new Vue({
|
||||||
|
el: "#app",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 钱包登录开始
|
||||||
|
userMoneyAdressAll:"",
|
||||||
|
showMoneyAdress:false,
|
||||||
|
hasAdress:false,
|
||||||
|
moneyTipMessage:"",
|
||||||
|
selectMoney:{},
|
||||||
|
wallets: [
|
||||||
|
{
|
||||||
|
name: 'MetaMask',
|
||||||
|
icon: 'static/metamask.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'TokenPocket',
|
||||||
|
icon: 'static/tokenpocket.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'OKX Wallet',
|
||||||
|
icon: 'static/okx-wallet.png'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
moneyDialogVisible: false,
|
||||||
|
userIsLogin: false,
|
||||||
|
userMoneyAdress: "",
|
||||||
|
// 钱包登录结尾
|
||||||
|
googleClientId:"103792825870-7mp9kit8p6salsiqp8ov4gpqngqpj82g.apps.googleusercontent.com",
|
||||||
|
currentLanguage: localStorage.getItem('languageNow') || 'en',
|
||||||
|
userInfos:{token:''}, //d966623f-153c-4b46-a675-dad2fa7c8611
|
||||||
|
baseBindUrl:baseUrl+"web/signup.html?icode=",
|
||||||
|
bindIcode:"",
|
||||||
|
rewardRules:{},
|
||||||
|
page: 1,
|
||||||
|
listrow: 10,
|
||||||
|
classIfications:[
|
||||||
|
{name_zh:'積分',name_en:'Score',value:'score'},
|
||||||
|
{name_zh:'錢包',name_en:'Money',value:'money'},
|
||||||
|
{name_zh:'寶箱',name_en:'Treasure chest',value:'box'},
|
||||||
|
{name_zh:'BNB',name_en:'BNB',value:'bnb'}
|
||||||
|
],
|
||||||
|
ifications:'bnb',
|
||||||
|
showDialog:false,
|
||||||
|
cashout:{
|
||||||
|
amount:'0.00000000',
|
||||||
|
googleauthcode:'',
|
||||||
|
address:'',
|
||||||
|
emailcode:'',
|
||||||
|
type:'bnb'
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
amount: [
|
||||||
|
{ required: true, message: '提現數量', trigger: 'blur' },
|
||||||
|
],
|
||||||
|
googleauthcode: [
|
||||||
|
{ required: true, message: 'Google驗證碼', trigger: 'blur' },
|
||||||
|
],
|
||||||
|
address: [
|
||||||
|
{ required: true, message: '提幣地址', trigger: 'blur' },
|
||||||
|
],
|
||||||
|
emailcode: [
|
||||||
|
{ required: true, message: 'Email驗證碼', trigger: 'blur' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
showSendCodeTimer:0,
|
||||||
|
interval:null,
|
||||||
|
emailSending:false,
|
||||||
|
wallet:'',
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async created(){
|
||||||
|
const user = window.localStorage.getItem("userInfo")
|
||||||
|
if (user) {
|
||||||
|
this.userIsLogin = true;
|
||||||
|
}
|
||||||
|
// 钱包登录开始
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let accounts1 = [];
|
||||||
|
let accounts2 = [];
|
||||||
|
let accounts3 = [];
|
||||||
|
if(provider){
|
||||||
|
accounts1 = await provider.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
accounts2 = await window.tokenpocket.ethereum.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum?.isOKExWallet)){
|
||||||
|
accounts3 = await window.okxwallet.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
console.log(accounts1,accounts2,accounts3,'see');
|
||||||
|
let _adressM = accounts1[0] || accounts2[0] || accounts3[0];
|
||||||
|
if(_adressM){
|
||||||
|
this.userMoneyAdressAll = _adressM;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
}
|
||||||
|
// 钱包登录结尾
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('localStorageChange', (event) => {
|
||||||
|
if (event.detail.key === 'languageNow') {
|
||||||
|
this.currentLanguage = event.detail.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// this.userInfos = {token:'dc6f6ec7-4986-4181-b1c4-863d4eba8e91'}
|
||||||
|
let userInfo = window.localStorage.getItem('userInfo')
|
||||||
|
if(userInfo){
|
||||||
|
this.userInfos = JSON.parse(userInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getuserInfos();
|
||||||
|
if(this.currentLanguage =='en'){
|
||||||
|
this.rules.amount[0].message = 'Quantity'
|
||||||
|
this.rules.googleauthcode[0].message = 'Google captcha'
|
||||||
|
this.rules.address[0].message = 'Withdrawal address'
|
||||||
|
this.rules.emailcode[0].message = 'Email captcha'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// <-- -------------------------钱包登录开始 --------------------------->
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
allMoney(){
|
||||||
|
this.showMoneyAdress = true;
|
||||||
|
},
|
||||||
|
userMoneyAdressOptions(adress){
|
||||||
|
if(adress){
|
||||||
|
return adress
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moneyTip(txt){
|
||||||
|
if(txt){
|
||||||
|
return txt
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '請選擇連接錢包' : 'Please choose to connect the wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectWallet(wallet) {
|
||||||
|
this.selectMoney = {};
|
||||||
|
if(wallet.name == 'MetaMask') {
|
||||||
|
if(window.web3?.currentProvider){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'MetaMask未安裝' : 'MetaMask not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wallet.name == 'TokenPocket') {
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'TokenPocket未安裝' : 'TokenPocket not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(wallet.name == "OKX Wallet"){
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum.isOKExWallet)){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? '欧易钱包未安装' : 'OKX Wallet not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(walletType){
|
||||||
|
let account = "";
|
||||||
|
try {
|
||||||
|
if (walletType == 'MetaMask') {
|
||||||
|
const provider = window.web3.currentProvider;
|
||||||
|
const accounts = await provider.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = accounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'TokenPocket') {
|
||||||
|
const tpAccounts = await window.tokenpocket.ethereum.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = tpAccounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'OKX Wallet') {
|
||||||
|
const okxAccounts = await window.okxwallet.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = okxAccounts[0];
|
||||||
|
}
|
||||||
|
console.log(account,'xxaa');
|
||||||
|
let _adressM = account;
|
||||||
|
this.userMoneyAdressAll = account;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
this.moneyDialogVisible = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toConnectWallet() {
|
||||||
|
if(this.userMoneyAdress){
|
||||||
|
if(this.isShowSale){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.hasAdress = !this.hasAdress;
|
||||||
|
return
|
||||||
|
};
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},
|
||||||
|
//<-- -------------------------钱包登录结尾 --------------------------->
|
||||||
|
formatDate(row, column, cellValue){
|
||||||
|
return moment(cellValue*1000).format("YYYY-MM-DD HH:mm:ss");
|
||||||
|
},
|
||||||
|
showCashoutDialog(){
|
||||||
|
this.cashout.amount = this.userInfos.bnb
|
||||||
|
this.showDialog = true
|
||||||
|
},
|
||||||
|
toWallet(){
|
||||||
|
const loading = this.$loading({
|
||||||
|
lock: true,
|
||||||
|
text: 'Loading',
|
||||||
|
spinner: 'el-icon-loading',
|
||||||
|
background: 'rgba(0, 0, 0, 0.7)'
|
||||||
|
});
|
||||||
|
axios.post(baseUrl+'api/user/refyzswallet',{'wallet':this.userInfos?.wallet},{headers:{token:this.userInfos?.token}}).then(res=>{
|
||||||
|
loading.close()
|
||||||
|
if(res.data.code == 1){
|
||||||
|
this.$message.success(this.currentLanguage =='zh'?'保存成功':'Saved successfully')
|
||||||
|
}else{
|
||||||
|
this.$message.error(res.data.msg)
|
||||||
|
}
|
||||||
|
}).catch(err=>{
|
||||||
|
loading.close()
|
||||||
|
this.$message.error(this.currentLanguage =='zh'?'保存失败':'Save failed')
|
||||||
|
});
|
||||||
|
},
|
||||||
|
closeDialog(){
|
||||||
|
this.showDialog = false;
|
||||||
|
this.showSendCodeTimer = 0
|
||||||
|
this.interval && clearInterval(this.interval)
|
||||||
|
},
|
||||||
|
sendCode(v){
|
||||||
|
if(v === 'e'){
|
||||||
|
this.emailSending = true
|
||||||
|
axios.post(baseUrl+'api/ems/send',{email:this.userInfos.email,event:'cashout'}).then(res=>{
|
||||||
|
|
||||||
|
if(res.data.code === 1){
|
||||||
|
const msg = this.currentLanguage =='zh'?"發送成功,請查收":'Sent successfully, please check'
|
||||||
|
this.$message.success(msg)
|
||||||
|
setTimeout(()=>{
|
||||||
|
this.emailSending = false
|
||||||
|
},60000)
|
||||||
|
}else{
|
||||||
|
this.emailSending = false
|
||||||
|
const msg = this.currentLanguage =='zh'?"發送失败":'Sent failed'
|
||||||
|
this.$message.error(msg)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.showSendCodeTimer = 60
|
||||||
|
let interval = setInterval(()=>{
|
||||||
|
if(this.showSendCodeTimer === 0){
|
||||||
|
clearInterval(this.interval)
|
||||||
|
}else{
|
||||||
|
this.showSendCodeTimer--
|
||||||
|
}
|
||||||
|
},1000)
|
||||||
|
},
|
||||||
|
submitCashout(){
|
||||||
|
this.$refs['form'].validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
const loading = this.$loading({
|
||||||
|
lock: true,
|
||||||
|
text: 'Loading',
|
||||||
|
spinner: 'el-icon-loading',
|
||||||
|
background: 'rgba(0, 0, 0, 0.7)'
|
||||||
|
});
|
||||||
|
axios.post(baseUrl+'api/user/cashout',{...this.cashout},{headers:{token:this.userInfos?.token}}).then(res=>{
|
||||||
|
loading.close()
|
||||||
|
if(res.data.code == 1){
|
||||||
|
this.$message.success(this.currentLanguage =='zh'?'操作成功':'Operation successful')
|
||||||
|
this.showDialog = false
|
||||||
|
this.getuserInfos()
|
||||||
|
}else{
|
||||||
|
this.$message.error(res.data.msg)
|
||||||
|
}
|
||||||
|
}).catch(err=>{
|
||||||
|
loading.close()
|
||||||
|
this.$message.error(this.currentLanguage =='zh'?'操作失败':'Operation failed')
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
changeText(){
|
||||||
|
const i = this.classIfications.find(item =>{
|
||||||
|
return item.value == this.ifications
|
||||||
|
})
|
||||||
|
return this.currentLanguage == 'zh'?i.name_zh:i.name_en
|
||||||
|
},
|
||||||
|
mobileLang(){
|
||||||
|
this.currentLanguage = mobileLang()
|
||||||
|
this.rules.amount[0].message = this.currentLanguage =='en'?'Quantity':'提現數量'
|
||||||
|
this.rules.googleauthcode[0].message = this.currentLanguage =='en'?'Google captcha':'Google驗證碼'
|
||||||
|
this.rules.address[0].message = this.currentLanguage =='en'?'Withdrawal address':'提幣地址'
|
||||||
|
this.rules.emailcode[0].message = this.currentLanguage =='en'?'Email captcha':'Email驗證碼'
|
||||||
|
|
||||||
|
},
|
||||||
|
handleCurrentChange(val){
|
||||||
|
this.page = val
|
||||||
|
this.getonrules();
|
||||||
|
},
|
||||||
|
async getuserInfos(){
|
||||||
|
if(!this.userInfos?.token){return}
|
||||||
|
let res = await axios.post(baseUrl+'api/user/index',{},{headers:{token:this.userInfos?.token}});
|
||||||
|
if(res.data.code == 1){
|
||||||
|
this.userInfos = res.data.data.userinfo;
|
||||||
|
this.getonrules();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getonrules(){
|
||||||
|
if(!this.userInfos?.token){return}
|
||||||
|
const loading = this.$loading({
|
||||||
|
lock: true,
|
||||||
|
text: 'Loading',
|
||||||
|
spinner: 'el-icon-loading',
|
||||||
|
background: 'rgba(0, 0, 0, 0.7)'
|
||||||
|
});
|
||||||
|
let res = await axios.get(baseUrl+'api/user/getlogs?type='+this.ifications+'&page='+this.page,{ headers:{token:this.userInfos.token}});
|
||||||
|
if(res.data.code == 1){
|
||||||
|
this.rewardRules = res.data.data;
|
||||||
|
}
|
||||||
|
loading.close()
|
||||||
|
},
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
async toBind(){
|
||||||
|
let tipMessage = this.currentLanguage == 'zh' ? '請輸入邀請碼' : 'Please enter the invitation code';
|
||||||
|
if(!this.bindIcode){
|
||||||
|
this.$message.error(tipMessage)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let res = await axios.post(
|
||||||
|
baseUrl+'api/user/bindicode',
|
||||||
|
{ icode:this.bindIcode,},
|
||||||
|
{ headers:{
|
||||||
|
token:this.userInfos.token
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
if(res.data.code == 1){
|
||||||
|
this.$message.success("ok");
|
||||||
|
}else{
|
||||||
|
this.$message.error("error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
<style>
|
||||||
|
.el-descriptions-item__label,.el-descriptions-item__content{
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 32px;
|
||||||
|
}
|
||||||
|
.el-descriptions__body{
|
||||||
|
border-top: 1px solid #d8d8d8;
|
||||||
|
padding-top: 24px;
|
||||||
|
}
|
||||||
|
.send{
|
||||||
|
background-color: #446FFA !important;
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
.send.disabled{
|
||||||
|
background-color: #d8d8d8 !important;
|
||||||
|
}
|
||||||
|
.send.disabled:hover{
|
||||||
|
border-color: #d8d8d8 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</html>
|
585
signup.html
Normal file
585
signup.html
Normal file
@ -0,0 +1,585 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="PYXEL || Ultimate Gaming HTML Template">
|
||||||
|
|
||||||
|
<title>Samsara DAO</title>
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
|
||||||
|
<!-- All CSS files -->
|
||||||
|
<link rel="stylesheet" href="static/css/font-awesome.css">
|
||||||
|
<link rel="stylesheet" href="static/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="static/css/app.css">
|
||||||
|
<link rel="stylesheet" href="static/js/element-ui-min.css">
|
||||||
|
<!-- 引入 Vue.js -->
|
||||||
|
<script src="static/js/vue.js" ></script>
|
||||||
|
<!-- 引入 axios -->
|
||||||
|
<script src="static/js/axios.min.js"></script>
|
||||||
|
<!-- 引入 Element UI JS -->
|
||||||
|
<script src="static/js/element-ui.js"></script>
|
||||||
|
<style>
|
||||||
|
.pro_txt{
|
||||||
|
height: 5vh;
|
||||||
|
margin-bottom: 3vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 10px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 2px solid #99B1FF;
|
||||||
|
border-radius: 33px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.pro_txt input{
|
||||||
|
flex: 1;
|
||||||
|
height: 100%;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
.signup_page{
|
||||||
|
background: url(./static/picture/sign_bg.png) no-repeat;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.signup_page_img{
|
||||||
|
width: 50%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.signup_page_img img{
|
||||||
|
position: absolute;
|
||||||
|
width: 70%;
|
||||||
|
bottom: 14%;
|
||||||
|
}
|
||||||
|
.signup_page_login{
|
||||||
|
width: 50%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.signup_box{
|
||||||
|
width: 60%;
|
||||||
|
height: 70%;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 30px;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 20%;
|
||||||
|
left: 20%;
|
||||||
|
padding: 10%;
|
||||||
|
}
|
||||||
|
.signup_box h5{
|
||||||
|
color: #446FFA;
|
||||||
|
margin-bottom: 10%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.send_code{
|
||||||
|
width: 35%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: #446FFA;
|
||||||
|
border-radius: 33px;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.pro_txt_btn{
|
||||||
|
margin-top: 15%;
|
||||||
|
padding: 1vh 0;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 33px;
|
||||||
|
background-color: #446FFA;
|
||||||
|
color: #fff;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.dialog_title{
|
||||||
|
height: 40px;
|
||||||
|
text-align: center;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="tt-smooth-scroll">
|
||||||
|
|
||||||
|
<!-- Main Wrapper Start -->
|
||||||
|
<div id="app">
|
||||||
|
|
||||||
|
<!-- HEADER MENU START -->
|
||||||
|
<div id="publickHeader"></div>
|
||||||
|
<!-- HEADER MENU END -->
|
||||||
|
|
||||||
|
<!-- BG-SIGN*UP PAGE # 1 START -->
|
||||||
|
<div class="signup_page">
|
||||||
|
<div class="signup_page_img">
|
||||||
|
<img src="static/picture/signup-image.png" alt="">
|
||||||
|
</div>
|
||||||
|
<div class="signup_page_login">
|
||||||
|
<div class="signup_box">
|
||||||
|
<h5>{{currentLanguage == 'zh' ? '註冊賬戶' : 'Registered Account'}}</h5>
|
||||||
|
<div class="pro_txt">
|
||||||
|
<input type="text" v-model="userobj.username" :placeholder="currentLanguage == 'zh' ? '用戶名': 'Name' ">
|
||||||
|
</div>
|
||||||
|
<div class="pro_txt">
|
||||||
|
<input type="text" v-model="userobj.email" :placeholder="currentLanguage == 'zh' ? '郵箱': 'Email' ">
|
||||||
|
</div>
|
||||||
|
<div class="pro_txt">
|
||||||
|
<input type="password" v-model="userobj.password" :placeholder="currentLanguage == 'zh' ? '密碼': 'Password' ">
|
||||||
|
</div>
|
||||||
|
<div class="pro_txt" style="padding-right: 0;">
|
||||||
|
<input type="text" v-model="userobj.code" :placeholder="currentLanguage == 'zh' ? '驗證碼': 'Verification code' ">
|
||||||
|
<button class="send_code" v-if="showtimer">{{beginnum + 's'}}</button>
|
||||||
|
<button class="send_code" v-else @click="getregcode">{{currentLanguage == 'zh' ? '發送驗證碼': 'Send code'}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="pro_txt" style="padding-right: 0;">
|
||||||
|
<input type="text" v-model="userobj.googleauthcode" :placeholder="currentLanguage == 'zh' ? '谷歌驗證碼': 'Google code' ">
|
||||||
|
<button class="send_code" v-if="showtimer1">{{beginnum1 + 's'}}</button>
|
||||||
|
<button class="send_code" v-else @click="getregcode1">{{currentLanguage == 'zh' ? '發送驗證碼': 'Send code'}}</button>
|
||||||
|
</div>
|
||||||
|
<button class="pro_txt_btn" @click="pageRegister">{{currentLanguage == 'zh' ? '確定':'Sure'}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- BG-SIGN*UP PAGE # 1 END -->
|
||||||
|
|
||||||
|
<!-- FOOTER START -->
|
||||||
|
<div id="publciFooter"></div>
|
||||||
|
<!-- FOOTER END -->
|
||||||
|
<el-dialog :visible.sync="dialogFormVisible" width="500px" :close-on-click-modal="false">
|
||||||
|
<div class="dialog_box">
|
||||||
|
<div class="dialog_title">{{currentLanguage == 'zh' ? '掃一掃獲取谷歌驗證碼' : 'Scan to get Google verification code'}}</div>
|
||||||
|
<div class="dialog_txt" style="text-align: center;">
|
||||||
|
<img :src="googleErwei.url" alt="">
|
||||||
|
<div style="margin-top: 2vh;">
|
||||||
|
<span>{{currentLanguage == 'zh' ? '密钥:':'secret key :'}}</span>
|
||||||
|
<span>{{googleErwei.secret}}</span>
|
||||||
|
<img @click="copySecret(googleErwei.secret)" src="static/image/fuzhi.png" style="vertical-align: middle;margin-left: 1vh;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
<!-- secret -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 钱包选择弹窗 -->
|
||||||
|
<el-dialog :visible.sync="moneyDialogVisible" width="40%" custom-class="wallet-dialog">
|
||||||
|
<div class="wallet-container">
|
||||||
|
<i class="el-icon-close" @click="moneyDialogVisible = false"></i>
|
||||||
|
<div class="wallet-left">
|
||||||
|
<h6 style="font-weight: 700;margin-bottom: 4vh;">{{currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'}}</h6>
|
||||||
|
<p class="wallet-tip">
|
||||||
|
{{ currentLanguage == 'zh' ? '首先,連接以下其中一個錢包。 請務必安全地儲存您的私密金鑰或助記詞,永遠不要與任何人分享它們。' : 'Firstly, connect one of the following wallets. Please make sure to securely store your private keys or mnemonics and never share them with anyone.' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="wallet-grid">
|
||||||
|
<div v-for="(wallet,index) in wallets" :key="index" class="wallet-item"
|
||||||
|
@click="selectWallet(wallet)">
|
||||||
|
<img :src="wallet.icon" :alt="wallet.name">
|
||||||
|
<span>{{ wallet.name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wallet-right" v-if="selectMoney.icon">
|
||||||
|
<div class="connecting-status">
|
||||||
|
<img :src="selectMoney.icon" class="tp-logo">
|
||||||
|
<p class="status-text">{{ currentLanguage == 'zh' ? '正在打開' : 'Opening' }} {{selectMoney.name}}</p>
|
||||||
|
<p class="confirm-text">
|
||||||
|
{{ currentLanguage == 'zh' ? '請在' : 'Please in' }}
|
||||||
|
{{selectMoney.name}}
|
||||||
|
{{ currentLanguage == 'zh' ? '中確認' : 'Confirm in the middle' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else style="display: flex;justify-content: center;align-items: center;width: 50%;">{{ moneyTip(moneyTipMessage) }}</div>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 钱包地址弹窗 -->
|
||||||
|
<el-dialog :visible.sync="showMoneyAdress" width="30%" :close-on-click-modal="false">
|
||||||
|
<div style="color: #000;">
|
||||||
|
{{ currentLanguage == 'zh' ? '錢包地址:' : 'Wallet address:' }}
|
||||||
|
{{ userMoneyAdressAll }}
|
||||||
|
<img src="static/image/fuzhi.png" @click="copyText(userMoneyAdressAll)" style="margin-left: 5px;vertical-align: middle;cursor: pointer;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
<!-- Main Wrapper End -->
|
||||||
|
|
||||||
|
<!-- Back To Top Start -->
|
||||||
|
<button class="scrollToTopBtn"><i class="fa fa-arrow-up"></i></button>
|
||||||
|
<!-- Mobile Menu Start -->
|
||||||
|
<div class="mobile-nav__wrapper">
|
||||||
|
<div class="mobile-nav__overlay mobile-nav__toggler"></div>
|
||||||
|
<div class="mobile-nav__content">
|
||||||
|
<span class="mobile-nav__close mobile-nav__toggler"><i class="fa fa-times"></i></span>
|
||||||
|
<div class="logo-box">
|
||||||
|
<a href="index.html" aria-label="logo image"><img src="static/picture/logo.png" alt=""></a>
|
||||||
|
</div>
|
||||||
|
<div class="mobile-nav__container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Mobile Menu End -->
|
||||||
|
<!-- Jquery Js -->
|
||||||
|
<script src="static/js/bootstrap.min.js"></script>
|
||||||
|
<script src="static/js/jquery-3.6.3.min.js"></script>
|
||||||
|
<script src="static/js/jquery-validator.js"></script>
|
||||||
|
|
||||||
|
<script src="static/js/publickDOM.js"></script>
|
||||||
|
<!-- 引入翻譯文件 -->
|
||||||
|
<script src="static/js/translation.js"></script>
|
||||||
|
<script src="static/js/i18n.js"></script>
|
||||||
|
<!-- 獲取用戶信息 -->
|
||||||
|
<script src="static/js/getIsUser.js"></script>
|
||||||
|
|
||||||
|
<!-- 表單提交 -->
|
||||||
|
<script>
|
||||||
|
// 創建一個增強版的 localStorage
|
||||||
|
const enhancedStorage = {
|
||||||
|
setItem: function (key, value) {
|
||||||
|
localStorage.setItem(key, value);
|
||||||
|
// 觸發自定義事件
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
getItem: function (key) {
|
||||||
|
return localStorage.getItem(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 替換原始的 setItem 方法
|
||||||
|
const originalSetItem = localStorage.setItem;
|
||||||
|
localStorage.setItem = function (key, value) {
|
||||||
|
originalSetItem.call(localStorage, key, value);
|
||||||
|
window.dispatchEvent(new CustomEvent('localStorageChange', {
|
||||||
|
detail: { key, value }
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
new Vue({
|
||||||
|
el: "#app",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 钱包登录开始
|
||||||
|
userMoneyAdressAll:"",
|
||||||
|
showMoneyAdress:false,
|
||||||
|
hasAdress:false,
|
||||||
|
moneyTipMessage:"",
|
||||||
|
selectMoney:{},
|
||||||
|
wallets: [
|
||||||
|
{
|
||||||
|
name: 'MetaMask',
|
||||||
|
icon: 'static/metamask.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'TokenPocket',
|
||||||
|
icon: 'static/tokenpocket.png'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'OKX Wallet',
|
||||||
|
icon: 'static/okx-wallet.png'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
moneyDialogVisible: false,
|
||||||
|
userIsLogin: false,
|
||||||
|
userMoneyAdress: "",
|
||||||
|
// 钱包登录结尾
|
||||||
|
googleTip:"",
|
||||||
|
googleErwei:{},
|
||||||
|
currentLanguage: localStorage.getItem('languageNow') || 'en',
|
||||||
|
userobj:{},
|
||||||
|
initCode:"",
|
||||||
|
codetimer:null,
|
||||||
|
showtimer:false,
|
||||||
|
showtimer1:false,
|
||||||
|
beginnum: 60,
|
||||||
|
beginnum1: 60,
|
||||||
|
dialogFormVisible:false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async created() {
|
||||||
|
const user = window.localStorage.getItem("userInfo")
|
||||||
|
if (user) {
|
||||||
|
this.userIsLogin = true;
|
||||||
|
}
|
||||||
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
|
this.initCode = urlParams.get('icode');
|
||||||
|
// 钱包登录开始
|
||||||
|
const provider = window.web3?.currentProvider;
|
||||||
|
let accounts1 = [];
|
||||||
|
let accounts2 = [];
|
||||||
|
let accounts3 = [];
|
||||||
|
if(provider){
|
||||||
|
accounts1 = await provider.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
accounts2 = await window.tokenpocket.ethereum.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum?.isOKExWallet)){
|
||||||
|
accounts3 = await window.okxwallet.request({method: 'eth_accounts'});
|
||||||
|
}
|
||||||
|
console.log(accounts1,accounts2,accounts3,'see');
|
||||||
|
let _adressM = accounts1[0] || accounts2[0] || accounts3[0];
|
||||||
|
if(_adressM){
|
||||||
|
this.userMoneyAdressAll = _adressM;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
}
|
||||||
|
// 钱包登录结尾
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('localStorageChange', (event) => {
|
||||||
|
if (event.detail.key === 'languageNow') {
|
||||||
|
this.currentLanguage = event.detail.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
// <-- -------------------------钱包登录开始 --------------------------->
|
||||||
|
copyText(txt){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(txt)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
allMoney(){
|
||||||
|
this.showMoneyAdress = true;
|
||||||
|
},
|
||||||
|
userMoneyAdressOptions(adress){
|
||||||
|
if(adress){
|
||||||
|
return adress
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '連接錢包' : 'Connect wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
moneyTip(txt){
|
||||||
|
if(txt){
|
||||||
|
return txt
|
||||||
|
}else{
|
||||||
|
return this.currentLanguage == 'zh' ? '請選擇連接錢包' : 'Please choose to connect the wallet'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectWallet(wallet) {
|
||||||
|
this.selectMoney = {};
|
||||||
|
if(wallet.name == 'MetaMask') {
|
||||||
|
if(window.web3?.currentProvider){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'MetaMask未安裝' : 'MetaMask not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wallet.name == 'TokenPocket') {
|
||||||
|
if(window.tokenpocket?.ethereum){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? 'TokenPocket未安裝' : 'TokenPocket not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(wallet.name == "OKX Wallet"){
|
||||||
|
if(window.okxwallet || (window.ethereum && window.ethereum.isOKExWallet)){
|
||||||
|
this.selectMoney = wallet;
|
||||||
|
this.connectWallet(wallet.name);
|
||||||
|
}else{
|
||||||
|
this.moneyTipMessage = this.currentLanguage == 'zh' ? '欧易钱包未安装' : 'OKX Wallet not installed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectWallet(walletType){
|
||||||
|
let account = "";
|
||||||
|
try {
|
||||||
|
if (walletType == 'MetaMask') {
|
||||||
|
const provider = window.web3.currentProvider;
|
||||||
|
const accounts = await provider.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = accounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'TokenPocket') {
|
||||||
|
const tpAccounts = await window.tokenpocket.ethereum.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = tpAccounts[0];
|
||||||
|
}
|
||||||
|
if (walletType == 'OKX Wallet') {
|
||||||
|
const okxAccounts = await window.okxwallet.request({
|
||||||
|
method: 'eth_requestAccounts'
|
||||||
|
});
|
||||||
|
account = okxAccounts[0];
|
||||||
|
}
|
||||||
|
console.log(account,'xxaa');
|
||||||
|
let _adressM = account;
|
||||||
|
this.userMoneyAdressAll = account;
|
||||||
|
this.userMoneyAdress = _adressM.slice(0,4) + "...." + _adressM.slice(-4);
|
||||||
|
this.moneyDialogVisible = false;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toConnectWallet() {
|
||||||
|
if(this.userMoneyAdress){
|
||||||
|
if(this.isShowSale){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.hasAdress = !this.hasAdress;
|
||||||
|
return
|
||||||
|
};
|
||||||
|
this.moneyDialogVisible = true;
|
||||||
|
},
|
||||||
|
//<-- -------------------------钱包登录结尾 --------------------------->
|
||||||
|
copySecret(secret){
|
||||||
|
let message = this.currentLanguage == 'zh' ? '複製成功!' : 'Copy successful!';
|
||||||
|
navigator.clipboard.writeText(secret)
|
||||||
|
.then(()=>{
|
||||||
|
this.$message.success(message)
|
||||||
|
})
|
||||||
|
.catch(err=>{
|
||||||
|
console.log(err,'error');
|
||||||
|
})
|
||||||
|
},
|
||||||
|
mobileLang(){
|
||||||
|
this.currentLanguage = mobileLang()
|
||||||
|
},
|
||||||
|
codebtnOption(){
|
||||||
|
this.codetimer = setInterval(()=>{
|
||||||
|
this.beginnum--;
|
||||||
|
if(this.beginnum <= 0){
|
||||||
|
this.beginnum = 60;
|
||||||
|
this.showtimer = false;
|
||||||
|
clearInterval(this.codetimer);
|
||||||
|
}
|
||||||
|
},1000)
|
||||||
|
},
|
||||||
|
codebtnOption1(){
|
||||||
|
this.codetimer1 = setInterval(()=>{
|
||||||
|
this.beginnum1--;
|
||||||
|
if(this.beginnum1 <= 0){
|
||||||
|
this.beginnum1 = 60;
|
||||||
|
this.showtimer1 = false;
|
||||||
|
clearInterval(this.codetimer1);
|
||||||
|
}
|
||||||
|
},1000)
|
||||||
|
},
|
||||||
|
getregcode1(){
|
||||||
|
let _that = this;
|
||||||
|
let message = _that.currentLanguage == 'zh' ? '郵箱不能為空' : 'Email cannot be empty';
|
||||||
|
if(!_that.userobj.email){
|
||||||
|
this.$message.error(message);
|
||||||
|
return
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url:baseUrl+"api/user/getgoogleauthurl2",
|
||||||
|
type:"post",
|
||||||
|
dataType: "json",
|
||||||
|
data:{
|
||||||
|
email: _that.userobj.email
|
||||||
|
},
|
||||||
|
success: function(res) {
|
||||||
|
_that.googleErwei = res.data;
|
||||||
|
_that.dialogFormVisible = true;
|
||||||
|
_that.showtimer1 = true;
|
||||||
|
_that.codebtnOption1();
|
||||||
|
},
|
||||||
|
error: function(rej){
|
||||||
|
console.log("failed");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getregcode(){
|
||||||
|
let _that = this;
|
||||||
|
$.ajax({
|
||||||
|
url:baseUrl+"api/ems/send",
|
||||||
|
type: "post",
|
||||||
|
dataType: "json",
|
||||||
|
data: {
|
||||||
|
email:_that.userobj.email,
|
||||||
|
event:'register'
|
||||||
|
},
|
||||||
|
success: function(res) {
|
||||||
|
if(res.code == 1){
|
||||||
|
_that.showtimer = true;
|
||||||
|
_that.$message.success('success!')
|
||||||
|
_that.codebtnOption();
|
||||||
|
}else{
|
||||||
|
console.log(res.msg,'sss');
|
||||||
|
let tipMessage = "";
|
||||||
|
switch (res.msg) {
|
||||||
|
case '发送频繁':
|
||||||
|
_that.currentLanguage == 'zh' ? tipMessage = "发送频繁" : tipMessage ='Frequent sending';
|
||||||
|
break;
|
||||||
|
case '已被注册':
|
||||||
|
_that.currentLanguage == 'zh' ? tipMessage = "已被注册" : tipMessage ='Already registered';
|
||||||
|
break;
|
||||||
|
case '发送失败':
|
||||||
|
_that.currentLanguage == 'zh' ? tipMessage = "发送失败" : tipMessage ='fail in send';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
tipMessage = 'error';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_that.$message.error(tipMessage)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error(rej){
|
||||||
|
_that.$message.error(rej)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
pageRegister(){
|
||||||
|
let _that = this;
|
||||||
|
let message = this.currentLanguage == 'zh' ? '請輸入完整信息' : 'Please enter complete information';
|
||||||
|
if(!this.userobj.username && !this.userobj.email && !this.userobj.password && !this.userobj.code && !this.userobj.googleauthcode){
|
||||||
|
this.$message.error(message);
|
||||||
|
return
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url:baseUrl+"api/user/register",
|
||||||
|
type: "post",
|
||||||
|
dataType: "json",
|
||||||
|
data: this.userobj,
|
||||||
|
success: function(res) {
|
||||||
|
if(res.code === 1){
|
||||||
|
_that.$message.success('Registration successful!');
|
||||||
|
let obj = JSON.stringify(res.data.userinfo);
|
||||||
|
window.localStorage.setItem("userInfo",obj);
|
||||||
|
if(_that.initCode){
|
||||||
|
_that.binduser(res.data.userinfo.token);
|
||||||
|
}else{
|
||||||
|
setTimeout(()=>{
|
||||||
|
_that.userobj = {};
|
||||||
|
window.location.href = "index.html";
|
||||||
|
},1000)
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
_that.$message.error(res.msg)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function(rej){
|
||||||
|
alert("failed")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
async binduser(token){
|
||||||
|
console.log(token,'tokentokentoken');
|
||||||
|
let res = await axios.post(baseUrl+'api/user/bindicode', { icode:this.initCode,}, { headers:{token}});
|
||||||
|
setTimeout(()=>{
|
||||||
|
window.location.href = "index.html";
|
||||||
|
},1000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script src="static/js/app.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
BIN
static/.DS_Store
vendored
Normal file
BIN
static/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
static/banner/1.png
Normal file
BIN
static/banner/1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 133 KiB |
BIN
static/banner/2.png
Normal file
BIN
static/banner/2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 128 KiB |
BIN
static/banner/3.png
Normal file
BIN
static/banner/3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 159 KiB |
BIN
static/banner/4.png
Normal file
BIN
static/banner/4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 220 KiB |
BIN
static/banner/banner-bg.png
Normal file
BIN
static/banner/banner-bg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 322 KiB |
4411
static/css/app.css
Normal file
4411
static/css/app.css
Normal file
File diff suppressed because it is too large
Load Diff
7
static/css/bootstrap.min.css
vendored
Normal file
7
static/css/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -0,0 +1,756 @@
|
|||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOiCnqEu92Fr1Mu51QrEz0dL_nz.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOiCnqEu92Fr1Mu51QrEzQdL_nz.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOiCnqEu92Fr1Mu51QrEzwdL_nz.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOiCnqEu92Fr1Mu51QrEzMdL_nz.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOiCnqEu92Fr1Mu51QrEz8dL_nz.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOiCnqEu92Fr1Mu51QrEz4dL_nz.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOiCnqEu92Fr1Mu51QrEzAdLw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1Mu51xIIzI.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51S7ACc3CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51S7ACc-CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51S7ACc2CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51S7ACc5CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51S7ACc1CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51S7ACc0CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51S7ACc6CsQ.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TLBCc3CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TLBCc-CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TLBCc2CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TLBCc5CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TLBCc1CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TLBCc0CsTKlA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOjCnqEu92Fr1Mu51TLBCc6CsQ.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1MmgVxFIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1MmgVxMIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1MmgVxEIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1MmgVxLIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1MmgVxHIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1MmgVxGIzIFKw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOkCnqEu92Fr1MmgVxIIzI.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmEU9fBBc4.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* cyrillic-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmYUtfCRc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||||
|
}
|
||||||
|
/* cyrillic */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmYUtfABc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
|
}
|
||||||
|
/* greek-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmYUtfCBc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+1F00-1FFF;
|
||||||
|
}
|
||||||
|
/* greek */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmYUtfBxc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmYUtfCxc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmYUtfChc4EsA.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/KFOlCnqEu92Fr1MmYUtfBBc4.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
60
static/css/css2-Sairaitalwght0100..9001100..900_swap.css
Normal file
60
static/css/css2-Sairaitalwght0100..9001100..900_swap.css
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Saira';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100 900;
|
||||||
|
font-stretch: 100%;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/memhYa2wxmKQyNkiV50dulWP7s95AqZTzbvffS2-vw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Saira';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100 900;
|
||||||
|
font-stretch: 100%;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/memhYa2wxmKQyNkiV50dulWP7s95AqZTzbvefS2-vw.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Saira';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100 900;
|
||||||
|
font-stretch: 100%;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/memhYa2wxmKQyNkiV50dulWP7s95AqZTzbvQfS0.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Saira';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100 900;
|
||||||
|
font-stretch: 100%;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/memjYa2wxmKQyPMrZX79wwYZQMhsyuSLh4vSZSk.woff2) format('woff2');
|
||||||
|
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Saira';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100 900;
|
||||||
|
font-stretch: 100%;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/memjYa2wxmKQyPMrZX79wwYZQMhsyuSLhovSZSk.woff2) format('woff2');
|
||||||
|
unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Saira';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100 900;
|
||||||
|
font-stretch: 100%;
|
||||||
|
font-display: swap;
|
||||||
|
src: url(../font/memjYa2wxmKQyPMrZX79wwYZQMhsyuSLiIvS.woff2) format('woff2');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||||
|
}
|
12
static/css/font-awesome.css
vendored
Normal file
12
static/css/font-awesome.css
vendored
Normal file
File diff suppressed because one or more lines are too long
312
static/css/nftdetail.css
Normal file
312
static/css/nftdetail.css
Normal file
@ -0,0 +1,312 @@
|
|||||||
|
.card-container {
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-header {
|
||||||
|
padding: 2vh;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
border-bottom: 1px solid #ebeef5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-image {
|
||||||
|
width: 15vh;
|
||||||
|
height: 15vh;
|
||||||
|
border-radius: 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-right: 2vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-image img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-container .card-header .card-item-info {
|
||||||
|
width: 30%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-title {
|
||||||
|
color: #303133;
|
||||||
|
font-size: 2vh;
|
||||||
|
margin-bottom: 1vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-id {
|
||||||
|
color: #606266;
|
||||||
|
font-size: 1.8vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-section {
|
||||||
|
margin-top: 1vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-label {
|
||||||
|
color: #909399;
|
||||||
|
font-size: 1.2vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-value {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-top: 0.5vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.currency-icon {
|
||||||
|
width: 2vh;
|
||||||
|
height: 2vh;
|
||||||
|
margin-right: 0.5vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price {
|
||||||
|
color: #409EFF;
|
||||||
|
font-size: 1.8vh;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.secondary-price {
|
||||||
|
color: #909399;
|
||||||
|
font-size: 1.4vh;
|
||||||
|
margin-left: 1vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-buttons {
|
||||||
|
margin-top: 2vh;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.action-buttons-item{
|
||||||
|
height: 3vh;
|
||||||
|
}
|
||||||
|
.main-content {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
width: 32vh;
|
||||||
|
border-right: 1px solid #ebeef5;
|
||||||
|
transition: all 0.3s;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-collapsed {
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-content {
|
||||||
|
padding: 2vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.property-row {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 1.2vh;
|
||||||
|
font-size: 1.4vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.property-label {
|
||||||
|
width: 31%;
|
||||||
|
color: #909399;
|
||||||
|
}
|
||||||
|
|
||||||
|
.property-value {
|
||||||
|
width: 69%;
|
||||||
|
color: #606266;
|
||||||
|
text-align: right;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-section {
|
||||||
|
flex: 1;
|
||||||
|
padding: 0 2vh;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-container {
|
||||||
|
margin-bottom: 2vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle-sidebar {
|
||||||
|
position: absolute;
|
||||||
|
left: calc(5vw + 25vh);
|
||||||
|
top: 50vh;
|
||||||
|
z-index: 100;
|
||||||
|
transition: all 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle-sidebar.collapsed {
|
||||||
|
left: 5vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
.heart-icon {
|
||||||
|
position: absolute;
|
||||||
|
right: 2vh;
|
||||||
|
top: 2vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight {
|
||||||
|
color: #F56C6C;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 出价弹窗 */
|
||||||
|
.bid-dialog {
|
||||||
|
border-radius: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .el-dialog__header {
|
||||||
|
background-color: #4d7cfe;
|
||||||
|
padding: 15px 20px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .el-dialog__title {
|
||||||
|
color: white;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .el-dialog__headerbtn .el-dialog__close {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .el-dialog__body {
|
||||||
|
padding: 20px;
|
||||||
|
background-color: #f5f7fa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .dia-card-item-info {
|
||||||
|
display: flex;
|
||||||
|
background-color: white;
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 8px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .item-image {
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
margin-right: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .item-image img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .dia-item-title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .dia-item-id {
|
||||||
|
color: #909399;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .dia-item-price {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
color: #606266;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .price {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .price i {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .price-section,
|
||||||
|
.duration-section {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .section-title {
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .balance-info {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
color: #909399;
|
||||||
|
font-size: 14px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .price-input {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .currency {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .duration-options {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .duration-btn {
|
||||||
|
border-radius: 8px;
|
||||||
|
margin-right: 10px;
|
||||||
|
padding: 8px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .duration-btn.active {
|
||||||
|
background-color: #4d7cfe;
|
||||||
|
color: white;
|
||||||
|
border-color: #4d7cfe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .date-picker {
|
||||||
|
width: 220px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .notice-section {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .notice-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
color: #909399;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .notice-item i {
|
||||||
|
margin-right: 5px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
line-height: revert;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .dialog-footer {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bid-dialog .confirm-btn {
|
||||||
|
background-color: #4d7cfe;
|
||||||
|
border-color: #4d7cfe;
|
||||||
|
width: 100%;
|
||||||
|
padding: 12px 20px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
99
static/css/sale.css
Normal file
99
static/css/sale.css
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
|
||||||
|
.flash-sale {
|
||||||
|
position: fixed;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 66;
|
||||||
|
align-items: center; /* 垂直居中 */
|
||||||
|
justify-content: center; /* 水平居中,如果需要的话 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.sale-bg-box {
|
||||||
|
position: absolute;
|
||||||
|
background: #000;
|
||||||
|
opacity: 0.8;
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
z-index: 67;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sale-content-box {
|
||||||
|
position: relative;
|
||||||
|
top: 10%;
|
||||||
|
background: #fff;
|
||||||
|
opacity: 0.7;
|
||||||
|
width: 1100px;
|
||||||
|
margin:0 auto;
|
||||||
|
height: 80%;
|
||||||
|
border-radius: 40px;
|
||||||
|
z-index: 68;
|
||||||
|
}
|
||||||
|
|
||||||
|
.time-count {
|
||||||
|
font-size: 36px;
|
||||||
|
display: inline-block;
|
||||||
|
padding:12px 8px;
|
||||||
|
margin:0 8px;
|
||||||
|
border-radius:8px;
|
||||||
|
background:#f2f2f2;
|
||||||
|
color:red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sale-context {
|
||||||
|
position: relative;
|
||||||
|
width: 800px;
|
||||||
|
margin:5% auto;
|
||||||
|
height: 80%;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 40px;
|
||||||
|
padding: 24px;
|
||||||
|
opacity: 1;
|
||||||
|
z-index: 70;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imgs-box {
|
||||||
|
overflow-y: auto;
|
||||||
|
padding: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: center;
|
||||||
|
flex-wrap:wrap;
|
||||||
|
gap: 12px;
|
||||||
|
/* 格子之间的间距 */
|
||||||
|
width: 100%;
|
||||||
|
/* 容器宽度 */
|
||||||
|
height: 80%;
|
||||||
|
/* 容器高度 */
|
||||||
|
padding: 10px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow-y: auto;
|
||||||
|
border:1px solid #ddd;
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
.grid-item {
|
||||||
|
background-color: rgba(207, 208, 210, 0.2);
|
||||||
|
color: white;
|
||||||
|
font-size: 24px;
|
||||||
|
border-radius: 8px;
|
||||||
|
border:1px solid transparent;
|
||||||
|
padding: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.checked{
|
||||||
|
background-color: rgba(87, 153, 239, 0.5);
|
||||||
|
border:1px solid #ddd;
|
||||||
|
}
|
||||||
|
.el-dialog__body{
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
.el-dialog{
|
||||||
|
border-radius: 32px;
|
||||||
|
}
|
||||||
|
.el-dialog__header{
|
||||||
|
padding-top: 12px;
|
||||||
|
}
|
1
static/css/slick-theme.css
Normal file
1
static/css/slick-theme.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
.slick-loading .slick-list{background:#fff url(../image/ajax-loader.gif) center center no-repeat}.slick-prev,.slick-next{font-size:0;line-height:0;color:#7A7F85;position:absolute;top:49%;display:block;width:20px;height:20px;padding:0;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%);z-index:999;cursor:pointer;border:none;outline:none;background:#fff0}.slick-prev:hover,.slick-prev:focus,.slick-next:hover,.slick-next:focus{color:#fff0;outline:none;background:#fff0}.slick-prev:hover:before,.slick-prev:focus:before,.slick-next:hover:before,.slick-next:focus:before{opacity:1}.slick-prev.slick-disabled:before,.slick-next.slick-disabled:before{opacity:.25}.slick-prev:before,.slick-next:before{font-family:'Font Awesome 5 Pro';font-size:24px;line-height:1;opacity:1;color:#FAFDFF;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-prev{left:-.9895833333333334vw}[dir='rtl'] .slick-prev{right:-.9895833333333334vw;left:auto}.slick-prev:before{content:"\f104"}[dir='rtl'] .slick-prev:before{content:'→'}.slick-next{right:-.9895833333333334vw}[dir='rtl'] .slick-next{right:auto;left:-.9895833333333334vw}.slick-next:before{content:"\f105"}[dir='rtl'] .slick-next:before{content:'â†'}.slick-dotted.slick-slider{margin-bottom:30px}.slick-dots{position:absolute;bottom:-25px;display:block;width:100%;padding:0;margin:0;list-style:none;text-align:center}.slick-dots li{position:relative;display:inline-block;width:20px;height:20px;margin:0 5px;padding:0;cursor:pointer}.slick-dots li button{font-size:0;line-height:0;display:block;width:20px;height:20px;padding:5px;cursor:pointer;color:#fff0;border:0;outline:none;background:#fff0}.slick-dots li button:hover,.slick-dots li button:focus{outline:none}.slick-dots li button:hover:before,.slick-dots li button:focus:before{opacity:1}.slick-dots li button:before{font-family:'slick';font-size:6px;line-height:20px;position:absolute;top:0;left:0;width:20px;height:20px;content:'•';text-align:center;opacity:.25;color:#000;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-dots li.slick-active button:before{opacity:.75;color:#000}@media only screen and (max-width:991px){.slick-next{right:-7px}.slick-prev{left:-7px}.slick-prev:before,.slick-next:before{font-size:16px}}
|
1
static/css/slick.css
Normal file
1
static/css/slick.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
.slick-slider{position:relative;display:block;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-khtml-user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:#fff0}.slick-list{position:relative;display:block;overflow:hidden;margin:0;padding:0}.slick-list:focus{outline:none}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-track,.slick-slider .slick-list{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slick-track{position:relative;top:0;left:0;display:block;margin-left:auto;margin-right:auto}.slick-track:before,.slick-track:after{display:table;content:''}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{display:none;float:left;height:100%;min-height:1px}[dir='rtl'] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid #fff0}.slick-arrow.slick-hidden{display:none}
|
BIN
static/file/gamers-video.mp4
Normal file
BIN
static/file/gamers-video.mp4
Normal file
Binary file not shown.
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEz0dL_nz.woff2
Normal file
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEz0dL_nz.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEz4dL_nz.woff2
Normal file
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEz4dL_nz.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEz8dL_nz.woff2
Normal file
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEz8dL_nz.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEzAdLw.woff2
Normal file
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEzAdLw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEzMdL_nz.woff2
Normal file
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEzMdL_nz.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEzQdL_nz.woff2
Normal file
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEzQdL_nz.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEzwdL_nz.woff2
Normal file
BIN
static/font/KFOiCnqEu92Fr1Mu51QrEzwdL_nz.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc-CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc-CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc0CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc0CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc1CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc1CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc2CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc2CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc3CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc3CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc5CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc5CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc6CsQ.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51S7ACc6CsQ.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc-CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc-CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc0CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc0CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc1CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc1CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc2CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc2CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc3CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc3CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc5CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc5CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc6CsQ.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TLBCc6CsQ.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2
Normal file
BIN
static/font/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1MmgVxEIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1MmgVxEIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1MmgVxFIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1MmgVxFIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1MmgVxGIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1MmgVxGIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1MmgVxHIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1MmgVxHIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1MmgVxIIzI.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1MmgVxIIzI.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1MmgVxLIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1MmgVxLIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1MmgVxMIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1MmgVxMIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1Mu51xIIzI.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1Mu51xIIzI.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2
Normal file
BIN
static/font/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmEU9fBBc4.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmEU9fBBc4.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmSU5fBBc4.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmSU5fBBc4.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmWUlfBBc4.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmWUlfBBc4.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2
Normal file
Binary file not shown.
BIN
static/font/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2
Normal file
BIN
static/font/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user