268 lines
11 KiB
HTML
268 lines
11 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title data-i18n="pageTitle">用户登录/注册 - 黑盒智能</title>
|
|
<script src="lang-1.6.js"></script>
|
|
<style>
|
|
body {
|
|
font-family: Arial, sans-serif;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
height: 100vh;
|
|
margin: 0;
|
|
background-color: #f0f0f0;
|
|
}
|
|
.container {
|
|
background-color: white;
|
|
padding: 3rem;
|
|
border-radius: 12px;
|
|
box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15);
|
|
width: 400px;
|
|
}
|
|
h1 {
|
|
text-align: center;
|
|
color: #000;
|
|
font-size: 2.5rem;
|
|
margin-bottom: 2rem;
|
|
}
|
|
form {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
input {
|
|
margin: 0.75rem 0;
|
|
padding: 0.75rem;
|
|
border: 2px solid #000;
|
|
border-radius: 6px;
|
|
font-size: 1.1rem;
|
|
}
|
|
button {
|
|
margin-top: 1.5rem;
|
|
padding: 0.75rem;
|
|
background-color: #000;
|
|
color: white;
|
|
border: none;
|
|
border-radius: 6px;
|
|
cursor: pointer;
|
|
transition: background-color 0.3s ease;
|
|
font-size: 1.2rem;
|
|
}
|
|
button:hover {
|
|
background-color: #333;
|
|
}
|
|
.error {
|
|
color: #000;
|
|
text-align: center;
|
|
margin-top: 1.5rem;
|
|
font-weight: bold;
|
|
font-size: 1.1rem;
|
|
}
|
|
.toggle-form {
|
|
text-align: center;
|
|
margin-top: 1rem;
|
|
cursor: pointer;
|
|
color: #000;
|
|
text-decoration: underline;
|
|
}
|
|
/* 添加语言选择器样式 */
|
|
#language-selector {
|
|
position: absolute;
|
|
top: 20px;
|
|
right: 20px;
|
|
}
|
|
#language-select {
|
|
padding: 5px 10px;
|
|
font-size: 14px;
|
|
border: 1px solid #000;
|
|
border-radius: 4px;
|
|
background-color: white;
|
|
color: #000;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="language-selector">
|
|
<select id="language-select">
|
|
<option value="zh">中文</option>
|
|
<option value="en">English</option>
|
|
<option value="ko">한국어</option>
|
|
</select>
|
|
</div>
|
|
<div class="container">
|
|
<h1 id="form-title" data-i18n="loginTitle">用户登录</h1>
|
|
<form id="login-form">
|
|
<input type="text" id="username" name="username" data-i18n-placeholder="usernamePlaceholder" placeholder="用户名" required>
|
|
<input type="password" id="password" name="password" data-i18n-placeholder="passwordPlaceholder" placeholder="密码" required>
|
|
<button type="submit" data-i18n="loginButton">登录</button>
|
|
</form>
|
|
<form id="register-form" style="display: none;">
|
|
<input type="text" id="reg-username" name="username" data-i18n-placeholder="usernamePlaceholder" placeholder="用户名" required>
|
|
<input type="email" id="reg-email" name="email" data-i18n-placeholder="emailPlaceholder" placeholder="电子邮箱" required>
|
|
<input type="password" id="reg-password" name="password" data-i18n-placeholder="passwordPlaceholder" placeholder="密码" required>
|
|
<button type="submit" data-i18n="registerButton">注册</button>
|
|
</form>
|
|
<div id="error-message" class="error"></div>
|
|
<div class="toggle-form" id="toggle-form" data-i18n="toggleRegister">注册账号</div>
|
|
</div>
|
|
|
|
<script>
|
|
const BASE_URL = 'https://dev.obscura.work/user';
|
|
const loginForm = document.getElementById('login-form');
|
|
const registerForm = document.getElementById('register-form');
|
|
const formTitle = document.getElementById('form-title');
|
|
const toggleForm = document.getElementById('toggle-form');
|
|
const errorMessage = document.getElementById('error-message');
|
|
const languageSelect = document.getElementById('language-select');
|
|
|
|
// 获取URL参数中的语言设置或使用默认值
|
|
const urlParams = new URLSearchParams(window.location.search);
|
|
let currentLanguage = urlParams.get('lang') || localStorage.getItem('preferredLanguage') || 'zh';
|
|
|
|
// 更新语言函数
|
|
function updateLanguage(lang) {
|
|
currentLanguage = lang;
|
|
localStorage.setItem('preferredLanguage', lang);
|
|
document.documentElement.lang = lang;
|
|
document.querySelectorAll('[data-i18n]').forEach(element => {
|
|
const key = element.getAttribute('data-i18n');
|
|
if (translations[lang][key]) {
|
|
if (element.tagName === 'TITLE') {
|
|
document.title = translations[lang][key];
|
|
} else {
|
|
element.textContent = translations[lang][key];
|
|
}
|
|
}
|
|
});
|
|
document.querySelectorAll('[data-i18n-placeholder]').forEach(element => {
|
|
const key = element.getAttribute('data-i18n-placeholder');
|
|
if (translations[lang][key]) {
|
|
element.placeholder = translations[lang][key];
|
|
}
|
|
});
|
|
}
|
|
|
|
// 语言选择器事件监听器
|
|
languageSelect.addEventListener('change', function() {
|
|
updateLanguage(this.value);
|
|
});
|
|
|
|
// 在页面加载时初始化语言
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
languageSelect.value = currentLanguage;
|
|
updateLanguage(currentLanguage);
|
|
});
|
|
|
|
// 保留原有的表单切换逻辑
|
|
toggleForm.addEventListener('click', () => {
|
|
if (loginForm.style.display === 'none') {
|
|
loginForm.style.display = 'flex';
|
|
registerForm.style.display = 'none';
|
|
formTitle.textContent = translations[currentLanguage].loginTitle;
|
|
toggleForm.textContent = translations[currentLanguage].toggleRegister;
|
|
} else {
|
|
loginForm.style.display = 'none';
|
|
registerForm.style.display = 'flex';
|
|
formTitle.textContent = translations[currentLanguage].registerTitle;
|
|
toggleForm.textContent = translations[currentLanguage].toggleLogin;
|
|
}
|
|
errorMessage.textContent = '';
|
|
});
|
|
|
|
// 修改登录表单提交逻辑,添加语言参数
|
|
loginForm.addEventListener('submit', async (e) => {
|
|
e.preventDefault();
|
|
console.log('登录表单提交');
|
|
const username = document.getElementById('username').value;
|
|
const password = document.getElementById('password').value;
|
|
|
|
try {
|
|
console.log('开始发送登录请求');
|
|
const response = await fetch(`${BASE_URL}/token`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
},
|
|
body: `username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`,
|
|
});
|
|
|
|
console.log('收到响应:', response.status);
|
|
|
|
if (response.ok) {
|
|
const data = await response.json();
|
|
console.log('登录成功,获取到的数据:', data);
|
|
localStorage.setItem('access_token', data.access_token);
|
|
|
|
// 获取用户信息
|
|
const userInfoResponse = await fetch(`${BASE_URL}/user-info`, {
|
|
headers: {
|
|
'Authorization': `Bearer ${data.access_token}`
|
|
}
|
|
});
|
|
|
|
if (userInfoResponse.ok) {
|
|
const userInfo = await userInfoResponse.json();
|
|
localStorage.setItem('user_info', JSON.stringify(userInfo));
|
|
}
|
|
|
|
// 登录成功后跳转时带上语言参数
|
|
window.location.href = `https://beta.obscura.work/space.html?lang=${currentLanguage}`;
|
|
} else {
|
|
const errorData = await response.json();
|
|
console.error('登录失败:', errorData);
|
|
errorMessage.textContent = errorData.detail || '登录失败,请检查用户名和密码';
|
|
}
|
|
} catch (error) {
|
|
console.error('登录出错:', error);
|
|
errorMessage.textContent = '登录时发生错误,请稍后再试。';
|
|
}
|
|
});
|
|
|
|
registerForm.addEventListener('submit', async (e) => {
|
|
e.preventDefault();
|
|
console.log('注册表单提交');
|
|
const username = document.getElementById('reg-username').value;
|
|
const email = document.getElementById('reg-email').value;
|
|
const password = document.getElementById('reg-password').value;
|
|
|
|
try {
|
|
console.log('开始发送注册请求');
|
|
const response = await fetch(`${BASE_URL}/register`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({ username, email, password }),
|
|
});
|
|
|
|
console.log('收到响应:', response.status);
|
|
|
|
if (response.ok) {
|
|
const data = await response.json();
|
|
console.log('注册成功,获取到的数据:', data);
|
|
errorMessage.textContent = '注册成功,请登录';
|
|
loginForm.style.display = 'flex';
|
|
registerForm.style.display = 'none';
|
|
formTitle.textContent = '用户登录';
|
|
toggleForm.textContent = '注册账号';
|
|
} else {
|
|
const errorData = await response.json();
|
|
console.error('注册失败:', errorData);
|
|
errorMessage.textContent = errorData.detail || '注册失败,请稍后再试';
|
|
}
|
|
} catch (error) {
|
|
console.error('注册出错:', error);
|
|
errorMessage.textContent = '注册时发生错误,请稍后再试。';
|
|
}
|
|
});
|
|
|
|
// 页面加载完成后的调试信息
|
|
window.addEventListener('load', () => {
|
|
console.log('页面加载完成,登录/注册表单就绪');
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|