功能更新:新增Bug管理模块,完善用户角色分配,优化项目设置

This commit is contained in:
qiaoxinjiu
2026-05-07 19:43:05 +08:00
parent 916248483c
commit f8211673ee
44 changed files with 10410 additions and 437 deletions

View File

@@ -2,6 +2,8 @@
<div class="page-wrap">
<page-section title="菜单管理">
<template slot="extra">
<el-button size="small" :loading="initPermissionMenuLoading" @click="initPermissionMenu">初始化权限管理菜单</el-button>
<el-button size="small" :loading="initBugMenuLoading" @click="initBugManagementMenu">初始化 Bug 管理菜单</el-button>
<el-button type="primary" size="small" @click="openCreate(0)">新建菜单</el-button>
</template>
<el-form :inline="true" :model="queryForm" size="small" @submit.native.prevent>
@@ -163,6 +165,8 @@ export default {
return {
loading: false,
submitting: false,
initPermissionMenuLoading: false,
initBugMenuLoading: false,
dialogVisible: false,
dialogMode: 'create',
queryForm: {
@@ -307,6 +311,179 @@ export default {
this.fetchTree()
})
}).catch(() => {})
},
initPermissionMenu() {
this.initPermissionMenuLoading = true
getMenuTree({}).then(res => {
const data = res && res.data ? res.data : res || []
const tree = Array.isArray(data) ? data : (data.list || data.items || [])
const flattened = []
this.flattenMenus(tree, flattened)
let systemMenu = flattened.find(item => {
const path = item.path || ''
const name = item.name || ''
return path === '/system' || name === '系统管理'
})
const hasPermissionMenu = flattened.some(item => (item.path || '') === '/system/permission')
const createPermissionChild = parentId => {
if (hasPermissionMenu) {
this.$message.success('权限管理菜单已存在')
return Promise.resolve()
}
return createMenu({
parentId: Number(parentId || 0),
name: '权限管理',
code: 'system_permission_manage',
type: 2,
path: '/system/permission',
component: '@/components/System/PermissionManage',
icon: 'lock',
permissionCode: 'permission:list',
sort: 40,
visible: 1,
status: 1
})
}
if (systemMenu) {
return createPermissionChild(systemMenu.id || systemMenu.menuId)
}
return createMenu({
parentId: 0,
name: '系统管理',
code: 'system_manage',
type: 1,
path: '/system',
component: '',
icon: 'setting',
permissionCode: '',
sort: 90,
visible: 1,
status: 1
}).then(createRes => {
const created = (createRes && createRes.data) || {}
const parentId = created.id || created.menuId
if (parentId) {
return createPermissionChild(parentId)
}
// 如果接口不返回id则重新拉取菜单树定位系统管理菜单
return getMenuTree({}).then(latestRes => {
const latestData = latestRes && latestRes.data ? latestRes.data : latestRes || []
const latestTree = Array.isArray(latestData) ? latestData : (latestData.list || latestData.items || [])
const latestFlattened = []
this.flattenMenus(latestTree, latestFlattened)
const latestSystem = latestFlattened.find(item => (item.path || '') === '/system' || (item.name || '') === '系统管理')
return createPermissionChild(latestSystem ? (latestSystem.id || latestSystem.menuId) : 0)
})
})
}).then(() => {
this.$message.success('权限管理菜单初始化完成')
this.fetchTree()
}).catch(() => {
this.$message.error('初始化权限管理菜单失败')
}).finally(() => {
this.initPermissionMenuLoading = false
})
},
initBugManagementMenu() {
this.initBugMenuLoading = true
getMenuTree({}).then(res => {
const data = res && res.data ? res.data : res || []
const tree = Array.isArray(data) ? data : (data.list || data.items || [])
const flattened = []
this.flattenMenus(tree, flattened)
const hasBugMenu = flattened.some(item => String(item.path || '').indexOf('/bug') === 0)
if (hasBugMenu) {
this.$message.success('Bug 管理菜单已存在')
return Promise.resolve()
}
return createMenu({
parentId: 0,
name: 'Bug管理',
code: 'bug_manage_root',
type: 1,
path: '/bug',
component: '',
icon: 'el-icon-s-claim',
permissionCode: '',
sort: 88,
visible: 1,
status: 1
}).then(parentRes => {
const created = (parentRes && parentRes.data) || {}
let parentId = created.id || created.menuId
const resolveParentId = () => {
if (parentId) return Promise.resolve(parentId)
return getMenuTree({}).then(latestRes => {
const latestData = latestRes && latestRes.data ? latestRes.data : latestRes || []
const latestTree = Array.isArray(latestData) ? latestData : (latestData.list || latestData.items || [])
const flat = []
this.flattenMenus(latestTree, flat)
const p = flat.find(item => (item.path || '') === '/bug' || (item.code || '') === 'bug_manage_root')
return p ? (p.id || p.menuId) : 0
})
}
return resolveParentId().then(pid => {
if (!pid) {
return Promise.reject(new Error('未获取到 Bug 管理父菜单 ID'))
}
const children = [
{
name: '新建 Bug',
code: 'bug_create',
path: '/bug/create',
component: '@/components/Bug/BugEditor',
permissionCode: 'bug:create',
sort: 5,
icon: 'el-icon-document-add'
},
{
name: 'Bug 列表',
code: 'bug_list',
path: '/bug/list',
component: '@/components/Bug/BugList',
permissionCode: 'bug:list',
sort: 10,
icon: 'el-icon-document'
},
{
name: 'Bug 统计',
code: 'bug_stats',
path: '/bug/stats',
component: '@/components/Bug/BugStats',
permissionCode: 'bug:stats',
sort: 20,
icon: 'el-icon-data-line'
}
]
return children.reduce((chain, c) => {
return chain.then(() => createMenu({
parentId: Number(pid),
name: c.name,
code: c.code,
type: 2,
path: c.path,
component: c.component,
icon: c.icon,
permissionCode: c.permissionCode,
sort: c.sort,
visible: 1,
status: 1
}))
}, Promise.resolve())
})
})
}).then(() => {
this.$message.success('Bug 管理菜单初始化完成')
this.fetchTree()
}).catch(() => {
this.$message.error('初始化 Bug 管理菜单失败')
}).finally(() => {
this.initBugMenuLoading = false
})
}
},
created() {