281 lines
8.5 KiB
JavaScript
281 lines
8.5 KiB
JavaScript
// 接管手机端底部音乐按钮
|
|
function modify_m_bottom_music_button_link() {
|
|
const music = document.querySelector('a[href*="#m_bottom_music_button"]');
|
|
if (!music) return;
|
|
music.addEventListener('click', function (event) {
|
|
event.preventDefault();
|
|
if (!box_up) mu_box_show();
|
|
else mu_box_hide(0);
|
|
});
|
|
}
|
|
|
|
// 视频默认正方形,播放恢复比例(接入灯箱后已无用)
|
|
// function modify_moment_video_size() {
|
|
// const videos = document.querySelectorAll('.pix_video');
|
|
// videos.forEach(video => {
|
|
// if (!video.hasAttribute('data-video-events-bound')) {
|
|
// video.addEventListener('play', () => {
|
|
// video.classList.add('is-playing');
|
|
// });
|
|
// video.addEventListener('ended', () => {
|
|
// video.classList.remove('is-playing');
|
|
// });
|
|
// video.setAttribute('data-video-events-bound', 'true');
|
|
// }
|
|
// });
|
|
// }
|
|
|
|
// 登录逻辑
|
|
let csrfToken = '';
|
|
let publicKey = '';
|
|
let loginTimer = null;
|
|
let countdownSeconds = 3;
|
|
const login_modal = document.getElementById('customLoginModal');
|
|
const login_closeBtn = document.getElementById('closeLoginModal');
|
|
const login_loginBtn = document.getElementById('customLoginBtn');
|
|
|
|
// 获取令牌及公钥
|
|
async function fetchCSRFToken() {
|
|
login_modal.classList.add('show');
|
|
login_loginBtn.disabled = true;
|
|
login_loginBtn.textContent = '加载中...';
|
|
|
|
try {
|
|
const response = await fetch('/login', { credentials: 'include' });
|
|
if (response.url.includes('/uc')) {
|
|
return 'logged';
|
|
}
|
|
const htmlText = await response.text();
|
|
const parser = new DOMParser();
|
|
const doc = parser.parseFromString(htmlText, 'text/html');
|
|
// 获取 CSRF Token
|
|
const csrfInput = doc.querySelector('input[name="_csrf"]');
|
|
if (!csrfInput || !csrfInput.value) {
|
|
throw new Error('页面未找到 CSRF 令牌');
|
|
}
|
|
csrfToken = csrfInput.value;
|
|
// 获取 PublicKey
|
|
const publicKeyMatch = htmlText.match(/const publicKey = "([^"]+)";/);
|
|
if (!publicKeyMatch || !publicKeyMatch[1]) {
|
|
throw new Error('页面未找到 PublicKey');
|
|
}
|
|
publicKey = publicKeyMatch[1].replace(/\\\//g, '/');
|
|
return 'ok';
|
|
} catch (err) {
|
|
return 'error';
|
|
}
|
|
}
|
|
|
|
// 打开弹窗逻辑
|
|
async function open_login_box() {
|
|
if (loginTimer) {
|
|
clearInterval(loginTimer);
|
|
}
|
|
countdownSeconds = 3;
|
|
const success = await fetchCSRFToken();
|
|
if (success === 'logged') {
|
|
cocoMessage.success('您已经署名过了,请刷新');
|
|
login_modal.classList.remove('show');
|
|
} else if (success === 'ok') {
|
|
loginTimer = setInterval(() => {
|
|
if (countdownSeconds > 0) {
|
|
login_loginBtn.textContent = '请稍等...' + countdownSeconds;
|
|
} else {
|
|
clearInterval(loginTimer);
|
|
login_loginBtn.textContent = '署 名';
|
|
login_loginBtn.disabled = false;
|
|
}
|
|
countdownSeconds--;
|
|
}, 1000);
|
|
} else {
|
|
cocoMessage.error('服务器错误,请刷新');
|
|
login_modal.classList.remove('show');
|
|
}
|
|
}
|
|
|
|
// 关闭弹窗
|
|
login_closeBtn.addEventListener('click', () => {
|
|
login_modal.classList.remove('show');
|
|
});
|
|
|
|
// 加密逻辑
|
|
function encryptPassword(password) {
|
|
try {
|
|
const encrypt = new JSEncrypt();
|
|
encrypt.setPublicKey(publicKey);
|
|
return encrypt.encrypt(password);
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// 提交登录
|
|
login_loginBtn.addEventListener('click', async () => {
|
|
const username = document.getElementById('customUsername').value.trim();
|
|
const password = document.getElementById('customPassword').value.trim();
|
|
if (!username || !password) {
|
|
cocoMessage.warning('请先填写信息');
|
|
return;
|
|
}
|
|
const encryptedPwd = encryptPassword(password);
|
|
login_loginBtn.disabled = true;
|
|
login_loginBtn.textContent = '验证中...';
|
|
try {
|
|
countdownSeconds = 3
|
|
const response = await fetch('/login', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
},
|
|
credentials: 'include',
|
|
body: new URLSearchParams({
|
|
_csrf: csrfToken,
|
|
username: username,
|
|
password: encryptedPwd,
|
|
'remember-me': 'true'
|
|
})
|
|
});
|
|
// 核心细节:判断最终落点 URL
|
|
const finalUrl = response.url;
|
|
if (loginTimer) {
|
|
clearInterval(loginTimer);
|
|
}
|
|
if (finalUrl.includes('/uc')) {
|
|
cocoMessage.success('署名成功,正在跳转...');
|
|
login_loginBtn.textContent = '跳转中...';
|
|
const currentScrollTop = window.scrollY || document.documentElement.scrollTop;
|
|
$.cookie('scrollParam', currentScrollTop, { path: '/', domain: 'anian.cc' });
|
|
$.cookie('load_type', 'login', { path: '/', domain: 'anian.cc' });
|
|
window.location.reload();
|
|
} else if (finalUrl.includes('error=invalid-credential')) {
|
|
cocoMessage.warning('署名人与心上锁不匹配');
|
|
fetchCSRFToken();
|
|
} else {
|
|
cocoMessage.error('速度过快,请稍后重试');
|
|
}
|
|
} catch (err) {
|
|
cocoMessage.error('服务器连接失败');
|
|
} finally {
|
|
loginTimer = setInterval(() => {
|
|
if (countdownSeconds > 0) {
|
|
login_loginBtn.textContent = '请稍等...' + countdownSeconds;
|
|
} else {
|
|
clearInterval(loginTimer);
|
|
login_loginBtn.textContent = '署 名';
|
|
login_loginBtn.disabled = false;
|
|
}
|
|
countdownSeconds--;
|
|
}, 1000);
|
|
}
|
|
});
|
|
|
|
// 回车登录
|
|
document.addEventListener("keydown", function (e) {
|
|
if (e.key === "Enter") {
|
|
const modal = document.getElementById("customLoginModal");
|
|
if (modal.classList.contains("show")) {
|
|
document.getElementById("customLoginBtn").click();
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
// 退出登录
|
|
async function customLogout() {
|
|
$('.pixar-notice-btn-confirm, .pixar-notice-btn-close').prop('disabled', true);
|
|
let closeLoading = cocoMessage.loading('退出登录中...');
|
|
try {
|
|
const getResponse = await fetch('/logout', { credentials: 'include' });
|
|
const htmlText = await getResponse.text();
|
|
const parser = new DOMParser();
|
|
const doc = parser.parseFromString(htmlText, 'text/html');
|
|
const logoutCsrfToken = doc.querySelector('input[name="_csrf"]')?.value;
|
|
if (!logoutCsrfToken) {
|
|
cocoMessage.error('页面未找到 CSRF 令牌');
|
|
$('.pixar-notice-btn-confirm, .pixar-notice-btn-close').prop('disabled', false);
|
|
closeLoading();
|
|
return;
|
|
}
|
|
const postResponse = await fetch('/logout', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
},
|
|
credentials: 'include',
|
|
body: new URLSearchParams({
|
|
'_csrf': logoutCsrfToken
|
|
})
|
|
});
|
|
if (postResponse.ok) {
|
|
closeLoading();
|
|
cocoMessage.success('您已成功退出登录');
|
|
const currentScrollTop = window.scrollY || document.documentElement.scrollTop;
|
|
$.cookie('scrollParam', currentScrollTop, { path: '/', domain: 'anian.cc' });
|
|
$.cookie('load_type', 'logout', { path: '/', domain: 'anian.cc' });
|
|
window.location.reload();
|
|
} else {
|
|
closeLoading();
|
|
$('.pixar-notice-btn-confirm, .pixar-notice-btn-close').prop('disabled', false);
|
|
throw new Error('退出请求被拒绝');
|
|
}
|
|
} catch (err) {
|
|
closeLoading();
|
|
$('.pixar-notice-btn-confirm, .pixar-notice-btn-close').prop('disabled', false);
|
|
console.error('Logout Error:', err);
|
|
cocoMessage.error('退出失败,请手动刷新页面');
|
|
}
|
|
}
|
|
|
|
function open_logout_box() {
|
|
const wrapper = document.getElementById("pixarNoticeWrapper");
|
|
wrapper.style.display = "flex";
|
|
}
|
|
|
|
function hidePixarCard() {
|
|
const wrapper = document.getElementById("pixarNoticeWrapper");
|
|
wrapper.style.display = "none";
|
|
}
|
|
|
|
function confirmPixarAction() {
|
|
customLogout();
|
|
}
|
|
|
|
// 打开确认模态框
|
|
function openModal(title, msg, type) {
|
|
var modal = $('#momentsDeleteModal');
|
|
var card = modal.find('.moments-card-widget');
|
|
modal.find('.moments-title-text').text(title);
|
|
modal.find('.moments-message-text').text(msg);
|
|
card.removeClass('theme-red theme-yellow theme-green').addClass('theme-' + type);
|
|
$('.moments-btn-cancel, .moments-btn-confirm').prop('disabled', false);
|
|
modal.fadeIn(200);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// = = = = = = = = = = = = = = = = 触发器 = = = = = = = = = = = = = = = =
|
|
|
|
// 集合:PJAX(初始化执行+PJAX执行)
|
|
function init_anian_pjax() {
|
|
// modify_moment_video_size();
|
|
}
|
|
|
|
// 集合:初始化(仅初始化执行一次)
|
|
function init_anian_inport() {
|
|
init_anian_pjax();
|
|
modify_m_bottom_music_button_link();
|
|
}
|
|
|
|
// PJAX监听
|
|
document.addEventListener('pjax:complete', function () {
|
|
init_anian_pjax();
|
|
})
|
|
|
|
// 入口
|
|
init_anian_inport(); |