/** * 智能保镖 - 单页面应用 * 此脚本处理页面内容的无刷新加载和路由管理 */ // 缓存已加载的页面内容 const pageCache = {}; // 当前页面 let currentPage = null; // 页面内容预加载状态 let preloadingPages = false; // 页面配置 const pages = { 'live-management': { path: './live-management.html', title: '直播管理 - 智能保镖', isDefault: true, // 设置为默认页面 }, 'smart-bodyguard': { path: './smart-bodyguard.html', title: '保镖设置 - 智能保镖', }, 'id-whitelist-blacklist': { path: './id-whitelist-blacklist.html', title: 'ID黑白名单 - 智能保镖', }, 'id-blacklist': { path: './id-blacklist.html', title: '拉黑记录 - 智能保镖', }, 'logging': { path: './Logging.html', title: '运行日志 - 智能保镖', }, 'tutorial': { path: '#', title: '使用教程 - 智能保镖', }, 'feedback': { path: '#', title: '意见反馈 - 智能保镖', } }; // 提取页面主要内容的函数 function extractMainContent(htmlContent, pageId) { const parser = new DOMParser(); const doc = parser.parseFromString(htmlContent, 'text/html'); // 提取页面样式,确保样式能够正确应用 const styles = doc.querySelectorAll('style'); let styleContent = ''; styles.forEach(style => { styleContent += style.outerHTML; }); // 提取页面主要内容,具体选择器根据页面结构调整 let content; // 非登录页面,直接获取主要内容 content = doc.querySelector('main'); // 如果没有找到main,尝试找其他容器 if (!content) { content = doc.querySelector('.bg-white.rounded-xl') || doc.querySelector('body > .container') || doc.querySelector('body > div'); } // 提取页面的脚本部分,以便执行 const scripts = doc.querySelectorAll('script:not([src])'); const scriptContents = Array.from(scripts).map(script => script.textContent).join('\n'); let contentHtml = ''; if (content) { // 如果找到了内容元素,使用它的HTML contentHtml = content.outerHTML; } else { // 如果没有找到特定内容元素,使用整个body内容 console.warn(`无法在${pageId}页面找到主要内容,使用完整body内容`); contentHtml = doc.body.innerHTML; } return { styles: styleContent, content: contentHtml, scripts: scriptContents }; } // 加载页面内容的函数 async function loadPageContent(pageId) { if (!pages[pageId]) { console.error(`未找到页面: ${pageId}`); return null; } // 如果页面内容已缓存,直接返回 if (pageCache[pageId]) { return pageCache[pageId]; } try { const page = pages[pageId]; // 跳过非实际页面的加载 if (page.path === '#') { return { styles: '', content: '

此功能正在开发中...

', scripts: '' }; } console.log(`正在加载页面: ${page.path}`); const response = await fetch(page.path); if (!response.ok) { throw new Error(`无法加载页面: ${page.path}`); } const html = await response.text(); const extractedContent = extractMainContent(html, pageId); // 缓存页面内容 pageCache[pageId] = extractedContent; console.log(`页面 ${pageId} 加载成功`); return extractedContent; } catch (error) { console.error(`加载页面失败: ${error.message}`); return null; } } // 在后台预加载所有页面内容 async function preloadPages() { if (preloadingPages) return; preloadingPages = true; console.log('开始预加载所有页面...'); for (const pageId in pages) { if (!pageCache[pageId] && pages[pageId].path !== '#') { await loadPageContent(pageId); console.log(`预加载完成: ${pageId}`); } } preloadingPages = false; console.log('所有页面预加载完成'); } // 显示页面的函数 async function showPage(pageId) { console.log(`尝试显示页面: ${pageId}`); if (currentPage === pageId) return; // 加载页面内容 const pageData = await loadPageContent(pageId); if (!pageData) { console.error(`无法显示页面: ${pageId}`); return; } // 更新页面标题 document.title = pages[pageId].title || '智能保镖'; // 获取页面容器 const pageContainer = document.getElementById(`${pageId}-page`); if (!pageContainer) { console.error(`未找到页面容器: ${pageId}-page`); return; } // 隐藏所有页面 document.querySelectorAll('.page-container').forEach(container => { container.classList.remove('active'); }); // 更新导航状态 document.querySelectorAll('.sidebar-item').forEach(item => { item.classList.remove('active'); if (item.getAttribute('data-page') === pageId) { item.classList.add('active'); } }); // 创建一个包含样式和内容的完整HTML let pageHtml = ''; if (pageData.styles) { pageHtml += pageData.styles; } pageHtml += pageData.content; // 设置页面内容 pageContainer.innerHTML = pageHtml; // 执行页面脚本 if (pageData.scripts) { try { console.log(`执行 ${pageId} 页面脚本`); const scriptElement = document.createElement('script'); scriptElement.textContent = pageData.scripts; document.body.appendChild(scriptElement); // 清理,防止重复添加 setTimeout(() => { document.body.removeChild(scriptElement); }, 500); } catch (error) { console.error(`执行页面脚本失败: ${error.message}`); } } // 显示页面 pageContainer.classList.add('active'); currentPage = pageId; console.log(`页面 ${pageId} 已显示`); // 在移动设备上,导航后自动关闭侧边栏 if (window.innerWidth < 1024) { const sidebar = document.getElementById('sidebar'); sidebar.classList.add('hidden'); } // 当显示 live-management 页面时,获取初始账号列表 if (pageId === 'live-management' && window.pywebview && window.pywebview.api) { window.pywebview.api.get_initial_accounts(); } } // 路由处理函数 function handleRoute() { let hash = window.location.hash.substring(1); if (!hash) { // 默认页面处理,直接使用live-management hash = 'live-management'; window.location.hash = `#${hash}`; } console.log(`路由切换到: ${hash}`); showPage(hash); } // 移动端菜单按钮事件 function setupMobileMenu() { const menuButton = document.getElementById('mobile-menu-button'); const sidebar = document.getElementById('sidebar'); if (menuButton && sidebar) { menuButton.addEventListener('click', () => { console.log('按钮点击事件触发'); sidebar.classList.toggle('hidden'); if (!sidebar.classList.contains('hidden')) { sidebar.classList.add('fixed', 'inset-0'); sidebar.classList.remove('lg:block', 'lg:w-64'); } else { sidebar.classList.remove('fixed', 'inset-0'); sidebar.classList.add('lg:block', 'lg:w-64'); } }); } } // 初始化应用 function initApp() { console.log('应用初始化中...'); // 设置路由事件监听 window.addEventListener('hashchange', handleRoute); // 设置移动端菜单 setupMobileMenu(); // 首次加载路由 handleRoute(); // 预加载其他页面,提高用户体验 setTimeout(() => { preloadPages(); }, 1000); console.log('应用初始化完成'); } // 初始化应用 document.addEventListener('DOMContentLoaded', initApp);