mirror of
https://github.com/jumpserver/lina.git
synced 2026-01-29 21:28:52 +00:00
perf: 优化权限判断 (#1413)
* stash: 暂存 api 权限判断 * perf: 优化列表权限判断,通过 url 来 * perf: 优化权限判断 * perf: remove console * perf: 还原默认值 * perf: 修改 detail * perf: 修改路由 * perf: 修改路由 * perf: 修复 table perm * perf: 修改 home Co-authored-by: ibuler <ibuler@qq.com>
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
:date-pick="handleDateChange"
|
||||
:selected-rows="selectedRows"
|
||||
:reload-table="reloadTable"
|
||||
v-bind="headerActions"
|
||||
v-bind="iHeaderActions"
|
||||
/>
|
||||
<IBox class="table-content">
|
||||
<AutoDataTable
|
||||
@@ -25,7 +25,9 @@ import AutoDataTable from '../AutoDataTable'
|
||||
import IBox from '../IBox'
|
||||
import TableAction from './TableAction'
|
||||
import Emitter from '@/mixins/emitter'
|
||||
import { getResourceFromApiUrl } from '@/utils/jms'
|
||||
import deepmerge from 'deepmerge'
|
||||
import { mapGetters } from 'vuex'
|
||||
|
||||
export default {
|
||||
name: 'ListTable',
|
||||
@@ -55,17 +57,64 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['currentOrgIsRoot']),
|
||||
dataTable() {
|
||||
return this.$refs.dataTable.$refs.dataTable
|
||||
},
|
||||
iHeaderActions() {
|
||||
const actions = {
|
||||
canCreate: { action: 'add', checkRoot: true },
|
||||
hasBulkDelete: { action: 'delete', checkRoot: false },
|
||||
hasBulkUpdate: { action: 'change', checkRoot: true },
|
||||
hasImport: { action: 'add', checkRoot: true },
|
||||
hasExport: { action: 'view', checkRoot: false }
|
||||
}
|
||||
const defaults = {}
|
||||
for (const [k, v] of Object.entries(actions)) {
|
||||
defaults[k] = this.hasActionPerm(v.action)
|
||||
if (v.checkRoot) {
|
||||
defaults[k] = defaults[k] && !this.currentOrgIsRoot
|
||||
}
|
||||
}
|
||||
return Object.assign(defaults, this.headerActions)
|
||||
},
|
||||
iTableConfig() {
|
||||
const config = deepmerge(this.tableConfig, { extraQuery: this.extraQuery })
|
||||
const config = deepmerge(this.tableConfig, {
|
||||
extraQuery: this.extraQuery
|
||||
})
|
||||
const formatterArgs = {
|
||||
'columnsMeta.actions.formatterArgs.canUpdate': 'change',
|
||||
'columnsMeta.actions.formatterArgs.canDelete': 'delete',
|
||||
'columnsMeta.actions.formatterArgs.canClone': 'add',
|
||||
'columnsMeta.name.formatterArgs.can': 'view'
|
||||
}
|
||||
for (const [arg, action] of Object.entries(formatterArgs)) {
|
||||
const notSet = _.get(config, arg) === undefined
|
||||
if (notSet) {
|
||||
_.set(config, arg, this.hasActionPerm(action))
|
||||
}
|
||||
}
|
||||
this.$log.debug('Header actions', this.headerActions)
|
||||
this.$log.debug('ListTable: iTableConfig change', config)
|
||||
return config
|
||||
},
|
||||
tableUrl() {
|
||||
return this.iTableConfig.url
|
||||
return this.tableConfig.url
|
||||
},
|
||||
permissions() {
|
||||
// 获取 permissions,获取不到通过 url 解析
|
||||
const permissions = this.tableConfig.permissions || {}
|
||||
const { app: apiApp, resource: apiResource } = getResourceFromApiUrl(this.tableUrl)
|
||||
const app = permissions.app || apiApp
|
||||
const resource = permissions.resource || apiResource
|
||||
const actions = ['add', 'change', 'delete', 'view']
|
||||
const defaultPermissions = actions.reduce((result, action) => {
|
||||
result[action] = `${app}.${action}_${resource}`
|
||||
return result
|
||||
}, {})
|
||||
const perms = Object.assign(defaultPermissions, permissions)
|
||||
this.$log.debug('Permissions: ', perms)
|
||||
return perms
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
@@ -97,6 +146,10 @@ export default {
|
||||
this.$emit('TagFilter', attrs)
|
||||
this.$refs.dataTable.$refs.dataTable.search(attrs, true)
|
||||
},
|
||||
hasActionPerm(action) {
|
||||
const permRequired = this.permissions[action]
|
||||
return this.$hasPerm(permRequired)
|
||||
},
|
||||
handleDateChange(attrs) {
|
||||
let dateFrom = ''
|
||||
let dateTo = ''
|
||||
|
||||
@@ -84,19 +84,11 @@ export default {
|
||||
default: function() {
|
||||
return {
|
||||
hasUpdate: true, // can set function(row, value)
|
||||
canUpdate: () => {
|
||||
const notRootOrg = !this.$store.getters.currentOrgIsRoot
|
||||
return notRootOrg && this.$hasCurrentResAction('change')
|
||||
}, // can set function(row, value)
|
||||
canUpdate: true, // can set function(row, value)
|
||||
hasDelete: true, // can set function(row, value)
|
||||
canDelete: () => {
|
||||
return this.$hasCurrentResAction('delete')
|
||||
},
|
||||
canDelete: true,
|
||||
hasClone: true,
|
||||
canClone: () => {
|
||||
const notRootOrg = !this.$store.getters.currentOrgIsRoot
|
||||
return notRootOrg && this.$hasCurrentResAction('add')
|
||||
},
|
||||
canClone: true,
|
||||
updateRoute: this.$route.name.replace('List', 'Update'),
|
||||
cloneRoute: this.$route.name.replace('List', 'Create'),
|
||||
performDelete: defaultPerformDelete,
|
||||
|
||||
@@ -16,10 +16,7 @@ export default {
|
||||
route: this.$route.name.replace('List', 'Detail'),
|
||||
getRoute: null,
|
||||
routeQuery: null,
|
||||
permissions: this.$getCurrentResActionPerms('view'),
|
||||
can: (col) => {
|
||||
return this.$hasPerm(this.formatterArgs.permissions)
|
||||
},
|
||||
can: true,
|
||||
getTitle({ col, row, cellValue }) {
|
||||
return cellValue
|
||||
}
|
||||
@@ -42,7 +39,11 @@ export default {
|
||||
})
|
||||
},
|
||||
disabled() {
|
||||
return !this.formatterArgs.can(this.col)
|
||||
let can = this.formatterArgs.can
|
||||
if (typeof can === 'function') {
|
||||
can = can(this.col)
|
||||
}
|
||||
return !can
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -60,13 +61,14 @@ export default {
|
||||
console.error('No route found')
|
||||
return
|
||||
}
|
||||
let detailRoute = {}
|
||||
let detailRoute = { replace: true }
|
||||
if (typeof route === 'string') {
|
||||
detailRoute.name = route
|
||||
detailRoute.params = { id: this.row.id }
|
||||
} else {
|
||||
detailRoute = route
|
||||
}
|
||||
console.log('Route: ', detailRoute)
|
||||
|
||||
const routeQuery = this.formatterArgs.routeQuery
|
||||
if (routeQuery && typeof routeQuery === 'object') {
|
||||
|
||||
Reference in New Issue
Block a user