| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- const loginForm = document.querySelector('#loginForm');
- const registerForm = document.querySelector('#registerForm');
- const message = document.querySelector('#loginMessage');
- const modeTitle = document.querySelector('#modeTitle');
- const modeEyebrow = document.querySelector('#modeEyebrow');
- const tabs = document.querySelectorAll('[data-mode]');
- const initialParams = new URLSearchParams(window.location.search);
- const initialError = initialParams.get('error');
- if (window.location.search) {
- window.history.replaceState(null, '', window.location.pathname);
- }
- for (const tab of tabs) {
- tab.addEventListener('click', () => setMode(tab.dataset.mode));
- }
- loginForm.addEventListener('submit', async (event) => {
- event.preventDefault();
- await submitAuth('/api/login', loginForm, loginForm.querySelector('button'));
- });
- registerForm.addEventListener('submit', async (event) => {
- event.preventDefault();
- await submitAuth('/api/register', registerForm, registerForm.querySelector('button'));
- });
- if (window.location.pathname === '/register') setMode('register');
- if (initialError) showError(initialError);
- function setMode(mode) {
- const registering = mode === 'register';
- loginForm.classList.toggle('hidden', registering);
- registerForm.classList.toggle('hidden', !registering);
- modeTitle.textContent = registering ? '注册账号' : '登录控制台';
- modeEyebrow.textContent = registering ? 'Register' : 'Sign in';
- for (const tab of tabs) tab.classList.toggle('active', tab.dataset.mode === mode);
- message.textContent = '';
- message.className = 'login-message';
- const input = (registering ? registerForm : loginForm).querySelector('input');
- input?.focus();
- }
- async function submitAuth(path, form, button) {
- message.textContent = '';
- message.className = 'login-message';
- button.disabled = true;
- try {
- const payload = Object.fromEntries(new FormData(form).entries());
- const response = await fetch(path, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify(payload)
- });
- const data = await response.json().catch(() => ({}));
- if (!response.ok) throw new Error(data.error || '请求失败。');
- window.location.href = '/';
- } catch (error) {
- showError(error.message);
- } finally {
- button.disabled = false;
- }
- }
- function showError(text) {
- message.textContent = text;
- message.classList.add('error');
- }
|