You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
9.3 KiB
312 lines
9.3 KiB
<template> |
|
<el-dialog ref="wf-dialog" |
|
custom-class="wf-dialog" |
|
:visible.sync="visible" |
|
title="权限配置" |
|
width="60%" |
|
:before-close="handleClose" |
|
append-to-body> |
|
<p v-if="all" style="padding: 0 20px;">不限制权限,所有人均可发起:<el-switch v-model="switchAll"></el-switch>(平台需单独配置)</p> |
|
<el-table v-if="visible" |
|
class="avue-crud" |
|
:data="data" |
|
border |
|
size="mini"> |
|
<el-table-column align="center" |
|
header-align="center" |
|
width="80"> |
|
<template #header> |
|
<el-button circle |
|
type="primary" |
|
size="mini" |
|
icon="el-icon-plus" |
|
@click="data.push({})"></el-button> |
|
</template> |
|
<template #default="{$index}"> |
|
<el-button circle |
|
type="danger" |
|
size="mini" |
|
icon="el-icon-delete" |
|
@click="data.splice($index, 1)"></el-button> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="类型" |
|
prop="type" |
|
align="center" |
|
header-align="center"> |
|
<template #default="{row, $index}"> |
|
<el-select v-model="row.type" |
|
size="mini" |
|
placeholder="类型" |
|
@change="handleTypeChange($index)"> |
|
<el-option v-for="item in typeList" |
|
:key="item.value" |
|
:label="item.label" |
|
:value="item.value" |
|
:disabled="Boolean(data.find(d => d.type == item.value)) || (switchAll && !['platform'].includes(item.value))"></el-option> |
|
</el-select> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="值" |
|
prop="text" |
|
align="center" |
|
header-align="center"> |
|
<template #default="{row, $index}"> |
|
<template v-if="row.type == 'user'"> |
|
<el-input v-model="row.text" |
|
size="mini" |
|
placeholder="用户" |
|
readonly |
|
@click.native="handleSelect($index, 'user-select')"> |
|
<template #append> |
|
<el-button icon="el-icon-plus"></el-button> |
|
</template> |
|
</el-input> |
|
</template> |
|
<template v-else-if="row.type == 'role'"> |
|
<avue-input-tree :ref="`role_${$index}`" |
|
v-model="row.value" |
|
size="mini" |
|
dataType="string" |
|
multiple |
|
clearable |
|
placeholder="角色" |
|
:dic="roleList" |
|
:props="roleProps || {label: 'roleName', value: 'id'}" |
|
@change="handleChange($index, `role_${$index}`)"> |
|
</avue-input-tree> |
|
</template> |
|
<template v-else-if="row.type == 'dept'"> |
|
<avue-input-tree :ref="`dept_${$index}`" |
|
v-model="row.value" |
|
size="mini" |
|
dataType="string" |
|
multiple |
|
clearable |
|
placeholder="部门" |
|
:dic="deptList" |
|
:props="deptProps || {label: 'deptName', value: 'id'}" |
|
@change="handleChange($index, `dept_${$index}`)"> |
|
</avue-input-tree> |
|
</template> |
|
<template v-else-if="row.type == 'post'"> |
|
<avue-input-tree :ref="`post_${$index}`" |
|
v-model="row.value" |
|
size="mini" |
|
dataType="string" |
|
multiple |
|
clearable |
|
placeholder="职位" |
|
:dic="postList" |
|
:props="postProps || {label: 'postName', value: 'id'}" |
|
@change="handleChange($index, `post_${$index}`)"> |
|
</avue-input-tree> |
|
</template> |
|
<template v-else-if="row.type == 'platform'"> |
|
<avue-input-tree :ref="`platform_${$index}`" |
|
v-model="row.value" |
|
size="mini" |
|
dataType="string" |
|
multiple |
|
clearable |
|
placeholder="平台" |
|
:dic="platformList" |
|
@change="handleChange($index, `platform_${$index}`)"> |
|
</avue-input-tree> |
|
</template> |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
<template #footer> |
|
<el-button @click="handleClose" |
|
size="mini">取消</el-button> |
|
<el-button type="primary" |
|
@click="handleSubmit" |
|
size="mini">确定</el-button> |
|
</template> |
|
|
|
<user-select ref="user-select" |
|
check-type="checkbox" |
|
:user-url="userUrl" |
|
:custom-option="customOption" |
|
:default-checked="defaultChecked" |
|
@onConfirm="handleSelectConfirm"></user-select> |
|
</el-dialog> |
|
</template> |
|
<script> |
|
import UserSelect from './user-select.vue' |
|
|
|
export default { |
|
props: { |
|
userOption: Object, |
|
all: { |
|
type: Boolean, |
|
default: false |
|
} |
|
}, |
|
components: { |
|
UserSelect, |
|
}, |
|
computed: { |
|
userUrl() { |
|
return this.userOption.userUrl |
|
}, |
|
roleUrl() { |
|
return this.userOption.roleUrl |
|
}, |
|
deptUrl() { |
|
return this.userOption.deptUrl |
|
}, |
|
postUrl() { |
|
return this.userOption.postUrl |
|
}, |
|
customUrl() { |
|
return this.userOption.customUrl |
|
}, |
|
customOption() { |
|
return this.userOption.customOption |
|
}, |
|
roleProps() { |
|
return this.customOption ? this.customOption.roleProps : null |
|
}, |
|
deptProps() { |
|
return this.customOption ? this.customOption.deptProps : null |
|
}, |
|
postProps() { |
|
return this.customOption ? this.customOption.postProps : null |
|
} |
|
}, |
|
watch: { |
|
visible(val) { |
|
if (!this.init) { |
|
this.getRoleList() |
|
this.getDeptList() |
|
this.getPostList() |
|
this.init = true |
|
} |
|
if (val && this.userOption && this.userOption.data) this.$set(this, 'data', JSON.parse(JSON.stringify(this.userOption.data))) |
|
}, |
|
}, |
|
data() { |
|
return { |
|
switchAll: false, |
|
init: false, |
|
visible: false, |
|
data: [], |
|
roleList: [], |
|
deptList: [], |
|
postList: [], |
|
selectIndex: 0, |
|
defaultChecked: '', |
|
typeList: [{ |
|
label: '用户', |
|
value: 'user' |
|
}, { |
|
label: '角色', |
|
value: 'role' |
|
}, { |
|
label: '部门', |
|
value: 'dept' |
|
}, { |
|
label: '职位', |
|
value: 'post' |
|
}, { |
|
label: '平台', |
|
value: 'platform' |
|
}], |
|
typeDic: { |
|
user: '用户', |
|
role: '角色', |
|
dept: '部门', |
|
post: '职位', |
|
platform: '平台' |
|
}, |
|
platformList: [ |
|
// { |
|
// label: 'PC', |
|
// value: 'pc' |
|
// }, |
|
{ |
|
label: '移动端H5', |
|
value: 'h5' |
|
}, { |
|
label: '微信小程序', |
|
value: 'mp-wx' |
|
}, { |
|
label: 'IOS', |
|
value: 'ios' |
|
}, { |
|
label: '安卓', |
|
value: 'android' |
|
}] |
|
} |
|
}, |
|
methods: { |
|
handleSelect(index, ref) { |
|
this.selectIndex = index |
|
this.defaultChecked = this.data[index].value |
|
this.$refs[ref].visible = true |
|
}, |
|
handleSelectConfirm(id, name) { |
|
this.$set(this.data[this.selectIndex], 'value', id) |
|
this.$set(this.data[this.selectIndex], 'text', name) |
|
}, |
|
handleTypeChange(index) { |
|
this.$set(this.data, index, { |
|
type: this.data[index].type |
|
}) |
|
}, |
|
handleChange(index, ref) { |
|
this.$nextTick(() => { |
|
const text = this.$refs[ref].labelShow.join(',') |
|
if (text) this.$set(this.data[index], 'text', text) |
|
}) |
|
}, |
|
getRoleList() { |
|
this.$axios.get(this.roleUrl).then(res => { |
|
this.roleList = res.data.data |
|
}) |
|
}, |
|
getDeptList() { |
|
this.$axios.get(this.deptUrl).then(res => { |
|
this.deptList = res.data.data |
|
}) |
|
}, |
|
getPostList() { |
|
this.$axios.get(this.postUrl, { current: 1, size: 999 }).then(res => { |
|
this.postList = res.data.data.records |
|
}) |
|
}, |
|
handleSubmit() { |
|
this.$emit('submit', this.data.filter(d => d.type && d.value), this.switchAll) |
|
this.visible = false |
|
}, |
|
handleClose(done) { |
|
this.visible = false |
|
if (done && typeof done == 'function') done() |
|
} |
|
} |
|
} |
|
</script> |
|
<style lang="scss"> |
|
.wf-dialog { |
|
display: flex; |
|
flex-direction: column; |
|
margin: 0 !important; |
|
position: absolute; |
|
top: 40%; |
|
left: 50%; |
|
transform: translate(-50%, -40%); |
|
max-height: calc(100% - 30px); |
|
max-width: calc(100% - 30px); |
|
|
|
.el-dialog__body { |
|
flex: 1; |
|
overflow: auto; |
|
} |
|
|
|
.el-select { |
|
width: 100%; |
|
} |
|
} |
|
</style> |