|
|
|
@ -55,13 +55,20 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@keyframes float {
|
|
|
|
@keyframes float {
|
|
|
|
0%, 100% { transform: translate(0, 0); }
|
|
|
|
|
|
|
|
50% { transform: translate(30px, 20px); }
|
|
|
|
0%,
|
|
|
|
|
|
|
|
100% {
|
|
|
|
|
|
|
|
transform: translate(0, 0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50% {
|
|
|
|
|
|
|
|
transform: translate(30px, 20px);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 主容器 */
|
|
|
|
/* 主容器 */
|
|
|
|
.container {
|
|
|
|
.container {
|
|
|
|
background-color: var(--bg-color);
|
|
|
|
background-color: var(--color-primary-text);
|
|
|
|
border-radius: var(--radius-xl);
|
|
|
|
border-radius: var(--radius-xl);
|
|
|
|
box-shadow: var(--shadow-xl);
|
|
|
|
box-shadow: var(--shadow-xl);
|
|
|
|
position: relative;
|
|
|
|
position: relative;
|
|
|
|
@ -77,7 +84,7 @@
|
|
|
|
top: 0;
|
|
|
|
top: 0;
|
|
|
|
height: 100%;
|
|
|
|
height: 100%;
|
|
|
|
transition: all 0.6s ease-in-out;
|
|
|
|
transition: all 0.6s ease-in-out;
|
|
|
|
background: var(--bg-color);
|
|
|
|
background: var(--color-primary-text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.sign-in-container {
|
|
|
|
.sign-in-container {
|
|
|
|
@ -105,8 +112,18 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@keyframes show {
|
|
|
|
@keyframes show {
|
|
|
|
0%, 49.99% { opacity: 0; z-index: 1; }
|
|
|
|
|
|
|
|
50%, 100% { opacity: 1; z-index: 5; }
|
|
|
|
0%,
|
|
|
|
|
|
|
|
49.99% {
|
|
|
|
|
|
|
|
opacity: 0;
|
|
|
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50%,
|
|
|
|
|
|
|
|
100% {
|
|
|
|
|
|
|
|
opacity: 1;
|
|
|
|
|
|
|
|
z-index: 5;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.form-container-inner {
|
|
|
|
.form-container-inner {
|
|
|
|
@ -184,7 +201,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
.tab-item.active {
|
|
|
|
.tab-item.active {
|
|
|
|
color: var(--color-primary);
|
|
|
|
color: var(--color-primary);
|
|
|
|
background: var(--bg-color);
|
|
|
|
background: var(--color-primary-text);
|
|
|
|
box-shadow: var(--shadow-sm);
|
|
|
|
box-shadow: var(--shadow-sm);
|
|
|
|
font-weight: 600;
|
|
|
|
font-weight: 600;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -198,10 +215,6 @@
|
|
|
|
margin-bottom: 10px;
|
|
|
|
margin-bottom: 10px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.input-wrapper {
|
|
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.phone-row {
|
|
|
|
.phone-row {
|
|
|
|
display: flex;
|
|
|
|
display: flex;
|
|
|
|
gap: 10px;
|
|
|
|
gap: 10px;
|
|
|
|
@ -259,7 +272,7 @@
|
|
|
|
background-repeat: no-repeat;
|
|
|
|
background-repeat: no-repeat;
|
|
|
|
background-size: cover;
|
|
|
|
background-size: cover;
|
|
|
|
background-position: 0 0;
|
|
|
|
background-position: 0 0;
|
|
|
|
color: #fff;
|
|
|
|
color: var(--color-primary-text);
|
|
|
|
position: relative;
|
|
|
|
position: relative;
|
|
|
|
left: -100%;
|
|
|
|
left: -100%;
|
|
|
|
height: 100%;
|
|
|
|
height: 100%;
|
|
|
|
@ -288,7 +301,7 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.overlay-panel h1 {
|
|
|
|
.overlay-panel h1 {
|
|
|
|
color: #fff;
|
|
|
|
color: var(--color-primary-text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.overlay-panel p {
|
|
|
|
.overlay-panel p {
|
|
|
|
@ -296,7 +309,7 @@
|
|
|
|
font-weight: 300;
|
|
|
|
font-weight: 300;
|
|
|
|
line-height: 24px;
|
|
|
|
line-height: 24px;
|
|
|
|
margin: 20px 0 30px;
|
|
|
|
margin: 20px 0 30px;
|
|
|
|
color: rgba(255, 255, 255, 0.9);
|
|
|
|
color: color-mix(in srgb, var(--color-primary-text), transparent 10%);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.overlay-left {
|
|
|
|
.overlay-left {
|
|
|
|
@ -316,24 +329,9 @@
|
|
|
|
transform: translateX(20%);
|
|
|
|
transform: translateX(20%);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 按钮覆盖样式 */
|
|
|
|
/* 按钮覆盖样式 - REMOVED to avoid conflict with internal styles */
|
|
|
|
.btn-ghost {
|
|
|
|
|
|
|
|
background-color: transparent;
|
|
|
|
|
|
|
|
border-color: #fff;
|
|
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.btn-ghost:hover {
|
|
|
|
|
|
|
|
background-color: rgba(255, 255, 255, 0.1);
|
|
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* v-btn 通用样式微调 */
|
|
|
|
|
|
|
|
v-btn {
|
|
|
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
|
|
|
letter-spacing: 0.5px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* v-btn 通用样式微调 - REMOVED to avoid conflict with internal styles */
|
|
|
|
</style>
|
|
|
|
</style>
|
|
|
|
</head>
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
|
|
@ -361,37 +359,28 @@
|
|
|
|
<div class="subtitle" style="margin: 0 0 15px; font-size: 12px;">或使用手机/邮箱注册</div>
|
|
|
|
<div class="subtitle" style="margin: 0 0 15px; font-size: 12px;">或使用手机/邮箱注册</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="input-group">
|
|
|
|
<div class="input-group">
|
|
|
|
<div class="input-wrapper">
|
|
|
|
<v-input v:value="signUpForm.username" placeholder="用户名"></v-input>
|
|
|
|
<v-input v:value="signUpForm.username" placeholder="用户名" prefix-icon="fa fa-user"></v-input>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 手机号输入框带区域选择 -->
|
|
|
|
<!-- 手机号输入框带区域选择 -->
|
|
|
|
<div v-if='$G.cfg.sms' class="phone-row">
|
|
|
|
<div v-if='$G.cfg.sms' class="phone-row">
|
|
|
|
<div style="width: 110px;">
|
|
|
|
<v-input type="select" v:value="signUpForm.region" :opts="{options: regions}"></v-input>
|
|
|
|
<v-input type="select" v:value="signUpForm.region" :opts="{options: regions}" :clearable="false"></v-input>
|
|
|
|
<v-input v:value="signUpForm.phone" placeholder="手机号"></v-input>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div style="flex: 1;">
|
|
|
|
|
|
|
|
<v-input v:value="signUpForm.phone" placeholder="手机号" prefix-icon="fa fa-mobile"></v-input>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div v-if='$G.cfg.sms' class="verify-row">
|
|
|
|
<div v-if='$G.cfg.sms' class="verify-row">
|
|
|
|
<div style="flex: 1;">
|
|
|
|
<v-input v:value="signUpForm.verifyCode" placeholder="验证码"></v-input>
|
|
|
|
<v-input v:value="signUpForm.verifyCode" placeholder="验证码" prefix-icon="fa fa-shield"></v-input>
|
|
|
|
<v-btn variant="outline" :disabled="smsCountdown > 0 || smsLoading" :click="() => sendVerifyCode('signup')"
|
|
|
|
</div>
|
|
|
|
style="min-width: 100px;">
|
|
|
|
<v-btn variant="outline" :disabled="smsCountdown > 0 || smsLoading" :click="() => sendVerifyCode('signup')" style="min-width: 100px;">
|
|
|
|
|
|
|
|
{{ smsCountdown > 0 ? `${smsCountdown}s` : '获取验证码' }}
|
|
|
|
{{ smsCountdown > 0 ? `${smsCountdown}s` : '获取验证码' }}
|
|
|
|
</v-btn>
|
|
|
|
</v-btn>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="input-wrapper">
|
|
|
|
<v-input type="password" v:value="signUpForm.password" placeholder="密码"></v-input>
|
|
|
|
<v-input type="password" v:value="signUpForm.password" placeholder="密码" prefix-icon="fa fa-lock"></v-input>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="error-message">{{ signUpError }}</div>
|
|
|
|
<div class="error-message">{{ signUpError }}</div>
|
|
|
|
|
|
|
|
|
|
|
|
<v-btn round block size="large" :loading="signUpLoading" :click="handleSignUp">立即注册</v-btn>
|
|
|
|
<v-btn round block size="lg" :loading="signUpLoading" :click="handleSignUp">立即注册</v-btn>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
@ -421,30 +410,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 用户名登录 -->
|
|
|
|
<!-- 用户名登录 -->
|
|
|
|
<div v-if="loginType === 'username'" class="input-group">
|
|
|
|
<div v-if="loginType === 'username'" class="input-group">
|
|
|
|
<div class="input-wrapper">
|
|
|
|
<v-input v:value="signInForm.username" placeholder="用户名"></v-input>
|
|
|
|
<v-input v:value="signInForm.username" placeholder="用户名" prefix-icon="fa fa-user"></v-input>
|
|
|
|
<v-input type="password" v:value="signInForm.password" placeholder="密码"></v-input>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="input-wrapper">
|
|
|
|
|
|
|
|
<v-input type="password" v:value="signInForm.password" placeholder="密码" prefix-icon="fa fa-lock"></v-input>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 手机号登录 -->
|
|
|
|
<!-- 手机号登录 -->
|
|
|
|
<div v-if="loginType === 'phone'" class="input-group">
|
|
|
|
<div v-if="loginType === 'phone'" class="input-group">
|
|
|
|
<div class="phone-row">
|
|
|
|
<div class="phone-row">
|
|
|
|
<div style="width: 110px;">
|
|
|
|
<v-input type="select" v:value="signInForm.region" :opts="{options: regions}"></v-input>
|
|
|
|
<v-input type="select" v:value="signInForm.region" :opts="{options: regions}" :clearable="false"></v-input>
|
|
|
|
<v-input v:value="signInForm.phone" placeholder="手机号"></v-input>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div style="flex: 1;">
|
|
|
|
|
|
|
|
<v-input v:value="signInForm.phone" placeholder="手机号" prefix-icon="fa fa-mobile"></v-input>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="verify-row">
|
|
|
|
<div class="verify-row">
|
|
|
|
<div style="flex: 1;">
|
|
|
|
<v-input v:value="signInForm.verifyCode" placeholder="验证码"></v-input>
|
|
|
|
<v-input v:value="signInForm.verifyCode" placeholder="验证码" prefix-icon="fa fa-shield"></v-input>
|
|
|
|
<v-btn variant="outline" :disabled="smsCountdown > 0 || smsLoading" :click="() => sendVerifyCode('signin')"
|
|
|
|
</div>
|
|
|
|
style="min-width: 100px;">
|
|
|
|
<v-btn variant="outline" :disabled="smsCountdown > 0 || smsLoading" :click="() => sendVerifyCode('signin')" style="min-width: 100px;">
|
|
|
|
|
|
|
|
{{ smsCountdown > 0 ? `${smsCountdown}s` : '获取验证码' }}
|
|
|
|
{{ smsCountdown > 0 ? `${smsCountdown}s` : '获取验证码' }}
|
|
|
|
</v-btn>
|
|
|
|
</v-btn>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
@ -453,7 +433,7 @@
|
|
|
|
<a href="#" class="forgot-password">忘记密码?</a>
|
|
|
|
<a href="#" class="forgot-password">忘记密码?</a>
|
|
|
|
<div class="error-message">{{ signInError }}</div>
|
|
|
|
<div class="error-message">{{ signInError }}</div>
|
|
|
|
|
|
|
|
|
|
|
|
<v-btn round block size="large" :loading="signInLoading" :click="handleSignIn">登 录</v-btn>
|
|
|
|
<v-btn round block size="lg" :loading="signInLoading" :click="handleSignIn">登 录</v-btn>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
@ -463,12 +443,14 @@
|
|
|
|
<div class="overlay-panel overlay-left">
|
|
|
|
<div class="overlay-panel overlay-left">
|
|
|
|
<h1>已有账户?</h1>
|
|
|
|
<h1>已有账户?</h1>
|
|
|
|
<p>请使用您的个人信息登录,保持连接。</p>
|
|
|
|
<p>请使用您的个人信息登录,保持连接。</p>
|
|
|
|
<v-btn variant="outline" round class="btn-ghost" :click="switchToSignIn" size="large" style="width: 120px;">去登录</v-btn>
|
|
|
|
<v-btn variant="outline" round class="btn-ghost" :click="switchToSignIn" size="lg"
|
|
|
|
|
|
|
|
style="width: 120px;">去登录</v-btn>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="overlay-panel overlay-right">
|
|
|
|
<div class="overlay-panel overlay-right">
|
|
|
|
<h1>新朋友?</h1>
|
|
|
|
<h1>新朋友?</h1>
|
|
|
|
<p>输入您的个人信息,开始您的旅程。</p>
|
|
|
|
<p>输入您的个人信息,开始您的旅程。</p>
|
|
|
|
<v-btn variant="outline" round class="btn-ghost" :click="switchToSignUp" size="large" style="width: 120px;">去注册</v-btn>
|
|
|
|
<v-btn variant="outline" round class="btn-ghost" :click="switchToSignUp" size="lg"
|
|
|
|
|
|
|
|
style="width: 120px;">去注册</v-btn>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
@ -679,4 +661,5 @@
|
|
|
|
};
|
|
|
|
};
|
|
|
|
</script>
|
|
|
|
</script>
|
|
|
|
</body>
|
|
|
|
</body>
|
|
|
|
|
|
|
|
|
|
|
|
</html>
|
|
|
|
</html>
|
|
|
|
|