本篇文章给大家带来了关于vue的相关知识,其中主要详细介绍了vue各种权限控制与管理的实现思路,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。
- 菜单权限:控制用户在系统中能够看到哪些菜单项
- 菜单权限指的就是后台系统中的左侧的菜单栏,前端可以根据后端接口返回的权限数据结合element-ui菜单组件循环拼接而成即可,有什么权限就展示什么菜单
- 通过vuex+持久化插件(本地存储)解决刷新页面菜单栏不显示问题
- 实现退出登录功能时,通过
clear()
方法清除本地数据,跳转后通过window.location.reload()
刷新当前页面,可实现清除vuex数据的操作
- 路由权限为了防止用户恶意通过在地址栏输入地址发生强行跳转,可以通过动态路由对用户权限做出相关限制,有权限则跳转,无权限则跳转404页面
- 路由权限的方法需要在两个时机调用
initDynamicRoutes
,分别是登录成功时和页面创建时,否则动态路由为默认值,刷新无法访问
import Vue from 'vue'
import VueRouter from 'vue-router'
import Layout from '@/layout'
import store from '@/store'
Vue.use(VueRouter)
// 动态路由规则
const tableRule = {
path: '/table',
name: 'table',
component: () => import('@/views/table/index.vue')
}
const imageRule = {
path: '/image',
name: 'image',
component: () => import('@/views/image')
}
const userRule = {
path: '/users',
name: 'users',
component: () => import('@/views/users')
}
// 路由规则和字符串的映射关系
const ruleMapping = {
table: tableRule,
users: userRule,
image: imageRule
}
//静态路由
const routes = [
{
path: '/login',
// name: 'login', // 这里如果有name 控制台会提示
component: () => import('@/views/login')
},
{
path: '/',
component: Layout,
children: [
{
path: '',
// name: 'home',
component: () => import('@/views/home')
},
{
path: '/chart',
component: () => import('@/views/chart')
}
]
}
]
const router = new VueRouter({
routes
})
//路由权限:用户登录后接口返回,存储到本地缓存
const rightList = [
{
id: 1,
authName: "基本页面",
icon: "el-icon-connection",
children: [
{
id: 11,
authName: "表格页面",
icon: "el-icon-s-grid",
path: "table",
rights: ["view", "edit", "add", "delete"]
},
{
id: 12,
authName: "素材页面",
icon: "el-icon-s-marketing",
path: "image",
rights: ["view", "edit", "add", "delete"]
}
]
},
{
id: 2,
authName: "用户权限",
icon: "el-icon-set-up",
children: [
{
id: 21,
authName: "权限页面",
icon: "el-icon-s-custom",
path: "users",
rights: ["view", "edit", "add", "delete"]
}
]
}
];
//在登录(login.vue)、页面刷新(App.vue)的时候,调用initDynamicRoutes
export function initDynamicRoutes () {
// 根据二级权限 对路由规则进行动态的添加
const currentRoutes = router.options.routes
rightList.forEach(item => { // 如果是没有子路由的话 就直接添加进去 如果有子路由的话就进入二级权限遍历
if (item.path) {
const temp = ruleMapping[item.path]
// 路由规则中添加元数据meta
temp.meta = item.rights
currentRoutes[1].children.push(temp)
}
item.children.forEach(item => {
// item 二级权限
const temp = ruleMapping[item.path]
// 路由规则中添加元数据meta,用于按钮权限控制
temp.meta = item.rights
currentRoutes[1].children.push(temp)
})
})
// 添加路由规则
router.addRoutes(currentRoutes)
}
export default router
- 所谓的按钮权限是指在某个菜单的界面中,我们需要根据后端返回的该角色当前操作模块中对应的按钮权限数据,展示出可进行操作的按钮,比如删除,修改,增加等按钮.
- 如果要实现按钮的权限控制,我们需要使用vue的自定义指令去实现: 首先需要创建一个按钮权限控制的指令,我们定义这个指令的名称为:
v-permission
- 如果要实现按钮的权限控制,我们需要使用vue的自定义指令去实现: 首先需要创建一个按钮权限控制的指令,我们定义这个指令的名称为:
- 在这个指令的内部获取到当前用户的按钮权限(vuex|本地缓存中)数据
- 在通过
binding.value
获取到自定义制定属性值的数据
- 在通过
- 判断从
vuex|本地缓存
中获取到的按钮权限数据是否包含了自定义指令包含的权限
- 判断从
- 如果不包含,我们在设置
el.style.display = “none”
,或者使用el.parentNode.removeChild(el)
删除当前 按钮元素
- 如果不包含,我们在设置
<el-button v-permission="[$route.path, 'add']">添加</el-button>
directives: {
// 检测全选的指令
permission: {
// 绑定此指令的标签插入到dom节点触发
inserted(el, bind) {
// el:绑定该指令标签
// bind:对象格式 当前绑定指令标签上的数据情况
// 获取按钮上的value值,就是用户当前要使用的权限和请求的路由地址
let value = bind.value//['/user','add']
//模拟后端返回的当前角色对应的权限
let rules = {
'/menu': ['add', 'edit'],
"/user": [ 'edit', 'remove'],
"/goods": ['add']
}
// 根据访问的路由地址获取该模块的操作权限
let allow = rules[value[0]]
// 检测当前操作是否合法
if (!allow.includes(value[1])) {
// 不合法隐藏操作按钮
el.style = "display:none"
}
}
}
}
数据权限
就是不同的角色用户看到的表格数据是不一样的- 比如张三是项目经理就可以看到某一个业务表格中的所有数据和字段信息
- 李四是普通员工只能看到表格中自己的数据
- 代码实现: 前端在请求头统一封装,携带用户信息,最后由后端检测该用户权限解析返回对应的数据即可;
import axios from 'axios'
import router from '@/router'
const request = axios.create()
// 映射
const actionMapping = {
get: 'view',
post: 'add',
put: 'edit',
delete: 'delete'
}
// request.defaults.baseURL = 'http://127.0.0.1:7001' // 注释掉之后调的接口将是Mock数据
// 请求拦截器
request.interceptors.request.use(req => {
// console.log(req.url)
// console.log(req.method)
if (req.url !== '/login' && req.url !== '/roles') {
// 不是登录的请求 也不是获取权限的请求 则在请求头中加入token 不知道如何使用Mock来验证请求头中的token 故此处注释
// req.headers.Authorization = sessionStorage.getItem('token')
const action = actionMapping[req.method]
// 判断非权限范围内的请求
// console.log(router)
const currentRight = router.currentRoute.meta
// console.log(currentRight)
if (currentRight && currentRight.indexOf(action) === -1) {
// 没有权限
alert('没有权限')
return Promise.reject(new Error('没有权限'))
}
}
return req
})
export default request
以上就是详解vue各种权限控制与管理的实现思路的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- 如何在 Java 中实现对正方形的缩放操作?(如何在Java中对正方形进行缩放操作)
- 如何正确使用 Java 的 join 方法?(java join方法怎么使用)
- Java 中 DecimalFormat 在哪些场景下使用较为合适?(Java DecimalFormat在哪里使用合适)
- 如何确保Redis客户端的安全性:实用技巧与最佳实践
- 在 JavaScript 中如何使用 parentNode?(javascript中的parentNode怎么用)
- 如何高效编码 Java Supplier 接口?(java supplier接口的高效编码技巧)
- 如何进行 Java NoSQL 查询优化?(java nosql查询优化怎样进行)
- Java 中 `equals()` 的核心究竟是什么?(java eques的核心是什么)
- Java代理模式的优缺点分别有哪些?(Java代理模式有哪些优缺点)
- 2024下半年北京软考成绩复查时间及流程
猜你喜欢
AI推送时光机详解vue各种权限控制与管理的实现思路
前端开发2023-05-14
vue各种权限控制与管理实现的方法是什么
前端开发2023-07-05
vue权限控制与管理的实现方法是什么
前端开发2023-07-05
汇编语言系列之汇编实现各种码制的转换(思路详解)
前端开发2024-04-02
咦!没有更多了?去看看其它编程学习网 内容吧