/**
* 菜单功能修复脚本
* 修复"启动收银台.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();