5 changed files with 637 additions and 71 deletions
@ -0,0 +1,540 @@ |
|||||
|
<template> |
||||
|
<div class="role-container"> |
||||
|
<el-card class="flex1"> |
||||
|
<div class="div_btn"> |
||||
|
<span style="margin-right:20px">{{customerName}}</span> |
||||
|
<el-button type="default" |
||||
|
size="mini" |
||||
|
@click="diaCancel">取消返回</el-button> |
||||
|
|
||||
|
</div> |
||||
|
<el-tabs v-model="activeName" |
||||
|
@tab-click="tabClick" |
||||
|
class="el-tabs"> |
||||
|
<el-tab-pane label="工作端" |
||||
|
name="work"> |
||||
|
<div class="now-name"> |
||||
|
上下拖动可改变角色顺序 |
||||
|
<el-button type="primary" |
||||
|
size="small" |
||||
|
@click="handleSaveSort">保存顺序</el-button> |
||||
|
</div> |
||||
|
<el-table ref="roleTable" |
||||
|
v-loading="loading1" |
||||
|
:data="roleList" |
||||
|
row-key="roleKey" |
||||
|
border |
||||
|
style="width: 100%"> |
||||
|
<el-table-column type="index" |
||||
|
header-align="left" |
||||
|
align="left" |
||||
|
width="50"></el-table-column> |
||||
|
<el-table-column prop="roleName" |
||||
|
label="角色名称" |
||||
|
header-align="left" |
||||
|
align="left" |
||||
|
width="180"> |
||||
|
<template slot-scope="scope"> |
||||
|
<el-input v-if="scope.row.isEdit" |
||||
|
v-model="scope.row.roleName" |
||||
|
clearable> |
||||
|
</el-input> |
||||
|
<span v-else>{{scope.row.constName}}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<!-- <el-table-column v-if="!funcShow" |
||||
|
prop="roleKey" |
||||
|
header-align="left" |
||||
|
align="left" |
||||
|
label="角色Key" |
||||
|
width="150"></el-table-column> --> |
||||
|
|
||||
|
<el-table-column prop="description" |
||||
|
label="角色职责" |
||||
|
header-align="left" |
||||
|
align="left"> |
||||
|
<template slot-scope="scope"> |
||||
|
<p style="text-align:left;margin:3px 0" |
||||
|
v-for="(item,index) in scope.row.descriptionList" |
||||
|
:key="index">{{item}}</p> |
||||
|
<!-- <p>{{scope.row.description}}</p> --> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column width="450" |
||||
|
label="操作"> |
||||
|
<template slot-scope="scope"> |
||||
|
|
||||
|
<el-button type="primary" |
||||
|
size="mini" |
||||
|
@click="handelDefault(scope.row)">恢复默认</el-button> |
||||
|
<el-button type="primary" |
||||
|
size="mini" |
||||
|
@click="handelChangeDuty(scope.row)">修改职责</el-button> |
||||
|
<el-button type="primary" |
||||
|
size="mini" |
||||
|
@click="toOperationConfig(scope.row.roleId, scope.row.roleName)">功能权限</el-button> |
||||
|
|
||||
|
<span v-if="scope.row.isEdit" |
||||
|
style="display: inline-block; margin-left: 10px;"> |
||||
|
<el-button type="primary" |
||||
|
size="small" |
||||
|
@click="handelChangeName(scope.row)">保存</el-button> |
||||
|
<el-button size="small" |
||||
|
@click="scope.row.isEdit=false">取消</el-button> |
||||
|
</span> |
||||
|
<el-button v-else |
||||
|
type="primary" |
||||
|
size="mini" |
||||
|
@click="handleChangeName(scope.row)">修改名称</el-button> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</el-tab-pane> |
||||
|
<el-tab-pane label="居民端" |
||||
|
name="resi"> |
||||
|
</el-tab-pane> |
||||
|
</el-tabs> |
||||
|
</el-card> |
||||
|
|
||||
|
<!-- 角色职责弹出框 --> |
||||
|
<el-dialog :visible.sync="dutyShow" |
||||
|
:close-on-click-modal="false" |
||||
|
:close-on-press-escape="false" |
||||
|
title="角色职责" |
||||
|
width="30%" |
||||
|
@closed="handleDutyClosed"> |
||||
|
<div class="div_duty" |
||||
|
v-if="dutyShow"> |
||||
|
<el-input type="textarea" |
||||
|
:rows="8" |
||||
|
v-model="description"></el-input> |
||||
|
<div class="div_btn_dia"> |
||||
|
<el-button type="primary" |
||||
|
size="small" |
||||
|
@click="updateRole()">保存</el-button> |
||||
|
<el-button size="small" |
||||
|
@click="dutyShow=false">取消</el-button> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</el-dialog> |
||||
|
|
||||
|
<!-- 功能配置弹出框 --> |
||||
|
<el-dialog :visible.sync="funcShow" |
||||
|
:close-on-click-modal="false" |
||||
|
:close-on-press-escape="false" |
||||
|
width="70%" |
||||
|
top="30px" |
||||
|
title="功能列表" |
||||
|
@closed="handleDialogClosed"> |
||||
|
<div class="role-flex" |
||||
|
v-if="funcShow"> |
||||
|
<el-card class="flex1"> |
||||
|
<div class="now-name">当前角色: {{roleName}}</div> |
||||
|
<div class="now-name"> |
||||
|
<el-button type="primary" |
||||
|
size="small" |
||||
|
@click="saveOperations4Role">保存功能</el-button> |
||||
|
</div> |
||||
|
<el-table v-loading="loading2" |
||||
|
height="580" |
||||
|
ref="opeTable" |
||||
|
:data="opeList" |
||||
|
border |
||||
|
@select="handleSelectionChange"> |
||||
|
<el-table-column type="selection" |
||||
|
width="55"></el-table-column> |
||||
|
<!-- <el-table-column prop="operationKey" label="操作Key"></el-table-column> --> |
||||
|
<el-table-column prop="operationName" |
||||
|
label="操作名称"></el-table-column> |
||||
|
<!-- <el-table-column prop="brief" label="简介"></el-table-column> --> |
||||
|
<el-table-column label="操作"> |
||||
|
<template slot-scope="scope"> |
||||
|
<el-button type="primary" |
||||
|
size="small" |
||||
|
@click="toScopeConfig(scope.row.operationKey, scope.row.operationName)">范围配置</el-button> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</el-card> |
||||
|
<el-card v-show="roleShow" |
||||
|
style="width: 250px; margin-left: 10px;"> |
||||
|
<div class="now-name">当前功能: {{funcName}}</div> |
||||
|
<div class="now-name"> |
||||
|
<el-button type="primary" |
||||
|
size="small" |
||||
|
@click="saveSettings">保存范围</el-button> |
||||
|
</div> |
||||
|
<div> |
||||
|
<el-row :gutter="12"> |
||||
|
<el-col v-loading="loading3"> |
||||
|
<el-card shadow="hover"> |
||||
|
<el-checkbox-group class="t" |
||||
|
v-model="checkedScopes" |
||||
|
@change="roleChange"> |
||||
|
<el-checkbox v-for="scope in scopeOptions" |
||||
|
:label="scope.scopeKey" |
||||
|
:key="scope.scopeKey">{{scope.scopeName}}</el-checkbox> |
||||
|
</el-checkbox-group> |
||||
|
</el-card> |
||||
|
</el-col> |
||||
|
</el-row> |
||||
|
</div> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import Sortable from 'sortablejs' |
||||
|
import { requestPost } from "@/js/dai/request"; |
||||
|
|
||||
|
export default { |
||||
|
name: 'RoleList', |
||||
|
props: { |
||||
|
|
||||
|
}, |
||||
|
data () { |
||||
|
return { |
||||
|
activeName: "work", |
||||
|
loading1: false, |
||||
|
loading2: false, |
||||
|
loading3: false, |
||||
|
selRoleId: '', |
||||
|
|
||||
|
//职责弹出框相关 |
||||
|
dutyShow: false, |
||||
|
description: '', |
||||
|
roleName: '', |
||||
|
|
||||
|
//功能权限弹出框相关 |
||||
|
funcShow: false, |
||||
|
roleShow: false, |
||||
|
roleName: '', |
||||
|
funcName: '', |
||||
|
roleList: [], |
||||
|
opeList: [], |
||||
|
roleKey: '', |
||||
|
operationKey: '', |
||||
|
scopeOptions: [], |
||||
|
settingOptions: [], |
||||
|
checkedScopes: [], |
||||
|
checkedSettings: [], |
||||
|
operateSection: [], // 功能选择列表 |
||||
|
scopeSection: [] // 范围选择列表 |
||||
|
} |
||||
|
}, |
||||
|
created () { |
||||
|
|
||||
|
}, |
||||
|
mounted () { |
||||
|
|
||||
|
}, |
||||
|
beforeDestroy () { |
||||
|
let _data = this.$data |
||||
|
for (let n in _data) { |
||||
|
if (typeof _data[n] === 'boolean') _data[n] = false |
||||
|
if (typeof _data[n] === 'string') _data[n] = '' |
||||
|
if (typeof _data[n] === 'object') _data[n] = [] |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
tabClick () { |
||||
|
|
||||
|
}, |
||||
|
initData (customerId, customerName) { |
||||
|
this.customerId = customerId |
||||
|
this.customerName = customerName |
||||
|
this.listRolesByCustomerId() |
||||
|
this.dragRoleSort() |
||||
|
}, |
||||
|
|
||||
|
//获取角色列表 |
||||
|
listRolesByCustomerId () { |
||||
|
this.loading1 = true |
||||
|
|
||||
|
this.$http |
||||
|
.post('/epmetuser/govstaffrole/rolesbycustomer/' + this.customerId) |
||||
|
.then(({ data: res }) => { |
||||
|
|
||||
|
if (res.code === 0) { |
||||
|
this.roleList = res.data.map(item => { |
||||
|
if (!item.description) { |
||||
|
item.description = item.defDescription |
||||
|
} |
||||
|
if (!item.roleKey) { |
||||
|
item.roleKey = item.defRoleKey |
||||
|
} |
||||
|
if (!item.roleName) { |
||||
|
item.roleName = item.defRoleName |
||||
|
} |
||||
|
return { |
||||
|
...item, |
||||
|
constName: item.roleName, |
||||
|
isEdit: false, |
||||
|
descriptionList: item.description.split("\n") |
||||
|
} |
||||
|
}) |
||||
|
console.log('roleList', this.roleList) |
||||
|
} |
||||
|
setTimeout(() => { |
||||
|
this.loading1 = false |
||||
|
}, 500) |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
//关闭角色职责弹出框 |
||||
|
handleDutyClosed () { |
||||
|
this.selRoleId = '' |
||||
|
this.description = '' |
||||
|
this.roleName = '' |
||||
|
this.dutyShow = false |
||||
|
}, |
||||
|
|
||||
|
//恢复默认 |
||||
|
handelDefault (row) { |
||||
|
this.selRoleId = row.roleId |
||||
|
this.description = row.defDescription |
||||
|
this.roleName = row.defRoleName |
||||
|
this.updateRole() |
||||
|
}, |
||||
|
|
||||
|
//显示角色职责弹出框 |
||||
|
handelChangeDuty (row) { |
||||
|
this.selRoleId = row.roleId |
||||
|
this.description = row.description |
||||
|
this.roleName = row.roleName |
||||
|
this.dutyShow = true |
||||
|
}, |
||||
|
|
||||
|
handleChangeName (row) { |
||||
|
row.isEdit = true |
||||
|
}, |
||||
|
|
||||
|
handelChangeName (row) { |
||||
|
this.selRoleId = row.roleId |
||||
|
this.description = row.description |
||||
|
this.roleName = row.roleName |
||||
|
this.updateRole() |
||||
|
}, |
||||
|
|
||||
|
//保存角色名称、职责 |
||||
|
async updateRole () { |
||||
|
console.log(this.description) |
||||
|
const url = "/epmetuser/govstaffrole/update-role" |
||||
|
const params = { |
||||
|
roleId: this.selRoleId, |
||||
|
roleName: this.roleName, |
||||
|
description: this.description |
||||
|
} |
||||
|
const { data, code, msg } = await requestPost(url, params) |
||||
|
if (code === 0) { |
||||
|
this.dutyShow = false |
||||
|
this.listRolesByCustomerId() |
||||
|
|
||||
|
} else { |
||||
|
this.$message.error(msg) |
||||
|
} |
||||
|
}, |
||||
|
//关闭功能配置弹出框 |
||||
|
handleDialogClosed () { |
||||
|
this.roleName = '' |
||||
|
this.roleKey = '' |
||||
|
this.funcName = '' |
||||
|
this.operateSection = [] |
||||
|
this.scopeSection = [] |
||||
|
this.funcShow = false |
||||
|
this.roleShow = false |
||||
|
}, |
||||
|
|
||||
|
listOperations4AccessConfig (roleId) { |
||||
|
this.roleId = roleId |
||||
|
this.loading2 = true |
||||
|
this.$http.post('/gov/access/config/roleopes/' + roleId).then((resp) => { |
||||
|
this.opeList = resp.data.data |
||||
|
this.$nextTick(function() { |
||||
|
this.defaultCheck() // 每次更新了数据,触发这个函数即可。 |
||||
|
}) |
||||
|
setTimeout(() => { |
||||
|
this.loading2 = false |
||||
|
}, 500) |
||||
|
}) |
||||
|
}, |
||||
|
listSettingOptions (operationKey) { |
||||
|
let params = { |
||||
|
roleId: this.roleId, |
||||
|
operationKey: operationKey |
||||
|
} |
||||
|
console.log('checkedScopes', this.checkedScopes) |
||||
|
this.checkedScopes = [] |
||||
|
this.loading3 = true |
||||
|
this.$http |
||||
|
.post('/gov/access/config/configoptions', params) |
||||
|
.then(resp => { |
||||
|
console.log('scopeOptions', resp.data) |
||||
|
this.scopeOptions = resp.data.data.scopeOptions |
||||
|
resp.data.data.scopeOptions.forEach(item => { |
||||
|
if (item.assigned) this.checkedScopes.push(item.scopeKey) |
||||
|
}) |
||||
|
console.log('checkedScopes222', this.checkedScopes) |
||||
|
this.settingOptions = resp.data.data.settingOptions |
||||
|
setTimeout(() => { |
||||
|
this.loading3 = false |
||||
|
}, 500) |
||||
|
}) |
||||
|
}, |
||||
|
defaultCheck () { |
||||
|
for (var index in this.opeList) { |
||||
|
let role = this.opeList[index] |
||||
|
if (role.assigned) { |
||||
|
this.$refs.opeTable.toggleRowSelection(role, true) |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
toOperationConfig (roleId, roleName) { |
||||
|
this.roleName = roleName |
||||
|
this.funcShow = true |
||||
|
this.opeList = [] |
||||
|
this.listOperations4AccessConfig(roleId) |
||||
|
}, |
||||
|
toScopeConfig (operationKey, operationName) { |
||||
|
this.roleShow = true |
||||
|
this.operationKey = operationKey |
||||
|
this.funcName = operationName |
||||
|
this.checkedScopes = [] |
||||
|
this.listSettingOptions(operationKey) |
||||
|
}, |
||||
|
saveOperations4Role (val) { |
||||
|
let param = { |
||||
|
roleId: this.roleId, |
||||
|
opes: val, |
||||
|
customerId: this.customerId |
||||
|
} |
||||
|
this.$http.post('/gov/access/config/saveroleopes', param).then( |
||||
|
resp => { |
||||
|
this.$message({ |
||||
|
message: '操作成功', |
||||
|
type: 'success' |
||||
|
}) |
||||
|
this.listOperations4AccessConfig(this.roleId) |
||||
|
} |
||||
|
) |
||||
|
}, |
||||
|
saveSettings (val) { |
||||
|
let param = { |
||||
|
roleId: this.roleId, |
||||
|
operationKey: this.operationKey, |
||||
|
scopeKeys: val, |
||||
|
settingKeys: this.checkedSettings, |
||||
|
customerId: this.customerId |
||||
|
} |
||||
|
|
||||
|
this.$http.post('/gov/access/config/saveconfig', param).then( |
||||
|
resp => { |
||||
|
this.$message({ |
||||
|
type: 'success', |
||||
|
message: '保存成功' |
||||
|
}) |
||||
|
this.listSettingOptions(this.operationKey) |
||||
|
} |
||||
|
) |
||||
|
}, |
||||
|
roleChange (val) { |
||||
|
console.log('valooo', val) |
||||
|
this.saveSettings(val) |
||||
|
}, |
||||
|
handleSelectionChange (val) { |
||||
|
this.saveOperations4Role(val) |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
|
||||
|
dragRoleSort () { |
||||
|
const el = this.$refs.roleTable.$el.querySelectorAll('.el-table__body-wrapper > table > tbody')[0] |
||||
|
this.sortTable = Sortable.create(el, { |
||||
|
group: 'dragTable', |
||||
|
ghostClass: 'sortable-ghost', // Class name for the drop placeholder, |
||||
|
// setData: function(dataTransfer, dragEl) { |
||||
|
// dataTransfer.setData("Text", dragEl.textContent); |
||||
|
// }, |
||||
|
delay: 0, |
||||
|
onChange: evt => { |
||||
|
// console.log(evt) |
||||
|
}, |
||||
|
onEnd: evt => { |
||||
|
const targetRow = this.roleList.splice(evt.oldIndex, 1)[0] |
||||
|
this.roleList.splice(evt.newIndex, 0, targetRow) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
handleSaveSort () { |
||||
|
let data = { |
||||
|
roleIdList: this.roleList.map(item => { |
||||
|
return item.roleId |
||||
|
}) |
||||
|
} |
||||
|
this.$http |
||||
|
.post('/epmetuser/govstaffrole/save-sortorder', data) |
||||
|
.then(({ data: res }) => { |
||||
|
console.log('ressss', res) |
||||
|
if (res.code === 0 && res.msg === 'success') { |
||||
|
this.$message({ |
||||
|
type: 'success', |
||||
|
message: '保存成功' |
||||
|
}) |
||||
|
this.listRolesByCustomerId() |
||||
|
} else { |
||||
|
this.$message({ |
||||
|
type: 'error', |
||||
|
message: res.msg |
||||
|
}) |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
// 取消 |
||||
|
diaCancel () { |
||||
|
this.$emit('cancleBack') |
||||
|
}, |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.role-container, |
||||
|
.role-flex { |
||||
|
display: flex; |
||||
|
} |
||||
|
.flex1 { |
||||
|
flex: 1; |
||||
|
position: relative; |
||||
|
} |
||||
|
.now-name { |
||||
|
/* display: flex; |
||||
|
justify-content: space-between; */ |
||||
|
margin-bottom: 10px; |
||||
|
} |
||||
|
.aui-wrapper .el-card + .el-card { |
||||
|
margin-top: 0; |
||||
|
} |
||||
|
.role-container .el-dialog__body { |
||||
|
padding: 0 20px 20px; |
||||
|
} |
||||
|
.div_duty { |
||||
|
height: 300px; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.div_btn_dia { |
||||
|
position: absolute; |
||||
|
bottom: 30px; |
||||
|
right: 15px; |
||||
|
} |
||||
|
.div_btn { |
||||
|
z-index: 10; |
||||
|
position: absolute; |
||||
|
right: 40px; |
||||
|
top: 25px; |
||||
|
/* margin: 0 0 20px 0; */ |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue