# 工单路由跳转问题完整修复方案 ## 问题描述 点击工单管理页面的"测试中"、"已完成"等按钮时,URL跳转到错误的路径: - 错误URL示例:`http://123.56.98.4:8081/test_work_order/testWorkOrder02?page=work_order&state=1` - 正确URL应该是:`http://123.56.98.4:8081/system/test_work_order?state=1` ## 根本原因 数据库中存在错误的菜单配置,这些菜单拦截了按钮的点击事件,导致路由跳转到错误的URL。 ### 错误的菜单配置特征: 1. **parent_id = 2098**(工单管理的子菜单) 2. **menu_type = 'C'**(菜单类型) 3. **path = 'testOrder01'** 或 **'testWorkOrder02'** 等错误路径 4. **menu_name = '进行中'、'已完成'** 等状态名称 5. **component = 'system/test_order/index'**(错误!应该是 test_work_order) ## 修复步骤 ### 步骤1:诊断问题 运行诊断脚本查看当前菜单配置: ```bash mysql -u your_username -p your_database < check_workorder_submenu.sql ``` 或者在数据库客户端中执行: ```sql -- 查看工单管理的所有子菜单 SELECT menu_id, menu_name, parent_id, path, component, query, menu_type FROM sys_menu WHERE parent_id = 2098 ORDER BY order_num; ``` **预期结果**:应该只有一个子菜单"测试工单"(menu_id=2092) **实际结果**:可能有多个错误的子菜单(进行中、已完成等) ### 步骤2:备份数据库 在修改前务必备份: ```bash mysqldump -u your_username -p your_database sys_menu > sys_menu_backup.sql ``` ### 步骤3:删除错误的子菜单 执行删除脚本: ```bash mysql -u your_username -p your_database < delete_wrong_submenu.sql ``` 或者手动执行: ```sql -- 删除所有状态相关的错误子菜单 DELETE FROM sys_menu WHERE parent_id = 2098 AND menu_type = 'C' AND menu_name IN ('进行中', '已完成', '测试中', '待领取', '一审中', '二审中', '三审中', '全部工单'); -- 删除包含错误路径的菜单 DELETE FROM sys_menu WHERE parent_id = 2098 AND path IN ('testOrder01', 'testWorkOrder02'); ``` ### 步骤4:修复父菜单路径 确保工单管理父菜单的路径正确: ```sql UPDATE sys_menu SET path = 'test_work_order', update_time = NOW() WHERE menu_id = 2098; ``` ### 步骤5:验证修复结果 ```sql -- 查看工单管理的菜单树 SELECT m1.menu_id as parent_id, m1.menu_name as parent_name, m1.path as parent_path, m2.menu_id as child_id, m2.menu_name as child_name, m2.path as child_path, m2.component as child_component, m2.menu_type as child_type FROM sys_menu m1 LEFT JOIN sys_menu m2 ON m1.menu_id = m2.parent_id WHERE m1.menu_id = 2098 ORDER BY m2.order_num; ``` **正确的结果应该是**: | parent_id | parent_name | parent_path | child_id | child_name | child_path | child_component | child_type | |-----------|-------------|-------------|----------|------------|------------|-----------------|------------| | 2098 | 工单管理 | test_work_order | 2092 | 测试工单 | test_work_order | system/test_work_order/index | C | ### 步骤6:清除缓存并重新登录 1. **清除Redis缓存**(如果使用了Redis): ```bash redis-cli FLUSHDB ``` 2. **重启后端服务**: ```bash # 停止服务 # 启动服务 ``` 3. **清除浏览器缓存**: - 按 `Ctrl + Shift + Delete` - 或者按 `Ctrl + Shift + R` 强制刷新 4. **重新登录系统**: - 退出登录 - 重新登录 ### 步骤7:测试功能 1. **测试菜单导航**: - 点击左侧菜单"工单管理" → "测试工单" - URL应该是:`http://123.56.98.4:8081/system/test_work_order` 2. **测试状态筛选按钮**: - 点击"测试中"按钮 - URL应该保持:`http://123.56.98.4:8081/system/test_work_order`(不跳转) - 页面应该只显示 testStep=1 的工单 3. **测试URL参数**: - 访问:`http://123.56.98.4:8081/system/test_work_order?state=0` - 应该显示测试中的工单 - 访问:`http://123.56.98.4:8081/system/test_work_order?state=1` - 应该显示已完成的工单 ## 如果需要保留状态子菜单 如果您确实需要在菜单中显示"进行中"、"已完成"等快捷入口,请按以下方式配置: ### 正确的菜单配置 **进行中菜单**: - 菜单名称:进行中 - 上级菜单:工单管理(menu_id=2098) - 菜单类型:菜单(C) - 路由地址:`test_work_order`(不是 testOrder01) - 组件路径:`system/test_work_order/index`(不是 test_order) - 路由参数:`{"state": 0}` - 权限字符:`system:test_work_order:list` - 显示顺序:2 **已完成菜单**: - 菜单名称:已完成 - 上级菜单:工单管理(menu_id=2098) - 菜单类型:菜单(C) - 路由地址:`test_work_order`(不是 testWorkOrder02) - 组件路径:`system/test_work_order/index`(不是 test_order) - 路由参数:`{"state": 1}` - 权限字符:`system:test_work_order:list` - 显示顺序:3 ### 添加菜单的SQL ```sql -- 添加"进行中"菜单 INSERT INTO sys_menu ( menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, icon, create_time ) VALUES ( '进行中', 2098, 2, 'test_work_order', 'system/test_work_order/index', '{"state": 0}', 1, 0, 'C', '0', '0', 'system:test_work_order:list', 'education', NOW() ); -- 添加"已完成"菜单 INSERT INTO sys_menu ( menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, icon, create_time ) VALUES ( '已完成', 2098, 3, 'test_work_order', 'system/test_work_order/index', '{"state": 1}', 1, 0, 'C', '0', '0', 'system:test_work_order:list', 'education', NOW() ); ``` ## 常见问题 ### Q1: 删除菜单后还是跳转错误? **A**: 需要清除缓存并重新登录: 1. 清除Redis缓存 2. 重启后端服务 3. 清除浏览器缓存(Ctrl+Shift+R) 4. 退出并重新登录 ### Q2: 点击按钮还是会跳转? **A**: 检查前端代码是否添加了 `.prevent` 修饰符: ```vue 测试中 ``` ### Q3: URL参数不生效? **A**: 检查路由监听器是否正确处理了 `state` 参数(参考 `工单状态参数筛选功能实现说明.md`) ### Q4: 如何确认菜单配置正确? **A**: 运行以下SQL查询: ```sql SELECT menu_id, menu_name, parent_id, path, component, query FROM sys_menu WHERE parent_id = 2098 ORDER BY order_num; ``` 应该只看到"测试工单"这一个子菜单,或者您手动添加的正确配置的子菜单。 ## 相关文件 - `check_workorder_submenu.sql` - 诊断脚本 - `delete_wrong_submenu.sql` - 删除错误菜单脚本 - `fix_workorder_menu_path.sql` - 修复父菜单路径脚本 - `工单状态参数筛选功能实现说明.md` - state参数功能说明 - `工单按钮点击事件修复说明.md` - 按钮事件修复说明 - `工单菜单错误子菜单修复说明.md` - 菜单配置说明 ## 修复时间线 1. ✅ 前端按钮添加 `.prevent` 修饰符 2. ✅ 前端路由监听器添加 `state` 参数处理 3. ⚠️ **待完成:删除数据库中的错误菜单配置** 4. ⚠️ **待完成:清除缓存并重新登录** ## 总结 路由跳转问题的根本原因是数据库中存在错误的菜单配置。这些菜单的路径(如 testOrder01、testWorkOrder02)和组件路径(system/test_order/index)都是错误的,导致点击按钮时被这些菜单拦截,跳转到错误的URL。 **解决方案**:删除这些错误的菜单配置,或者修改为正确的配置。修改后必须清除缓存并重新登录才能生效。