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:
fit2bot
2022-03-09 15:36:38 +08:00
committed by GitHub
parent 833dd305bf
commit 5897c52268
9 changed files with 93 additions and 60 deletions

View File

@@ -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 = ''

View File

@@ -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,

View File

@@ -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') {