Vue后台管理项目权限处理思路

该文章探讨了在前端应用中如何根据用户角色权限动态渲染菜单、动态添加路由、控制页面按钮权限以及设置Axios请求头。通过Vuex管理权限数据,动态生成路由表并在App.vue中初始化,使用自定义指令控制按钮显示,以及设置请求拦截器确保请求携带权限信息。同时,文章指出了刷新后动态路由消失的问题,提出在App.vue的created钩子中加载动态路由的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不同角色权限的菜单栏渲染思路

根据后台返回的right数据渲染角色菜单, 在login页面请求数据时使用this.$store.commit调用该方法将将其存入vuex里,并对其做本地化处理,需要事先在mutation中定义相应添加的方法,然后在home页面进行使用时,使用mapstate将数据…mapstate存入computed(…mapState([‘rightList’])里进行处理,然后v-for渲染时直接使用即可。
注意:如果不进行本地化处理,页面刷新后将会丢失菜单栏信息,因为其信息是在login页进行获取并存储的。 退出时需要调用sessionstorage.clear/remove清除本地数据,然后让页面重新加载,即可清除vuex中的数据。

退出功能

2.根据角色权限实现动态添加路由

// 定义路由规则
const reportRule = {
  path: '/reports', component: Report
}
const orderRule = {
  path: '/orders', component: Order
}


// 定义二级权限字段与路由规则之间的对应关系
const ruleMapping = {
  'reports': reportRule,
  'orders': orderRule
}

// 定义动态添加路由的方法并导出至login页面进行使用
//  根据二级权限,对路由规则进行动态添加
export function initDynamicRoutes () {
  // router对象中的options下的routes就是所有的路由规则
  const currentRoutes = router.options.routes
  // 假定我们要向其中第2个路由中的children添加对应路由
  const rightList = store.state.rightList
  // 双重foreach遍历到其二级权限
  rightList.forEach(item => {
    // 此时的item对应后台返回数据中的一级权限
    // 通过循环一级权限下的children节点拿到所有二级权限
    item.children.forEach(item => {
      // 通过映射关系拿到对应路由规则 item.path就是二级权限字段
      const tem = ruleMapping[item.path]
      // 将对应路由规则添加到当前路由对象
      //此时可以向tem添加meta节点
      //tem.meta = '后台返回数据对应的权限节点数据'
      currentRoutes[2].children.push(tem)
    })
  });
  // push完后 调用对应api进行路由规则的添加
  router.addRoute(currentRoutes)
}

调用时机:登录成功后调用initDynamicRoutes()
总体思路就是根据后台返回的权限数据来判断该用户是否具有该路由权限,无权限则直接404。而动态添加路由的思路是拿到router实例上的routes路由规则数据,对比后台数据后对routes的路由数据进行添加,然后调用router.addRoute方法将最新的路由规则添加到路由实例对象中

问题: 如果我们重新刷新的话动态路由就会消失,动态路由是在登录成功之后才会调用的,刷新的时候并没有调用,所以动态路由没有添加上

解决: 可以在app.vue中的created中调用添加动态路由的方法。

3.页面按钮的控制
虽然用户可以看到某些界面了, 但是这个界面的一些按钮该用户可能是没有权限的。 因此, 我们需要对组件中的一些按钮进行控制, 用户不具备权限的按钮就隐藏或者禁用, 而在这块的实现中, 可以把该逻辑放到自定义指令中

比如我们可以根据后端返回的数据right来判断用户有什么权限,如下图
在这里插入图片描述
添加自定义指令 控制按钮
在这里插入图片描述
总体思路就是通过自定义指令在其指令内部逻辑实现对后台节点数据的对比判断,并对绑定该指令的元素进行相应操作。
具体实现是通过在自定指令上的action、effect等信息,告诉指令内部,该按钮应具备哪些权限判断条件,比如add,如果后台权限信息有add,那么该用户具有add权限,则指令内部不做逻辑处理,如果没有,则在页面上移除该按钮。其他以此类推。

4.axios请求头的设置
注:req实际上就是请求对象,处理完相应逻辑后必须return出去,否则无法进行请求。

请求控制
除了登录请求都得要带上token , 这样服务器才可以鉴别你的身份
asiox的请求拦截器设置:
在这里插入图片描述
如果发出了非权限内的请求, 应该直接在前端范围内阻止, 虽然这个请求发到服务器也会被拒绝

非权限内的请求:比如a用户是不能够操作该页面的按钮的,但是他通过f12调试把按钮改为可点击,如果我们不对这个请求进行处理,那么这个请求就会发送出
在这里插入图片描述
总体思路就是根据restful的请求方式,设置一个映射函数,在请求头中我们可以通过restful的请求方式来判断该用户在进行哪种操作,再在用户的权限中查找他是否有进行该操作的权限,如果没有就报错。

响应控制
得到了服务器返回的状态码401, 代表token 超时或者被篡改了,此时应该强制跳转到登录界面
在这里插入图片描述

Vue后台管理项目中,可能会遇到一些难点。其中一些常见的难点包括: 1. 权限控制:在后台管理系统中,权限控制是非常重要的一部分。它涉及到用户角色、权限管理和页面级别的访问控制。根据引用中提到的文章,浅谈了Vue后台管理系统权限控制的思考与实践,你可以参考该文章中的思路和方法来解决权限控制的难题。 2. 组件封装:Vue后台管理项目通常包含大量的组件,如表格、表单、菜单、弹窗等。在实际项目中,你可能需要根据项目需求对这些组件进行封装,使其更加灵活和易于复用。其中,引用中提到了一些常见的组件封装技巧,例如分页组件的封装、查询和重置功能的实现、弹出框的使用等等。 3. 数据校验:在后台管理系统中,数据的输入和提交都需要进行校验,以确保数据的有效性和安全性。Vue提供了一些内置的校验方法,如表单验证、自定义指令等。你可以使用这些方法来进行数据校验,以应对引用中提到的校验难点。 4. 组件通信:在一个复杂的后台管理系统中,各个组件之间的通信是非常常见的。你可能需要根据业务需求使用一些常见的通信方式,如事件总线、Vuex等。这样可以方便不同组件之间的数据传递和状态管理,从而提高项目的开发效率。 综上所述,Vue后台管理项目中的难点主要包括权限控制、组件封装、数据校验和组件通信。你可以根据实际项目需求,结合相关的知识点和经验,来解决这些难题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [浅谈vue后台管理系统权限控制思考与实践](https://download.csdn.net/download/weixin_38707240/12948508)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【精品课】Vue.js实现电商后台管理系统(企业项目实战)](https://download.csdn.net/download/weixin_38503483/19944528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [vue后台管理知识点、难点总结02](https://blog.csdn.net/hnn567/article/details/123113223)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值