SamsaraDao/login.html
2025-04-19 15:31:22 +08:00

616 lines
26 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>