2025-04-19 15:31:22 +08:00
<!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({
2025-05-09 18:28:03 +08:00
url:baseUrl + "api/user/getgoogleauthurl",
2025-04-19 15:31:22 +08:00
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({
2025-05-09 18:28:03 +08:00
url: baseUrl + "api/user/onekeylogin2",
2025-04-19 15:31:22 +08:00
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 >