按钮权限是根据工单流程状态进行的,当工单走到某个流程时就显示该表格中对应的状态,初看也就简简单单,仔细一看,逻辑还是很复杂,
首先这里得说一下背景,
1、账号是和角色挂钩,所谓的角色就是【管理员、科长、科秘】,而角色对应的就是按钮权限,不可能给账号设置权限,账号会很多,
所以,我们只能通过创建角色,然后在通过注册账号关联角色,一个角色下肯定能关联很多账号
2、对于工单,就是一个审批流,每做完一个节点就会往下面一个节点,直到流程结束,每个节点都会有状态,有发起人,有处理人,
登录账号可以获取到登录人的权限,有了这些就可以进行按钮的显示控制
问题1: 举个🌰,对于【待分配】这个工单状态的申请撤回按钮进行解析
首先【管理员、客服人员、科长、科秘】是角色,是更具账号进行设置的,如果你的账号设置了这些角色,那这些角色对应的按钮权限,你的账号就能显示这些按钮,反之则不行
但两个特殊情况,发起人(创建人)和执行人(处理人)是不通过账号对应角色设置的权限进行按钮权限的控制,
比如,虽然我的账号设置了管理员的权限,但是我也是工单的发起人;在【待分配】这个节点,管理员他是没有申请撤回的按钮权限的,但是
我既是发起人又是管理员,那我就有申请撤回的按钮,可以进行申请撤回操作,像这种情况,阁下该如何设计程序,
问题2:举2个🌰对于【科室待接受】这个节点的申请撤回按钮进行解析
在【科室待接受】这个节点,你会发现每个人都有申请撤回的按钮,如果账号只是单独一个管理员,或者其他角色,那么就只会显示一个按钮,这个好解决,只要判断当前登录账号是否有申请撤回的按钮权限就行了,
但是当我既是管理员,又是工单的发起人,那如果工单在分配的时候又给回我自己,那是不是相当于,执行人也是我自己,那不是【发起人、管理员、执行人】都是我自己,
按照正常的设计,那是不是就会显示三个申请撤回的按钮,但这肯定不受我们想要的,既然都是同一个,那就只显示一个申请撤回的按钮,所以面对这种情况,该如何设计
问题3:有些按钮 在多个节点要显示,比如【申请撤回、追加信息、催办】,像这种情况,你如何去处理,举个🌰
【追加信息】按钮,在【待分配】节点只有【客服人员、管理员】角色才有该按钮权限,所以权限必须添加到角色中去,但是当【待分配】节点完成后,到了【科室待接受】节点,
你会发现,【追加信息】的按钮只有发起人、【客服人员】才有了,之前的管理员没有了,那这种情况如何进行处理
row.status==='ORDER_DFP'
row.createUserId===userInfo.userId
<!--待分配 -->
<template v-if="row.status==='ORDER_DFP'">
<template v-if="row.createUserId===userInfo.userId">
<el-button type="text" >催办</el-button>
<el-button type="text" >申请撤回</el-button>
</template>
<!--像这些按钮就不需要根据是否是【发起人、执行人】来看需不需要显示,而直接根据按钮配置的code来进行判断就行了 -->
<el-button type="text" v-if="auth('OrderInquire_EalingPeople')">分配协同科室</el-button>
<el-button type="text" v-if="auth('appendInfo-DFP')">追加信息</el-button>
<el-button type="text" v-if="auth('execute')" >移交执行科室</el-button>
<el-button type="text" v-if="auth('OrderInquire_TableCancel')" >取消
</el-button>
</template>
row.status==='ORDER_DJS'
row.createUserId===userInfo.userId
<!-- 科室待接受-->
<template v-if="row.status==='ORDER_DJS'">
<!-- 当登录人是发起人的时候显示的按钮-->
<template v-if="row.createUserId===userInfo.userId">
<el-button type="text">催办</el-button>
<el-button type="text" >申请撤回</el-button>
<el-button type="text">追加信息</el-button>
</template>
<!-- 当登录人是执行人的时候显示的按钮-->
<template v-if="row.dealUserId===userInfo.userId">
<el-button type="text">接受协同</el-button>
<el-button type="text" >拒绝协同</el-button>
</template>
<!-- 当登录人是发起人且又是管理员的时候就不应该出现按钮,所以在auth方法里面加了一层判断,如果登录人和发起人相等,则返回false,否则,就去判断权限,有权限则返回true-->
<el-button type="text" v-if="auth('appendInfo-DJS',row.createUserId===userInfo.userId)">追加信息</el-button>
<el-button type="text" v-if="auth('withdraw-DJD',row.createUserId===userInfo.userId)">申请撤回</el-button>
<!-- 当登录人是执行人且又是管理员的时候就不应该出现按钮,所以在auth方法里面加了一层判断,如果登录人和执行人相等,则返回false,否则,就去判断权限,有权限则返回true-->
<el-button type="text" v-if="auth('receivingOrders',row.dealUserId===userInfo.userId)">接受协同</el-button>
<el-button type="text" v-if="auth('refuse_collaboration',row.dealUserId===userInfo.userId)">拒绝协同</el-button>
</template>
对应问题3 : 大佬们应该能从上面两种示例中发现 两个【追加信息】的权限码不同,所以这个问题的处理方式我是在对按钮添加权限的时候,对每个状态下的按钮都加一个权限码,比如:待分配的【追加信息】权限码是【appendInfo-DFP】,而科室待接受的权限码是【appendInfo-DJS】
补充auth方法:
/**
* @param code {String} 权限码
* @param hasAuth {Boolean} 判断当前登录人是否是执行或者发起人,是则不需要显示按钮了,已经有了,不需要否则会重复显示
*/
auth(code, hasAuth = false){
//如果 登录人是否是执行或者发起人 则表示该按钮已经显示了,不需要重复出现,否则就看该登录人是否有该按钮的权限码
if (hasAuth) return false
//直接看是否有按钮权限
const str = `OrderInquire.`
if (code instanceof Array) {
let authMap = {}
code.forEach(item => {
authMap[item] = str + item
})
return this.$authCodeTool.hasSomeCode(code.map(c => authMap[c]));
}
//$hasAuthCode 这个方法是我们内部自己处理登录人权限的方法
return this.$hasAuthCode(str + code)
}
<el-button v-if="auth('orderDetail')" type="text">详情</el-button>
<el-button type="text" v-if="['ORDER_DRAFT'].includes(row.status)&&row.createUserId===userInfo.userId">编辑草稿</el-button>
<el-button type="text" v-if="['ORDER_DRAFT'].includes(row.status)&&(auth('deleteDraft')||row.createUserId===userInfo.userId)">删除
</el-button>
<!--科室待接受-->
<template v-if="row.status==='ORDER_DJS'">
<template v-if="row.createUserId===userInfo.userId">
<el-button type="text">催办</el-button>
<el-button type="text">申请撤回</el-button>
<el-button type="text">追加信息
</el-button>
</template>
<template v-if="row.dealUserId===userInfo.userId">
<el-button type="text">接受协同</el-button>
<el-button type="text">拒绝协同</el-button>
</template>
<el-button type="text" v-if="auth('receivingOrders',row.dealUserId===userInfo.userId)">接受协同</el-button>
<el-button type="text" v-if="auth('refuse_collaboration',row.dealUserId===userInfo.userId)">拒绝协同</el-button>
<el-button type="text" v-if="auth('appendInfo-DJS',row.createUserId===userInfo.userId)">追加信息</el-button>
<el-button type="text" v-if="auth('withdraw-DJD',row.createUserId===userInfo.userId)">申请撤回</el-button>
</template>
<!--待分配-->
<template v-if="row.status==='ORDER_DFP'">
<template v-if="row.createUserId===userInfo.userId">
<el-button type="text">催办</el-button>
<el-button type="text">申请撤回</el-button>
</template>
<el-button type="text" v-if="auth('OrderInquire_EalingPeople')">分配协同科室</el-button>
<el-button type="text" v-if="auth('appendInfo-DFP')">追加信息</el-button>
<el-button type="text" v-if="auth('execute')">移交执行科室</el-button>
<el-button type="text" v-if="auth('OrderInquire_TableCancel')">取消</el-button>
</template>
<!--处理中-->
<template v-if="row.status==='ORDER_CLZ'">
<template v-if="row.createUserId===userInfo.userId">
<el-button v-if="['ORDER_CLZ'].includes(row.status)" type="text">催办</el-button>
<el-button type="text">追加信息</el-button>
<el-button type="text">申请撤回</el-button>
</template>
<template v-if="row.dealUserId===userInfo.userId">
<el-button type="text">暂停</el-button>
<el-button type="text">重启</el-button>
<el-button type="text">完成</el-button>
</template>
<el-button type="text" v-if="auth('appendInfo-CLZ',row.createUserId===userInfo.userId)">追加信息</el-button>
<el-button type="text" v-if="auth('withdraw-CLZ',row.createUserId===userInfo.userId)">申请撤回</el-button>
<el-button type="text" v-if="auth('multiCooperation')">协同分配</el-button>
<el-button type="text" v-if="auth('returnCollaboration')">退回协同</el-button>
</template>
<!--多人协作中-->
<template v-if="row.status==='ORDER_COOPER_IN'">
<template v-if="row.createUserId===userInfo.userId">
<el-button type="text">追加信息</el-button>
<el-button type="text">申请撤回</el-button>
</template>
<el-button v-if="auth('urging-XZZ')" type="text">催办</el-button>
<el-button type="text" v-if="auth('appendInfo-XZZ',row.createUserId===userInfo.userId)">追加信息</el-button>
<el-button type="text" v-if="auth('withdraw-XZZ',row.createUserId===userInfo.userId)">申请撤回</el-button>
<el-button type="text" v-if="auth('multiCooperation')">协同分配</el-button>
</template>