Vue_Router权限控制:不同角色显示不同路由

embedded/2024/11/23 21:04:55/

写在前面       

         在Vue中,Router是一个官方提供的用于处理应用程序路由的插件。它允许我们创建单页应用程序(SPA),其中不同的页面和组件可以通过URL进行导航和展示。使我们可以轻松地创SPA,并实现可复用和可组合的组件导航。

        在实际开发中,我们常常会碰到不同角色进入系统所展示的路由,和页面是不同的。那么我们该如何实现router的权限控制呢?


1.pinia配置

我们使用pinia来存储用户信息及权限,在登录时进行调用设置,同时也是router权限判断的依据

javascript">import { defineStore } from 'pinia'
import { ref } from 'vue'export const userPermissionsStore = defineStore('userPermissions', () => {const roles = ref('')  // 角色const permissions = ref([])  // 权限const isLogin = ref(false)  //登录状态// 设置状态(传入的权限信息赋值给该状态)const setUserPermissions = (params) => {userPermissions.value = params}return {isLogin,userPermissions,roles,setUserPermissions,}
})

2.router配置

在router配置中我们对需要权限限制的路由进行路由权限和受访问权限角色的设置,同时配置路由守卫用于判断跳转路由前是否有权限

javascript">import { createWebHistory, createRouter } from 'vue-router'
import { userPermissionsStore } from '../store'
import Layout from '../View/Layout.vue'const router = createRouter({history: createWebHistory(),routes: [{path: '/',component: Layout,redirect: '/home',children: [{path: '/home',component: () => import('../View/home.vue'),},{path: '/admin',component: () => import('../View/adminPage.vue'),meta: {requireAuth: true, // 需要路由权限roles: ['admin'],  // 受访问权限的角色},},{path: '/superAdmin',component: () => import('../View/superAdminPage.vue'),meta: {requireAuth: true, // 需要路由权限roles: ['superAdmin'], // 受访问权限的角色},},{path: '/user',component: () => import('../View/user.vue'),},],},{path: '/login',component: () => import('../View/login.vue'),},{path: '/404',component: () => import('../View/404.vue'),},],
})// 添加路由前置守卫
router.beforeEach((to, from, next) => {const store = userPermissionsStore()// 判断该路由是否需要登录权限if (to.meta.requireAuth) {// 校验用户是否已经登录if (store.isLogin) {// 判断当前用户是否有访问该路由的权限if (to.meta.roles.includes(store.roles)) {// 用户有访问权限,直接进入页面next() } else {// 用户无访问权限,跳转到其他页面next('/404') }} else {// 如果用户未登录,则跳转到登录页面next('/login')}}
})export default router

3.RouterLink配置

我们可以根据当前角色和权限来控制RouterLink的显隐

javascript"><template><ul class="nav"><RouterLink to="/">首页</RouterLink><RouterLink to="/superAdmin" v-if="hasPermission('superAdmin')" >超级管理员显示</RouterLink><RouterLink to="/admin" v-if="hasPermission('admin')">管理员显示</RouterLink><RouterLink to="/user">用户显示</RouterLink><li><button @click="quiteLogin">退出登录</button></li></ul><div class="container"><RouterView /></div>
</template><script setup>
import { RouterLink, useRouter } from 'vue-router'
import { userPermissionsStore } from '../store'
import { onMounted } from 'vue'const store = userPermissionsStore()
const router = useRouter()// 判断当前的角色是否可访问 来控制跳转链接的显隐
const hasPermission = (i) => {return store.permissions.includes(i)
}// 退出登录时将Piain存储的值清空
const quiteLogin = () => {router.push('/login')store.permissions= []store.isLogin = false
}// 判断当前是否登录
onMounted(() => {if (!isLogin.value) {router.push('/login')}
})</script>

4.登录页配置

在登陆时来调用pinia来存储相关数据

javascript"><template><div><select v-model="name"><option value="superAdmin">超级管理员</option><option value="admin">管理员</option><option value="user">用户</option></select><button @click="login">登录</button></div>
</template><script setup>
import { ref } from 'vue'
import { userPermissionsStore } from '../store'
import { useRouter } from 'vue-router'const userPermissions = userPermissionsStore()
const name = ref('')
const router = useRouter()const login = () => {userPermissions.isLogin = trueuserPermissions.roles = name.valueuserPermissions.userPermissions.push(name.value)router.push('/')
}
</script>

效果展示


http://www.ppmy.cn/embedded/139939.html

相关文章

CE3.【C++ Cont】练习题组3

目录 1.四季 输入描述: 输出描述: 输入 输出 备注: 2.解 方法1:getcharcin读取 提交结果 方法2:scanf指定读取宽度 方法3:cin以int类型读取只取右侧两位 2.角谷猜想 题目描述 输入格式 输出格式 输入输出样例 解 代码 提交结果 3.质因数分解 题目描述 输…

英文版本-带EXCEL函数的数据分析

一、问题&#xff1a; 二、表格内容 三、分析结果 四、具体的操作步骤&#xff1a; 销售工作表公式设计与数据验证 类别&#xff08;Category&#xff09;列公式&#xff1a; 在Category列&#xff08;假设为D列&#xff09;&#xff0c;根据ProductCode在Catalogue工作表中查找…

HarmonyOs鸿蒙开发实战(21)=>组件间通信@ohos/liveeventbus

1.简介 LiveEventBus是一款消息总线&#xff0c;具有生命周期感知能力&#xff0c;支持Sticky&#xff0c;支持跨进程&#xff0c;支持跨APP发送消息。 2.下载安装 ohpm install ohos/liveeventbus 3.订阅&#xff0c;注册监听 4.发送事件 5. 完成 > 记得关注博主&#xff…

最后一个单词的长度

题目详情&#xff1a; 解题思路&#xff1a; 用两个变量分别存储当前值和上次值&#xff0c;就可保证当前移动时记录字符个数&#xff0c;当遇到空格时&#xff0c;这次值保存到上次值&#xff0c;并清空。 代码解析&#xff1a; /* 最后一个单词的长度 */ #include <st…

中标麒麟部署k8sV1.31版本详细步骤

在中标麒麟操作系统上部署 Kubernetes v1.31 的详细步骤如下。这些步骤假定您对 Kubernetes 和 Linux 环境有基本了解&#xff0c;并且中标麒麟系统已正确安装并配置。 环境准备 更新系统并安装必要的软件包 sudo yum update -ysudo yum install -y wget curl vim net-tools…

【C语言】11月第二次测试 ing

文章目录 1.输入n名同学的成绩和学号&#xff0c;对成绩排序&#xff0c;输出对应学号 要求重复的学号重新输入 计算n名同学的平均值&#xff0c;对小于60分的同学删除分数 大于60分的同学输出&#xff1a;优秀&#xff1a;几人&#xff0c;良好&#xff1a;几人&#xff0c;中…

07 - Clickhouse之ReplacingMergeTree和SummingMergeTree引擎

目录 一、ReplacingMergeTree引擎 1、简介 2、去重的时机 3、去重范围 4、案例 二、SummingMergeTree引擎 1、简介 2、案例 3、结论 一、ReplacingMergeTree引擎 1、简介 ReplacingMergeTree 是 MergeTree 的一个变种&#xff0c;它存储特性完全继承 MergeTree&#…

[论文阅读]Can GNN be Good Adapter for LLMs?

Can GNN be Good Adapter for LLMs? http://arxiv.org/abs/2402.12984 WWW 24: Proceedings of the ACM Web Conference 2024 研究背景和问题&#xff1a; &#xff08;1&#xff09;实际应用场景和问题提出 大型语言模型&#xff08;LLM&#xff09;在自然语言处理&…