mirror of
https://github.com/zhinianboke/xianyu-auto-reply.git
synced 2025-08-30 09:37:35 +08:00
172 lines
5.1 KiB
JavaScript
172 lines
5.1 KiB
JavaScript
// ==================== 应用初始化 ====================
|
|
|
|
// 登出功能
|
|
async function logout() {
|
|
try {
|
|
if (authToken) {
|
|
await fetch('/logout', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Authorization': `Bearer ${authToken}`
|
|
}
|
|
});
|
|
}
|
|
localStorage.removeItem('auth_token');
|
|
window.location.href = '/';
|
|
} catch (err) {
|
|
console.error('登出失败:', err);
|
|
localStorage.removeItem('auth_token');
|
|
window.location.href = '/';
|
|
}
|
|
}
|
|
|
|
// 检查认证状态
|
|
async function checkAuth() {
|
|
if (!authToken) {
|
|
window.location.href = '/';
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch('/verify', {
|
|
headers: {
|
|
'Authorization': `Bearer ${authToken}`
|
|
}
|
|
});
|
|
const result = await response.json();
|
|
|
|
if (!result.authenticated) {
|
|
localStorage.removeItem('auth_token');
|
|
window.location.href = '/';
|
|
return false;
|
|
}
|
|
|
|
// 检查是否为管理员,显示管理员菜单和功能
|
|
if (result.username === 'admin') {
|
|
const adminMenuSection = document.getElementById('adminMenuSection');
|
|
if (adminMenuSection) {
|
|
adminMenuSection.style.display = 'block';
|
|
}
|
|
|
|
// 显示备份管理功能
|
|
const backupManagement = document.getElementById('backup-management');
|
|
if (backupManagement) {
|
|
backupManagement.style.display = 'block';
|
|
}
|
|
}
|
|
|
|
return true;
|
|
} catch (err) {
|
|
localStorage.removeItem('auth_token');
|
|
window.location.href = '/';
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// 初始化事件监听
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
// 首先检查认证状态
|
|
const isAuthenticated = await checkAuth();
|
|
if (!isAuthenticated) return;
|
|
|
|
// 添加Cookie表单提交
|
|
document.getElementById('addForm').addEventListener('submit', async (e) => {
|
|
e.preventDefault();
|
|
const id = document.getElementById('cookieId').value.trim();
|
|
const value = document.getElementById('cookieValue').value.trim();
|
|
|
|
if (!id || !value) return;
|
|
|
|
try {
|
|
await fetchJSON(apiBase + '/cookies', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ id, value })
|
|
});
|
|
|
|
document.getElementById('cookieId').value = '';
|
|
document.getElementById('cookieValue').value = '';
|
|
showToast(`账号 "${id}" 添加成功`);
|
|
loadCookies();
|
|
} catch (err) {
|
|
// 错误已在fetchJSON中处理
|
|
}
|
|
});
|
|
|
|
// 增强的键盘快捷键和用户体验
|
|
document.getElementById('newKeyword')?.addEventListener('keypress', function (e) {
|
|
if (e.key === 'Enter') {
|
|
e.preventDefault();
|
|
document.getElementById('newReply').focus();
|
|
}
|
|
});
|
|
|
|
document.getElementById('newReply')?.addEventListener('keypress', function (e) {
|
|
if (e.key === 'Enter') {
|
|
e.preventDefault();
|
|
addKeyword();
|
|
}
|
|
});
|
|
|
|
// ESC键取消编辑
|
|
document.addEventListener('keydown', function (e) {
|
|
if (e.key === 'Escape' && typeof window.editingIndex !== 'undefined') {
|
|
e.preventDefault();
|
|
cancelEdit();
|
|
}
|
|
});
|
|
|
|
// 输入框实时验证和提示
|
|
document.getElementById('newKeyword')?.addEventListener('input', function (e) {
|
|
const value = e.target.value.trim();
|
|
const addBtn = document.querySelector('.add-btn');
|
|
const replyInput = document.getElementById('newReply');
|
|
|
|
if (value.length > 0) {
|
|
e.target.style.borderColor = '#10b981';
|
|
if (replyInput.value.trim().length > 0) {
|
|
addBtn.style.opacity = '1';
|
|
addBtn.style.transform = 'scale(1)';
|
|
}
|
|
} else {
|
|
e.target.style.borderColor = '#e5e7eb';
|
|
addBtn.style.opacity = '0.7';
|
|
addBtn.style.transform = 'scale(0.95)';
|
|
}
|
|
});
|
|
|
|
document.getElementById('newReply')?.addEventListener('input', function (e) {
|
|
const value = e.target.value.trim();
|
|
const addBtn = document.querySelector('.add-btn');
|
|
const keywordInput = document.getElementById('newKeyword');
|
|
|
|
if (value.length > 0) {
|
|
e.target.style.borderColor = '#10b981';
|
|
if (keywordInput.value.trim().length > 0) {
|
|
addBtn.style.opacity = '1';
|
|
addBtn.style.transform = 'scale(1)';
|
|
}
|
|
} else {
|
|
e.target.style.borderColor = '#e5e7eb';
|
|
addBtn.style.opacity = '0.7';
|
|
addBtn.style.transform = 'scale(0.95)';
|
|
}
|
|
});
|
|
|
|
// 初始加载仪表盘
|
|
loadDashboard();
|
|
|
|
// 点击侧边栏外部关闭移动端菜单
|
|
document.addEventListener('click', function (e) {
|
|
const sidebar = document.getElementById('sidebar');
|
|
const toggle = document.querySelector('.mobile-toggle');
|
|
|
|
if (window.innerWidth <= 768 &&
|
|
!sidebar.contains(e.target) &&
|
|
!toggle.contains(e.target) &&
|
|
sidebar.classList.contains('show')) {
|
|
sidebar.classList.remove('show');
|
|
}
|
|
});
|
|
});
|