- ShowPage 未登录用户看未发布帖子时引导登录(携带 redirect 参数),替代直接 404 - login.js 无 redirect 参数时回退到同站 Referer 页面 - 404 页面重设计:SVG 图标 + 中文提示 + 返回首页和浏览帖子双按钮 - posts.css 新增 404 页面按钮样式
149 lines
5.8 KiB
JavaScript
149 lines
5.8 KiB
JavaScript
/* ============================================================
|
|
MetaLab Login JS — 登录页面专属脚本
|
|
============================================================ */
|
|
(function () {
|
|
'use strict';
|
|
|
|
var loginForm = document.getElementById('loginForm');
|
|
var emailInput = document.getElementById('email');
|
|
var passwordInput = document.getElementById('password');
|
|
var rememberMeCheckbox = document.getElementById('rememberMe');
|
|
var emailError = document.getElementById('emailError');
|
|
var passwordError = document.getElementById('passwordError');
|
|
var submitBtn = document.getElementById('submitBtn');
|
|
var toast = document.getElementById('toast');
|
|
|
|
if (!loginForm) return;
|
|
|
|
// 读取 redirect 参数(登录成功后跳转目标)
|
|
function getRedirect() {
|
|
var m = window.location.search.match(/[?&]redirect=([^&]+)/);
|
|
if (m) return decodeURIComponent(m[1]);
|
|
// 回退:如果来源页是本站页面,跳回来源页
|
|
try {
|
|
var ref = document.referrer;
|
|
if (ref) {
|
|
var a = document.createElement('a');
|
|
a.href = ref;
|
|
if (a.hostname === window.location.hostname &&
|
|
a.pathname !== window.location.pathname &&
|
|
a.pathname.indexOf('/auth/') !== 0) {
|
|
return a.pathname + a.search + a.hash;
|
|
}
|
|
}
|
|
} catch (e) {}
|
|
return '/';
|
|
}
|
|
|
|
function checkFormValidity() {
|
|
var email = emailInput.value.trim();
|
|
var password = passwordInput.value;
|
|
submitBtn.disabled = !(email && password);
|
|
}
|
|
|
|
emailInput.addEventListener('input', function () {
|
|
var v = emailInput.value.trim();
|
|
if (v && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)) {
|
|
emailInput.classList.add('error');
|
|
emailError.style.display = 'block';
|
|
} else {
|
|
emailInput.classList.remove('error');
|
|
emailError.style.display = 'none';
|
|
}
|
|
checkFormValidity();
|
|
});
|
|
|
|
passwordInput.addEventListener('input', checkFormValidity);
|
|
|
|
loginForm.addEventListener('submit', function (e) {
|
|
e.preventDefault();
|
|
|
|
var email = emailInput.value.trim();
|
|
var password = passwordInput.value;
|
|
|
|
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
|
|
emailInput.classList.add('error');
|
|
emailError.style.display = 'block';
|
|
return;
|
|
}
|
|
if (!password) {
|
|
passwordInput.classList.add('error');
|
|
passwordError.style.display = 'block';
|
|
return;
|
|
}
|
|
|
|
doLogin(email, password);
|
|
});
|
|
|
|
var loginInProgress = false;
|
|
|
|
function doLogin(email, password) {
|
|
if (loginInProgress) return;
|
|
loginInProgress = true;
|
|
submitBtn.disabled = true;
|
|
submitBtn.textContent = '登录中...';
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open('POST', '/api/auth/login', true);
|
|
xhr.setRequestHeader('Content-Type', 'application/json');
|
|
xhr.onreadystatechange = function () {
|
|
if (xhr.readyState === 4) {
|
|
var resp;
|
|
try { resp = JSON.parse(xhr.responseText); } catch (err) { resp = null; }
|
|
|
|
if (xhr.status === 200 && resp && resp.success && resp.action === 'confirm_restore') {
|
|
loginInProgress = false;
|
|
submitBtn.disabled = false;
|
|
submitBtn.textContent = '登录';
|
|
if (confirm(resp.message + '\n\n确认登录将撤销注销并恢复账号。')) {
|
|
doConfirmRestore(email, password);
|
|
}
|
|
} else if (xhr.status === 200 && resp && resp.success) {
|
|
window.MetaLab.toast(toast, '登录成功', false);
|
|
setTimeout(function () {
|
|
window.location.href = getRedirect();
|
|
}, 800);
|
|
} else {
|
|
loginInProgress = false;
|
|
submitBtn.disabled = false;
|
|
submitBtn.textContent = '登录';
|
|
var msg = (resp && resp.message) ? resp.message : '登录失败,请稍后重试';
|
|
window.MetaLab.toast(toast, msg, true);
|
|
}
|
|
}
|
|
};
|
|
xhr.send(JSON.stringify({ email: email, password: password, remember_me: rememberMeCheckbox.checked }));
|
|
}
|
|
|
|
function doConfirmRestore(email, password) {
|
|
if (loginInProgress) return;
|
|
loginInProgress = true;
|
|
submitBtn.disabled = true;
|
|
submitBtn.textContent = '撤销注销中...';
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open('POST', '/api/auth/confirm-restore', true);
|
|
xhr.setRequestHeader('Content-Type', 'application/json');
|
|
xhr.onreadystatechange = function () {
|
|
if (xhr.readyState === 4) {
|
|
var resp;
|
|
try { resp = JSON.parse(xhr.responseText); } catch (err) { resp = null; }
|
|
|
|
if (xhr.status === 200 && resp && resp.success) {
|
|
window.MetaLab.toast(toast, resp.message || '注销已撤销,欢迎回来', false);
|
|
setTimeout(function () {
|
|
window.location.href = getRedirect();
|
|
}, 800);
|
|
} else {
|
|
loginInProgress = false;
|
|
submitBtn.disabled = false;
|
|
submitBtn.textContent = '登录';
|
|
var msg = (resp && resp.message) ? resp.message : '操作失败,请稍后重试';
|
|
window.MetaLab.toast(toast, msg, true);
|
|
}
|
|
}
|
|
};
|
|
xhr.send(JSON.stringify({ email: email, password: password, remember_me: rememberMeCheckbox.checked }));
|
|
}
|
|
})();
|