feat(ui):批量导入模型根据create权限过滤&&模型配置页面权限 (#323)

This commit is contained in:
wang-liang0615 2023-12-21 14:23:38 +08:00 committed by GitHub
parent 4beece5a6e
commit f143e30cf5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 58 additions and 31 deletions

View File

@ -77,7 +77,7 @@ const genCmdbRoutes = async () => {
path: '/cmdb/ci_types',
name: 'ci_type',
component: () => import('../views/ci_types/index'),
meta: { title: '模型配置', icon: 'ops-cmdb-citype', selectedIcon: 'ops-cmdb-citype-selected', keepAlive: false }
meta: { title: '模型配置', icon: 'ops-cmdb-citype', selectedIcon: 'ops-cmdb-citype-selected', keepAlive: false, permission: ['cmdb_admin', 'admin'] }
},
{
path: '/cmdb/disabled3',

View File

@ -89,10 +89,12 @@
<script>
import _ from 'lodash'
import { mapState } from 'vuex'
import { downloadExcel } from '../../../utils/helper'
import { getCITypes } from '@/modules/cmdb/api/CIType'
import { getCITypeAttributesById } from '@/modules/cmdb/api/CITypeAttr'
import { getCITypeParent, getCanEditByParentIdChildId } from '@/modules/cmdb/api/CITypeRelation'
import { searchPermResourceByRoleId } from '@/modules/acl/api/permission'
export default {
name: 'CiTypeChoice',
@ -112,9 +114,21 @@ export default {
canEdit: {},
}
},
created: function() {
computed: {
...mapState({
rid: (state) => state.user.rid,
}),
},
async created() {
const { resources } = await searchPermResourceByRoleId(this.rid, {
resource_type_id: 'CIType',
app_id: 'cmdb',
})
getCITypes().then((res) => {
this.ciTypeList = res.ci_types
this.ciTypeList = res.ci_types.filter((type) => {
const _findRe = resources.find((re) => re.name === type.name)
return _findRe?.permissions.includes('create') ?? false
})
})
},
watch: {

View File

@ -1,4 +1,6 @@
import { generatorDynamicRouter, constantRouterMap } from '@/router/config'
import { searchPermResourceByRoleId } from '@/modules/acl/api/permission'
import store from '@/store'
import user from './user'
/**
* 过滤账户是否拥有某一个权限并将菜单从加载列表移除
@ -7,38 +9,47 @@ import user from './user'
* @param route
* @returns {boolean}
*/
function hasPermission(permission, route) {
async function hasPermission(permission, route) {
return new Promise(async (resolve, reject) => {
const { detailPermissions } = user.state
if (route.meta && route.meta.permission) {
// let flag = false
// for (let i = 0, len = permission.length; i < len; i++) {
// flag = (route.meta.permission || []).includes(permission[i])
// if (flag) {
// return true
// }
// }
// return false
const totalPer = [...route.meta.appName && detailPermissions[`${route.meta.appName}`] ? detailPermissions[`${route.meta.appName}`].map(item => item.name) : [], ...permission]
return route.meta.permission.some(item => totalPer.includes(item))
let flag = false
if (route.name === 'ci_type') {
await searchPermResourceByRoleId(store.state.user.rid, {
resource_type_id: 'page',
app_id: 'cmdb',
}).then(res => {
const { resources } = res
const _idx = resources.findIndex(item => item.name === '模型配置')
flag = flag || (_idx > -1)
})
}
return true
resolve(route.meta.permission.some(item => totalPer.includes(item)) || flag)
}
resolve(true)
})
}
function filterAsyncRouter(routerMap, roles) {
return routerMap.filter(route => {
async function filterAsyncRouter(routerMap, roles) {
const filteredRoutes = []
for (let i = 0; i < routerMap.length; i++) {
const route = routerMap[i]
const default_route = ['company_info', 'company_structure', 'company_group']
if (default_route.includes(route.name)) {
return true
filteredRoutes.push(route)
}
if (hasPermission(roles.permissions, route)) {
await hasPermission(roles.permissions, route).then(async flag => {
if (flag) {
if (route.children && route.children.length) {
route.children = filterAsyncRouter(route.children, roles)
route.children = await filterAsyncRouter(route.children, roles)
}
return true
filteredRoutes.push(route)
}
return false
})
}
return filteredRoutes
}
const routes = {
state: {
@ -55,8 +66,8 @@ const routes = {
GenerateRoutes({ commit }, data) {
return new Promise(resolve => {
const { roles } = data
generatorDynamicRouter().then(routers => {
const accessedRouters = filterAsyncRouter(routers, roles)
generatorDynamicRouter().then(async routers => {
const accessedRouters = await filterAsyncRouter(routers, roles)
commit('SET_ROUTERS', accessedRouters)
resolve(accessedRouters)
})

View File

@ -54,13 +54,14 @@ const user = {
state.token = token
},
SET_USER_INFO: (state, { name, welcome, avatar, roles, info, uid, username, mobile, department_id, employee_id, email, nickname, sex, position_name, direct_supervisor_id, annual_leave }) => {
SET_USER_INFO: (state, { name, welcome, avatar, roles, info, uid, rid, username, mobile, department_id, employee_id, email, nickname, sex, position_name, direct_supervisor_id, annual_leave }) => {
state.name = name
state.welcome = welcome
state.avatar = avatar
state.roles = roles
state.info = info
state.uid = uid
state.rid = rid
state.authed = true
state.username = username
state.mobile = mobile
@ -149,6 +150,7 @@ const user = {
welcome: welcome(),
avatar: result.avatar,
uid: result.uid,
rid: result.rid,
username: result.username,
mobile: res.mobile,
department_id: res.department_id,