/**
* 智能保镖 - 单页面应用
* 此脚本处理页面内容的无刷新加载和路由管理
*/
// 缓存已加载的页面内容
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);