fix: menu 和 roles 的交互异常

This commit is contained in:
zhangrongliang
2026-04-22 10:40:32 +08:00
parent 4395d9fb22
commit f3476a8eec
3 changed files with 18109 additions and 13028 deletions

31045
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -10,39 +10,36 @@
text-color="#fff"
active-text-color="#ffd04b"
:router="true">
<el-menu-item index="/effekt">
<i class="el-icon-house"></i>
<span slot="title">首页</span>
</el-menu-item>
<el-submenu index="test-platform">
<template slot="title">
<i class="el-icon-s-operation"></i>
<span slot="title">测试协作工作台</span>
</template>
<el-menu-item index="/test-platform/products">产品管理</el-menu-item>
<el-menu-item index="/test-platform/projects">项目管理</el-menu-item>
<el-menu-item index="/test-platform/cases">用例管理</el-menu-item>
<el-menu-item index="/test-platform/plans">测试计划</el-menu-item>
<el-menu-item index="/test-platform/reports">测试报告</el-menu-item>
</el-submenu>
<el-submenu index="create-tool">
<template slot="title">
<i class="el-icon-setting"></i>
<span slot="title">测试工具</span>
</template>
<el-menu-item index="/create/data">数据库造数</el-menu-item>
<el-menu-item index="/create/interface">接口造数</el-menu-item>
<el-menu-item index="/test-platform/data-factory/builders">造数工厂</el-menu-item>
</el-submenu>
<el-submenu index="system-manage">
<template slot="title">
<i class="el-icon-user-solid"></i>
<span slot="title">系统管理</span>
</template>
<el-menu-item index="/system/roles">角色管理</el-menu-item>
<el-menu-item index="/system/users">用户管理</el-menu-item>
<el-menu-item index="/system/menus">菜单管理</el-menu-item>
</el-submenu>
<template v-for="menu in displayMenus">
<el-submenu v-if="menu.children && menu.children.length > 0" :index="menuIndex(menu)" :key="'sub-' + menuKey(menu)">
<template slot="title">
<i :class="menuIcon(menu)"></i>
<span slot="title">{{ menu.name }}</span>
</template>
<template v-for="child in menu.children">
<!-- 处理可能有第三级菜单的情况 -->
<el-submenu v-if="child.children && child.children.length > 0" :index="menuIndex(child)" :key="'child-sub-' + menuKey(child)">
<template slot="title">
<i v-if="child.icon" :class="menuIcon(child)"></i>
<span slot="title">{{ child.name }}</span>
</template>
<el-menu-item v-for="subChild in child.children" :index="menuPath(subChild)" :key="'subchild-item-' + menuKey(subChild)">
<i v-if="subChild.icon" :class="menuIcon(subChild)"></i>
<span slot="title">{{ subChild.name }}</span>
</el-menu-item>
</el-submenu>
<!-- 只有两级菜单 -->
<el-menu-item v-else :index="menuPath(child)" :key="'child-item-' + menuKey(child)">
<i v-if="child.icon" :class="menuIcon(child)"></i>
<span slot="title">{{ child.name }}</span>
</el-menu-item>
</template>
</el-submenu>
<el-menu-item v-else :index="menuPath(menu)" :key="'item-' + menuKey(menu)">
<i :class="menuIcon(menu)"></i>
<span slot="title">{{ menu.name }}</span>
</el-menu-item>
</template>
</el-menu>
</div>
<el-container>
@@ -127,6 +124,27 @@ export default {
return pathMap[item.path] || item.path || '/effekt'
},
menuIcon(item) {
// 按照原来的静态菜单名称映射图标
const nameIconMap = {
'首页': 'el-icon-house',
'测试协作工作台': 'el-icon-s-operation',
'测试平台': 'el-icon-s-platform',
'产品管理': 'el-icon-box',
'项目管理': 'el-icon-s-management',
'用例管理': 'el-icon-document',
'测试计划': 'el-icon-date',
'测试报告': 'el-icon-data-line',
'测试工具': 'el-icon-s-tools',
'造数工具': 'el-icon-magic-stick',
'数据库造数': 'el-icon-coin',
'造数工厂': 'el-icon-set-up',
'系统管理': 'el-icon-setting',
'角色管理': 'el-icon-user-solid',
'用户管理': 'el-icon-user',
'权限管理': 'el-icon-lock',
'菜单管理': 'el-icon-menu'
}
const iconMap = {
setting: 'el-icon-setting',
peoples: 'el-icon-user-solid',
@@ -134,6 +152,11 @@ export default {
lock: 'el-icon-lock',
menu: 'el-icon-menu'
}
// 优先级:先匹配名称,再匹配接口中指定的 icon最后返回默认图标 el-icon-menu
if (item.name && nameIconMap[item.name]) {
return nameIconMap[item.name]
}
return iconMap[item.icon] || (item.icon && item.icon.indexOf('el-icon-') === 0 ? item.icon : 'el-icon-menu')
},
filterMenus(menus) {

View File

@@ -92,7 +92,6 @@
node-key="id"
show-checkbox
default-expand-all
check-strictly
:props="treeProps">
</el-tree>
</el-form-item>
@@ -107,7 +106,7 @@
<script>
import PageSection from '@/components/TestPlatform/common/PageSection'
import { assignRoleMenus, createRole, deleteRole, getMenuTree, getRoleMenuList, getRoleMenuTree, updateRole } from '@/api/rbacApi'
import { assignRoleMenus, createRole, deleteRole, getMenuTree, getRoleMenuList, getRoleMenuTree, getRolePageList, updateRole } from '@/api/rbacApi'
const getDefaultForm = () => ({
roleId: undefined,