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', path: '/cmdb/ci_types',
name: 'ci_type', name: 'ci_type',
component: () => import('../views/ci_types/index'), 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', path: '/cmdb/disabled3',

View File

@ -89,10 +89,12 @@
<script> <script>
import _ from 'lodash' import _ from 'lodash'
import { mapState } from 'vuex'
import { downloadExcel } from '../../../utils/helper' import { downloadExcel } from '../../../utils/helper'
import { getCITypes } from '@/modules/cmdb/api/CIType' import { getCITypes } from '@/modules/cmdb/api/CIType'
import { getCITypeAttributesById } from '@/modules/cmdb/api/CITypeAttr' import { getCITypeAttributesById } from '@/modules/cmdb/api/CITypeAttr'
import { getCITypeParent, getCanEditByParentIdChildId } from '@/modules/cmdb/api/CITypeRelation' import { getCITypeParent, getCanEditByParentIdChildId } from '@/modules/cmdb/api/CITypeRelation'
import { searchPermResourceByRoleId } from '@/modules/acl/api/permission'
export default { export default {
name: 'CiTypeChoice', name: 'CiTypeChoice',
@ -112,9 +114,21 @@ export default {
canEdit: {}, 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) => { 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: { watch: {

View File

@ -1,4 +1,6 @@
import { generatorDynamicRouter, constantRouterMap } from '@/router/config' import { generatorDynamicRouter, constantRouterMap } from '@/router/config'
import { searchPermResourceByRoleId } from '@/modules/acl/api/permission'
import store from '@/store'
import user from './user' import user from './user'
/** /**
* 过滤账户是否拥有某一个权限并将菜单从加载列表移除 * 过滤账户是否拥有某一个权限并将菜单从加载列表移除
@ -7,38 +9,47 @@ import user from './user'
* @param route * @param route
* @returns {boolean} * @returns {boolean}
*/ */
function hasPermission(permission, route) { async function hasPermission(permission, route) {
return new Promise(async (resolve, reject) => {
const { detailPermissions } = user.state const { detailPermissions } = user.state
if (route.meta && route.meta.permission) { 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] 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) { async function filterAsyncRouter(routerMap, roles) {
return routerMap.filter(route => { const filteredRoutes = []
for (let i = 0; i < routerMap.length; i++) {
const route = routerMap[i]
const default_route = ['company_info', 'company_structure', 'company_group'] const default_route = ['company_info', 'company_structure', 'company_group']
if (default_route.includes(route.name)) { 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) { 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 = { const routes = {
state: { state: {
@ -55,8 +66,8 @@ const routes = {
GenerateRoutes({ commit }, data) { GenerateRoutes({ commit }, data) {
return new Promise(resolve => { return new Promise(resolve => {
const { roles } = data const { roles } = data
generatorDynamicRouter().then(routers => { generatorDynamicRouter().then(async routers => {
const accessedRouters = filterAsyncRouter(routers, roles) const accessedRouters = await filterAsyncRouter(routers, roles)
commit('SET_ROUTERS', accessedRouters) commit('SET_ROUTERS', accessedRouters)
resolve(accessedRouters) resolve(accessedRouters)
}) })

View File

@ -54,13 +54,14 @@ const user = {
state.token = token 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.name = name
state.welcome = welcome state.welcome = welcome
state.avatar = avatar state.avatar = avatar
state.roles = roles state.roles = roles
state.info = info state.info = info
state.uid = uid state.uid = uid
state.rid = rid
state.authed = true state.authed = true
state.username = username state.username = username
state.mobile = mobile state.mobile = mobile
@ -149,6 +150,7 @@ const user = {
welcome: welcome(), welcome: welcome(),
avatar: result.avatar, avatar: result.avatar,
uid: result.uid, uid: result.uid,
rid: result.rid,
username: result.username, username: result.username,
mobile: res.mobile, mobile: res.mobile,
department_id: res.department_id, department_id: res.department_id,