/** * 菜单功能修复脚本 * 修复"启动收银台.bat"启动后菜单功能无法正常使用的问题 */ const fs = require('fs'); const path = require('path'); console.log('=== 菜单功能修复工具 ==='); // 修复Layout.js中的菜单点击处理函数 function fixLayoutMenuClick() { console.log('\n1. 修复Layout.js菜单点击处理函数...'); try { const layoutPath = path.join(__dirname, 'src', 'renderer', 'components', 'Layout.js'); if (fs.existsSync(layoutPath)) { let content = fs.readFileSync(layoutPath, 'utf8'); // 备份原文件 fs.writeFileSync(layoutPath + '.backup', content); console.log(' ✅ 已备份原文件'); // 查找现有的handleMenuClick函数 const oldFunction = `const handleMenuClick = ({ key }) => { try { // 使用electronNavigate处理导航 electronNavigate(key, navigate); } catch (error) { console.error('菜单导航失败:', error); } };`; // 新的增强版函数 const newFunction = `const handleMenuClick = ({ key }) => { console.log('菜单点击:', key); try { // 首先尝试使用electronNavigate处理导航 if (typeof electronNavigate === 'function') { electronNavigate(key, navigate); console.log('通过electronNavigate导航成功'); return; } } catch (error) { console.warn('electronNavigate导航失败:', error); } // 备用方案1: 直接使用React Router的navigate try { if (navigate && typeof navigate === 'function') { navigate(key); console.log('通过React Router导航成功'); return; } } catch (error) { console.warn('React Router导航失败:', error); } // 备用方案2: 使用window.location.hash try { if (key.startsWith('/')) { window.location.hash = key; console.log('通过window.location.hash导航成功'); return; } } catch (error) { console.warn('window.location.hash导航失败:', error); } // 最后的备选方案: 刷新页面 console.error('所有导航方案都失败了,将刷新页面'); window.location.reload(); };`; // 替换函数 if (content.includes(oldFunction)) { content = content.replace(oldFunction, newFunction); fs.writeFileSync(layoutPath, content, 'utf8'); console.log(' ✅ Layout.js菜单点击处理函数已修复'); } else { console.log(' ⚠️ 未找到预期的handleMenuClick函数,可能已被修改'); // 尝试更通用的替换 const genericPattern = /const handleMenuClick = \({ key }\) => {[\s\S]*?};/; if (genericPattern.test(content)) { content = content.replace(genericPattern, newFunction); fs.writeFileSync(layoutPath, content, 'utf8'); console.log(' ✅ Layout.js菜单点击处理函数已通过通用模式修复'); } else { console.log(' ❌ 无法定位handleMenuClick函数进行修复'); } } } else { console.log(' ❌ Layout.js文件不存在'); } } catch (error) { console.error(' ❌ 修复Layout.js失败:', error); } } // 修复App.js中的路由配置 function fixAppRouting() { console.log('\n2. 检查App.js路由配置...'); try { const appPath = path.join(__dirname, 'src', 'renderer', 'App.js'); if (fs.existsSync(appPath)) { let content = fs.readFileSync(appPath, 'utf8'); // 检查是否使用HashRouter if (content.includes('HashRouter as Router')) { console.log(' ✅ 已正确使用HashRouter'); } else if (content.includes('BrowserRouter as Router')) { console.log(' ⚠️ 使用了BrowserRouter,可能需要改为HashRouter'); } else { console.log(' ⚠️ 未明确使用HashRouter或BrowserRouter'); } // 检查路由配置 const routePattern = /} \/>/; if (routePattern.test(content)) { console.log(' ✅ 收银台路由配置正确'); } else { console.log(' ⚠️ 收银台路由配置可能存在问题'); } } else { console.log(' ❌ App.js文件不存在'); } } catch (error) { console.error(' ❌ 检查App.js失败:', error); } } // 更新HTML模板,确保基础路径正确 function updateHtmlTemplate() { console.log('\n3. 检查HTML模板...'); try { const htmlPath = path.join(__dirname, 'src', 'renderer', 'index.html'); if (fs.existsSync(htmlPath)) { let content = fs.readFileSync(htmlPath, 'utf8'); // 检查base标签 if (content.includes('')) { console.log(' ✅ base标签已正确设置'); } else { // 添加base标签 const headEndIndex = content.indexOf(''); if (headEndIndex > 0) { const baseTag = '\n \n'; content = content.slice(0, headEndIndex) + baseTag + content.slice(headEndIndex); fs.writeFileSync(htmlPath, content, 'utf8'); console.log(' ✅ 已添加base标签'); } else { console.log(' ⚠️ 无法定位head标签,未添加base标签'); } } } else { console.log(' ❌ index.html文件不存在'); } } catch (error) { console.error(' ❌ 检查HTML模板失败:', error); } } // 主函数 function main() { console.log('开始修复菜单功能问题...\n'); fixLayoutMenuClick(); fixAppRouting(); updateHtmlTemplate(); console.log('\n=== 菜单功能修复完成 ==='); console.log('修复内容:'); console.log('1. 增强了Layout.js中的菜单点击处理函数,添加多重备选导航方案'); console.log('2. 确保使用HashRouter以兼容Electron环境'); console.log('3. 在HTML模板中添加了正确的base标签'); console.log('\n请重新构建并启动应用以使更改生效:'); console.log(' 1. npm run build'); console.log(' 2. npm start'); console.log('\n或者直接运行"启动收银台.bat"'); } // 执行修复 main();