7.6 KiB
7.6 KiB
工单路由跳转问题完整修复方案
问题描述
点击工单管理页面的"测试中"、"已完成"等按钮时,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。
错误的菜单配置特征:
- parent_id = 2098(工单管理的子菜单)
- menu_type = 'C'(菜单类型)
- path = 'testOrder01' 或 'testWorkOrder02' 等错误路径
- menu_name = '进行中'、'已完成' 等状态名称
- component = 'system/test_order/index'(错误!应该是 test_work_order)
修复步骤
步骤1:诊断问题
运行诊断脚本查看当前菜单配置:
mysql -u your_username -p your_database < check_workorder_submenu.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:备份数据库
在修改前务必备份:
mysqldump -u your_username -p your_database sys_menu > sys_menu_backup.sql
步骤3:删除错误的子菜单
执行删除脚本:
mysql -u your_username -p your_database < delete_wrong_submenu.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:修复父菜单路径
确保工单管理父菜单的路径正确:
UPDATE sys_menu
SET
path = 'test_work_order',
update_time = NOW()
WHERE menu_id = 2098;
步骤5:验证修复结果
-- 查看工单管理的菜单树
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:清除缓存并重新登录
-
清除Redis缓存(如果使用了Redis):
redis-cli FLUSHDB -
重启后端服务:
# 停止服务 # 启动服务 -
清除浏览器缓存:
- 按
Ctrl + Shift + Delete - 或者按
Ctrl + Shift + R强制刷新
- 按
-
重新登录系统:
- 退出登录
- 重新登录
步骤7:测试功能
-
测试菜单导航:
- 点击左侧菜单"工单管理" → "测试工单"
- URL应该是:
http://123.56.98.4:8081/system/test_work_order
-
测试状态筛选按钮:
- 点击"测试中"按钮
- URL应该保持:
http://123.56.98.4:8081/system/test_work_order(不跳转) - 页面应该只显示 testStep=1 的工单
-
测试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
-- 添加"进行中"菜单
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: 需要清除缓存并重新登录:
- 清除Redis缓存
- 重启后端服务
- 清除浏览器缓存(Ctrl+Shift+R)
- 退出并重新登录
Q2: 点击按钮还是会跳转?
A: 检查前端代码是否添加了 .prevent 修饰符:
<el-button @click.prevent="queryParams.testStep = 1; getList()">
测试中
</el-button>
Q3: URL参数不生效?
A: 检查路由监听器是否正确处理了 state 参数(参考 工单状态参数筛选功能实现说明.md)
Q4: 如何确认菜单配置正确?
A: 运行以下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- 菜单配置说明
修复时间线
- ✅ 前端按钮添加
.prevent修饰符 - ✅ 前端路由监听器添加
state参数处理 - ⚠️ 待完成:删除数据库中的错误菜单配置
- ⚠️ 待完成:清除缓存并重新登录
总结
路由跳转问题的根本原因是数据库中存在错误的菜单配置。这些菜单的路径(如 testOrder01、testWorkOrder02)和组件路径(system/test_order/index)都是错误的,导致点击按钮时被这些菜单拦截,跳转到错误的URL。
解决方案:删除这些错误的菜单配置,或者修改为正确的配置。修改后必须清除缓存并重新登录才能生效。