616 lines
26 KiB
HTML
616 lines
26 KiB
HTML
<!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:baseUrl + "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> |