面对根据角色和单子状态如何有效的进行按钮权限的控制

在这里插入图片描述

当阁下看到这个按钮权限控制时,该如何应对

按钮权限是根据工单流程状态进行的,当工单走到某个流程时就显示该表格中对应的状态,初看也就简简单单,仔细一看,逻辑还是很复杂,
首先这里得说一下背景,
1、账号是和角色挂钩,所谓的角色就是【管理员、科长、科秘】,而角色对应的就是按钮权限,不可能给账号设置权限,账号会很多,
所以,我们只能通过创建角色,然后在通过注册账号关联角色,一个角色下肯定能关联很多账号
2、对于工单,就是一个审批流,每做完一个节点就会往下面一个节点,直到流程结束,每个节点都会有状态,有发起人,有处理人,
登录账号可以获取到登录人的权限,有了这些就可以进行按钮的显示控制
  • 问题1: 举个🌰,对于【待分配】这个工单状态的申请撤回按钮进行解析

    首先【管理员、客服人员、科长、科秘】是角色,是更具账号进行设置的,如果你的账号设置了这些角色,那这些角色对应的按钮权限,你的账号就能显示这些按钮,反之则不行
    但两个特殊情况,发起人(创建人)和执行人(处理人)是不通过账号对应角色设置的权限进行按钮权限的控制,
    比如,虽然我的账号设置了管理员的权限,但是我也是工单的发起人;在【待分配】这个节点,管理员他是没有申请撤回的按钮权限的,但是
    我既是发起人又是管理员,那我就有申请撤回的按钮,可以进行申请撤回操作,像这种情况,阁下该如何设计程序,
    
  • 问题2:举2个🌰对于【科室待接受】这个节点的申请撤回按钮进行解析

    在【科室待接受】这个节点,你会发现每个人都有申请撤回的按钮,如果账号只是单独一个管理员,或者其他角色,那么就只会显示一个按钮,这个好解决,只要判断当前登录账号是否有申请撤回的按钮权限就行了,
    但是当我既是管理员,又是工单的发起人,那如果工单在分配的时候又给回我自己,那是不是相当于,执行人也是我自己,那不是【发起人、管理员、执行人】都是我自己,
    按照正常的设计,那是不是就会显示三个申请撤回的按钮,但这肯定不受我们想要的,既然都是同一个,那就只显示一个申请撤回的按钮,所以面对这种情况,该如何设计
    
  • 问题3:有些按钮 在多个节点要显示,比如【申请撤回、追加信息、催办】,像这种情况,你如何去处理,举个🌰

    【追加信息】按钮,在【待分配】节点只有【客服人员、管理员】角色才有该按钮权限,所以权限必须添加到角色中去,但是当【待分配】节点完成后,到了【科室待接受】节点,
    你会发现,【追加信息】的按钮只有发起人、【客服人员】才有了,之前的管理员没有了,那这种情况如何进行处理
    

对于以上三种情况,我们该如何进行逻辑设计

  • 对应问题1:
    • 首先我们肯定要先去判断当前工单是否是【待分配】节点:row.status==='ORDER_DFP'
    • 然后判断首尾,就是先判断当前登录人是否是【发起人】和【执行人】,如果是则显示对应的按钮:row.createUserId===userInfo.userId
    • 最后判断登录用户所属角色的按钮权限,由于【待分配】节点按钮不关【发起人】所以只需要判断权限就行了, 注:【auth】方法在后面会补上
<!--待分配 -->
<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>
  • 对应问题2:
    • 处理方式和问题1的解决是一样的,首先我们肯定要先去判断当前工单是否是【科室待接受】节点:row.status==='ORDER_DJS'
    • 然后判断首尾,就是先判断当前登录人是否是【发起人】和【执行人】,如果是则显示对应的按钮:row.createUserId===userInfo.userId
    • 在这个节点就既需要判断按钮权限同时还得判断是否是【发起人、执行人】,当登录人是发起人且又是管理员的时候就不应该出现按钮,所以在auth方法里面加了一层判断,如果登录人和发起人相等,则返回false,否则,就去判断权限,有权限则返回true,如此就只会显示一个按钮,不会重复出现
<!-- 科室待接受-->
<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>

这是小弟能小能想到的处理方法,应该有更好的方法,请大佬指出,3Q

  1. 首先判断工单流程节点
  2. 判断当前登录人是否是【发起人、执行人】,然后把对应发起人和执行人要显示的按钮显示
  3. 根据方法auth进行处理,如果当前登陆人是【发起人或者执行人】,则不显示按钮 否则进行权限码验证显示,当然该按钮是有可能同时出现的情况,如果只是角色权限需要显示,而发起人和执行人不显示,只需要验证权限码就行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/415857.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024--Django平台开发-订单项目管理(十四)

day14 订单管理系统 1.关于登录 1.1 UI美化 页面美化&#xff0c;用BootStrap 自定义BooStrapForm类实现。 class BootStrapForm:exclude_filed_list []def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# {title:对象,"percent":对象}fo…

ACL【新华三与华为的区别】

【解释】acl简单点解释就是&#xff0c;一套根据需求而设置的规则 【背景】 192.168.1.0/24 网段不允许访问 192.168.2.0/24 网段&#xff0c;要求使用基本 ACL 实现20_1 可以访问 20_6 的 TELNET 服务&#xff0c;但不能访问 FTP 服务 【操作步骤】 {易混点 }&#xff1a;1. …

阿里二面:要保证消息不丢失,又不重复,消息队列怎么选型?

大家好&#xff0c;我是君哥。 在使用消息队列时&#xff0c;有两个经常让我们烦恼的问题&#xff0c;消息丢失和消息重复。那我们在做技术选型时&#xff0c;有没有一个消息队列能解决消息丢失和消息重复这两个问题呢&#xff1f; 消息丢失 如上图&#xff0c;从生产者发送消…

小程序学习-17

attached最常用 推荐使用 lilfetimes 这种方法

【Linux】Linux进程间通信(四)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

基于嵌入式的智能智能通风系统

基于嵌入式的智能智能通风系统 功能说明 通过微信小程序控制窗户的开关状体以及倒计时开关和定时开关&#xff0c;小程序上实时显示当前温度湿度和光照强度。 功能展示 02智能通风系统 Mqtt服务器 http://www.yoyolife.fun/iot&#xff1a;Mqtt服务器&#xff0c;我是在这里注…

前端react入门day03-react获取dom与组件通信

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 受控表单绑定 React中获取DOM 组件通信 父传子 父传子-基础实现 父传子-props说明 父传子 - 特殊的…

J4 - ResNet与DenseNet结合

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 环境模型设计模型效果展示总结与心得体会 环境 系统: Linux语言: Python3.8.10深度学习框架: Pytorch2.0.0cu118显卡&#xff1a;GT…

构建坚固网络,SD-WAN网络配置指南

在新兴的网络技术中&#xff0c;软件定义广域网&#xff08;SD-WAN&#xff09;作为关键角色脱颖而出&#xff0c;被广泛应用于构建高效可靠的企业网络。利用SD-WAN技术&#xff0c;企业能够更好地管理和优化其网络基础设施&#xff0c;实现更高效的连接和数据传输。本文将深入…

STM32标准库开发——串口发送/单字节接收

USART基本结构 串口发送信息 启动串口一的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);初始化对应串口一的时钟&#xff0c;引脚&#xff0c;将TX引脚设置为复用推挽输出。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_In…

BigeMap在Unity3d中的应用,助力数字孪生

1. 首先需要用到3个软件&#xff0c;unity&#xff0c;gis office 和 bigemap离线服务器 Unity下载地址:点击前往下载页面(Unity需要 Unity 2021.3.2f1之后的版本) Gis office下载地址:点击前往下载页面 Bigemap离线服务器 下载地址: 点击前往下载页面 Unity用于数字孪生项…

比吸收率(SAR)

本文旨在介绍比吸收率&#xff08;Specific Absorption Rate&#xff09;的基本知识。搬运自https://www.antenna-theory.com。英语够用的朋友可以直接移步。感谢网站创始人Peter Joseph Bevelacqua教授的无私奉献。 ------------------我是分隔线------------------- 比吸收…