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

这篇具有很好参考价值的文章主要介绍了面对根据角色和单子状态如何有效的进行按钮权限的控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

按钮权限是根据工单流程状态进行的,当工单走到某个流程时就显示该表格中对应的状态,初看也就简简单单,仔细一看,逻辑还是很复杂,
首先这里得说一下背景,
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方法:文章来源地址https://www.toymoban.com/news/detail-805891.html

 /**
 * @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进行处理,如果当前登陆人是【发起人或者执行人】,则不显示按钮 否则进行权限码验证显示,当然该按钮是有可能同时出现的情况,如果只是角色权限需要显示,而发起人和执行人不显示,只需要验证权限码就行

到了这里,关于面对根据角色和单子状态如何有效的进行按钮权限的控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何培训跨部门团队进行有效的安全调查和响应?

    随着信息技术的飞速发展以及企业对网络环境的依赖程度不断加深, 部门之间的合作与沟通显得尤为重要. 其中尤其重要的是在网络攻击日益频繁的背景下, 安全事件调查与应急响应能力的提升. 因此建立一个高效跨部门的团队成员进行有效的网络安全防护和应对机制是必不可

    2024年01月19日
    浏览(43)
  • Vue-根据角色获取菜单动态添加路由

    如果大家写过后台管理系统的项目,那么动态路由一定是绕不开的,如果想偷懒的话,就把所有路由一开始都配置好,然后只根据后端返回的菜单列表渲染就好菜单就好了,但是这样的隐患就是我在地址栏输入的地址的时候,也会进入这个页面,不偷懒的方法就是本文要介绍

    2024年01月24日
    浏览(71)
  • 如何使用ES更有效率的进行多字段模糊匹配

    ​ 有时候需要ES模糊多个多个和中文相关的字段,可以把多个字段合成一个逻辑意义上的字段进行模糊 此时需要两个配置: 1、copy_to (将多个字段整合成一个字段)官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/copy-to.html 2、ngram (分词器在对纯中文或者中英文混合相关等

    2024年02月11日
    浏览(39)
  • 小程序根据登录的角色动态设置 tabBar

    根据登录的状态来展示tabbar的名称 type=1 =》 供应商 =》 合同 送货单 我的 type=2 =》 监理 =》 合同 抽检单 我的 在登录之后就拿到type的值 以及登陆之后跳转到合同页面 在合同页面可以书写逻辑 等于送货单以及抽检单都在同一个页面,那么就需要【动态设置当前页面的标题】

    2024年02月12日
    浏览(39)
  • Uniapp根据权限(角色)不同动态展示底部tabbar

    比如绑定openId展示的tabbar为:首页、巡检、工单 未绑定openId展示的tabbar为:在线报修、我的报修 首页配置pages.json中的tabbar: 这里只用配置pagePath就可以了~ 具体代码如下: 创建一个自定义的tabbar文件: 具体代码如下: 注意:pagePath的最前面要   加  / 创建index.js文件配置

    2024年04月26日
    浏览(44)
  • 如何对网络威胁进行分类和优先级排序,以便更有效地分配安全资源?

    随着互联网的普及和网络攻击手段的日益多样化, 对各类型的网络威胁进行全面有效的分类及合理地制定相应的防范策略显得尤为重要.本文将从以下几个方面探讨这个问题: 常见的几种网络威胁类型、如何进行威胁的分类以及根据重要性来进行威胁间的优先级排序.最后, 提出

    2024年03月17日
    浏览(35)
  • 【Spring Boot项目】根据用户的角色控制数据库访问权限

    在一些特定的业务需求下,要求创建只读用户,但是由于一些查询请求使用的是POST方法,因此在网关层面配置只允许请求GET方法又无法满足。所以就想到了是否可以在 JDBC 层面控制,判断角色并且只允许执行 SELECT 类型的SQL语句。 在Spring Boot项目中,我们可以通过结合网关和

    2024年02月06日
    浏览(52)
  • 10 | 动态规划(下):如何求得状态转移方程并进行编程实现?

    上一节,从查询推荐的业务需求出发,介绍了编辑距离的概念,今天我们要基于此,来获得状态转移方程,然后才能进行实际的编码实现。 状态转移方程和编程实现 上一节讲到了使用状态转移表来展示各个子串之间的关系,以及编辑距离的推导。不过,没有完成那张表格。

    2024年04月27日
    浏览(29)
  • Vue中如何进行状态持久化(LocalStorage、SessionStorage)

    在Vue应用中,通常需要将一些状态进行持久化,以便在用户关闭浏览器或刷新页面后,仍能保留之前的状态。常见的持久化方式包括 LocalStorage 和 SessionStorage 。本文将介绍如何使用这两种方式来实现状态的持久化。 LocalStorage 是HTML5中引入的一种持久化方式,它可以将数据存储

    2024年02月09日
    浏览(46)
  • 行业动态 | 第一个支持与 ChatGPT 进行面对面聊天的机器人女友

    GPT-4的上线、文心一言的发布、加上GPT-4植入Office全家桶,不少人感叹:我们每天醒来都被AI的快速发展所震惊,但是更多人感叹自己没有参与其中。 今天小A介绍一款新的机器人爱丽丝,这是一个免费的网页程序 Chat D-ID——世界上第一个允许用户与数字人进行实时对话的应用

    2024年02月02日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包