vue3使用pinia 实现权限code存取

文章目录

  • 前言
  • 一、pinia 简要认识
  • 二、实现思路
  • 三、详细实现步骤
      • 1.用pinia 定义user store 用来存储用户相关的数据,安装 **js-cookie **来辅助存在cookie里
      • 2. 在登录后获取用户的userId 与 token 后,调用定义好的 getUserPermisson 获取用户的权限code,并且存储起来
      • 3. 在路由守卫 **router.beforeEach** 取到code 然后过滤路由菜单
  • 总结


前言

上一篇 vue3+element-plus权限控制实现(el-tree父子级不关联情况处理)
主要描述了权限控制综合实例中 el-tree 组件的使用细节。
这一篇,主要讲讲pinia 来存取权限code ,并且在 router.beforeEach 实现菜单的权限控制。


一、pinia 简要认识

Pinia 起始于 2019 年 11 月左右的一次实验,其目的是设计一个拥有组合式 API 的 Vue 状态管理库。

yarn add pinia
# 或者使用 npm
npm install pinia
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'const pinia = createPinia()
const app = createApp(App)app.use(pinia)
app.mount('#app')

二、实现思路

登录后获取用户的权限code,用pinia存储起来,在路由守卫 router.beforeEach 取到code 然后过滤路由菜单。我这里的路由表是提前写好在前端的,主要结构如下图,其中关键的是meta 里面自定义的code,根据这个来判断是否拥有权限的。

{path: '/pathXXX',name: 'pathXXX',meta: {keepAlive: true, //设置页面是否需要使用缓存title: 'pathXXX',icon: 'ShoppingCart',code: 'PermissionCode'  // 权限code},component: Layout,redirect: '/pathXXX/list',children: [{name: 'subPathXXX',path: '/subPathXXX',component: () => import('@/views/subPathXXX/index.vue'),meta: {keepAlive: true, title: 'subPathXXX',icon: 'ShoppingCart',menuCode: 'subPermissionCode'}}]},

三、详细实现步骤

1.用pinia 定义user store 用来存储用户相关的数据,安装 **js-cookie **来辅助存在cookie里

import { defineStore } from 'pinia'
import Cookie from 'js-cookie'
import { getUserPermissonApi } from '@/api/xxx'
/*** @description 获取cookie* @param name* @returns value*/
function getCookie(name: any) {return Cookie.get(name)
}
/*** @description 设置 cookie* @param name* @param value* @returns value*/
function setCookie(name: any, value: any) {return Cookie.set(name, value)
}// 你可以对 `defineStore()` 的返回值进行任意命名,但最好使用 store 的名字,同时以 `use` 开头且以 `Store` 结尾。(比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const useUserInfoStore = defineStore('app-user', {state: () => ({menuPermission: getCookie('key') ? JSON.parse(getCookie('key') as any) : {}}),actions: {setUserPermisson(info: any) {this.menuPermission = infosetCookie('key', this.menuPermission ? JSON.stringify(this.menuPermission) : '[]')},async getUserPermisson(params: {}) {try {const { data } = await getUserPermissonApi(params)this.setUserPermisson(data) // 这里就是获取code 对应上文 路由表结构中meta.code 来判断是否显示该菜单} catch (erro) {console.warn(erro)}}}
})

2. 在登录后获取用户的userId 与 token 后,调用定义好的 getUserPermisson 获取用户的权限code,并且存储起来

<script setup>
import { useUserInfoStore } from '@/store/modules/user'
const store = useUserInfoStore ()
const getUserPermissionCode = () => {// 获取了用户userid 等store.getUserPermisson({userid :xxx})
}
</script>

3. 在路由守卫 router.beforeEach 取到code 然后过滤路由菜单

import { start, done, configure } from 'nprogress'
// 提前写好路由表,主要meta.code 要对应上let asyncRoutes: RouteRecordRaws[] = [{path: '/Pathxx',name: 'Pathxx',meta: {keepAlive: true,title: 'Pathxx',icon: 'x',code: '/Pathxx'},component: Layout,redirect: '/Pathxx',children: [{name: 'subPathXX',path: '/subPathXX',component: () => import('@/views/subPathXX/index.vue'),meta: {keepAlive: true, title: 'subPathXX',icon: 'subPathXX',menuCode: 'subPathXX'}}]},
]configure({ showSpinner: false }) // NProgress 配置
const whiteList = ['/login']
router.beforeEach(async (to: RouteLocationNormalized, from: RouteLocationNormalized, next) => {start()const usePermission = usePermissionStore() //注意这个写在router.beforeEach 内部,写在外面有作用域问题const curToken = userStore.getTokenif (curToken) {if (to.path === '/login') {next({ path: DefaultRoute })done()} else {try {const codeArr = usePermission.getMenuPermission || []const filterDynamicRoutes = (routes: any) => {for (let len = routes.length - 1; len >= 0; len--) {if (Array.isArray(codeArr) && codeArr.includes(routes[len].meta.menuCode)) {// 说明都有continue} else {if (routes[len].children && routes[len].children.length > 0) {filterDynamicRoutes(routes[len].children)} else {routes.splice(len, 1)}}}}filterDynamicRoutes(asyncRoutes)next(to.path)} catch (error) {next(`${import.meta.env.VITE_BASE_REDIRECT_TO}?redirect=${to.path}`)done()}}} else {if (whiteList.includes(to.path)) {next()} else {done()}}
})

总结

在本文我们一开始了解了pinia是什么以及如果安装使用。接着结合使用pinia实现菜单权限控制的综合实例,来进一步了解pinia的使用。

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

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

相关文章

OpenAI官方吴达恩《ChatGPT Prompt Engineering 提示词工程师》(2)如何迭代开发提示词

迭代/Iterative 在机器学习中&#xff0c;您经常有一个想法&#xff0c;然后实现它。编写代码&#xff0c;获取数据&#xff0c;训练模型&#xff0c;这就给您一个实验结果。然后您可以查看该输出&#xff0c;进行错误分析&#xff0c;找出哪些地方工作或不工作&#xff0c;然后…

VMware/kali使用小贴士(持续更新(吧

关于截屏 kali截屏快捷键 关于虚拟机和主机切屏 因为kali不全屏看还挺难受的&#xff0c;全屏了又很难切回主机 虚拟机全屏时&#xff0c;可以先Alt Ctrl取消对VM的控制&#xff08;光标移到上方白条也是同理&#xff09;&#xff0c;然后Alt Tab切换窗口

郁金香2021年游戏辅助技术(初级班)(上)

郁金香2021年游戏辅助技术初级班&#xff08;上&#xff09; %p、size_t、%zd、%llu、FindWindow、GetWindowText、SetWindowTextGetWindowThreadProcessId、OpenProcess、ReadProcessMemory封接读内存接口函数 int R4(void* 地址)跨进程向目标进程内存地址写入数值 WriteProce…

【每日一题】递枕头

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;模拟方法二&#xff1a; O ( 1 ) O(1) O(1) 解法 写在最后 Tag 【模拟】【 O ( 1 ) O(1) O(1) 公式】【2023-09-26】 题目来源 2582. 递枕头 题目解读 编号从 1 到 n 的 n 个人站成一排传递枕头。最初&#xff0c;排…

华南理工大学电子与信息学院23年预推免复试面试经验贴

运气较好&#xff0c;复试分数90.24&#xff0c;电科学硕分数线84、信通83、专硕电子与信息74. 面试流程&#xff1a; 1&#xff1a;5min ppt的介绍。其中前2min用英语简要介绍基本信息&#xff0c;后3min可用英语也可用中文 介绍具体项目信息如大创、科研、竞赛等&#xff08…

出现 conda虚拟环境默认放在C盘 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法3.1 方法一3.2 方法二1. 问题所示 通过conda配置虚拟环境的时候,由于安装在D盘下,但是配置的环境默认都给我放C盘 通过如下命令:conda env list,最后查看该环境的确在C盘下 2. 原理分析 究其根本原因,这是因为默认路径没有足够的…

编程每日一练(多语言实现):判断偶数

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现 一、实例描述 利用单条件单分支选择语句判断输入的一个整数 是否是偶数。 运行程序&#xff0c;输入一个 整数18&#xff0c; 然后按回车键&#xff0c;将提示该数字是偶数…

linux使用操作[2]

文章目录 版权声明网络传输ping命令wget命令curl命令端口linux端口端口命令和工具 进程管理查看进程关闭进程 主机状态top命令内容详解磁盘信息监控 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相…

Android ConstraintLayout app:layout_constraintHorizontal_weight

Android ConstraintLayout app:layout_constraintHorizontal_weight <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:…

【已解决】qt死活不响应鼠标移动到按钮事件

本博文源于笔者正在研究的内容&#xff0c;这个问题大概捣鼓了一个下午&#xff0c;问题是这样子&#xff1a;我有一个按钮&#xff0c;我应用程序运行时&#xff0c;我鼠标放到按钮上&#xff0c;按钮就会被填充图标。怀揣着这样一个想法&#xff0c;我搜啊搜&#xff0c;整啊…

verilog学习笔记(1)module实例化2

移位寄存器多路选择器 我的代码&#xff1a; module top_module ( input clk, input [7:0] d, input [1:0] sel, output [7:0] q );wire [7:0] w1;wire [7:0] w2;wire [7:0] w3;my_dff8 my_dff8_1(.clk(clk),.d(d),.q(w1));my_dff8 my_dff8_2(.clk(clk),.d(w1),.q(w2));my_d…

前端知识总结

在前端开发中&#xff0c;y x是一种常见的自增运算符的使用方式。它表示将变量x的值自增1&#xff0c;并将自增后的值赋给变量y。 具体来说&#xff0c;x是一种后缀自增运算符&#xff0c;表示将变量x的值自增1。而y x则是将自增前的值赋给变量y。这意味着在执行y x之后&am…

【每日一题】ARC098D - Xor Sum 2 | 思维 | 简单

题目内容 原题链接 给定一个长度为 n n n 的数组 a a a&#xff0c;问有多少个连续子数组的和满足区间加法和等于区间异或和。 数据范围 1 ≤ n ≤ 2 ⋅ 1 0 5 1\leq n\leq 2\cdot 10^5 1≤n≤2⋅105 0 ≤ k < 2 20 0\leq k<2^{20} 0≤k<220 题解 考虑异或是不进…

前端教程-H5游戏开发

Egret EGRETIA RC 版本正式发布 从端到云一站式区块链游戏开发工作流 官网 Laya Air 在渲染模式上&#xff0c;LayaAir 支持 Canvas 和 WebGL 两种方式&#xff1b;在工具流的支持程度上&#xff0c;主要是提供了 LayaAir IDE。LayaAir IDE 包括代码模式与设计模式&#xff…

【MySQL】表的约束

文章目录 1. 表的约束概述2. 空属性 not null3. 默认值 default4. 列描述 comment5. zerofill6. 主键 primary key7. 自增长 auto_increment8. 唯一键 unique9. 外键 foreign key 1. 表的约束概述 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要…

软考高级系统架构设计师系列论文真题九:论软件多层架构的设计

软考高级系统架构设计师系列论文真题九:论软件多层架构的设计 一、论软件多层架构的设计二、理论素材准备三、精品范文赏析1.摘要2.正文3.总结软考高级系统架构设计师系列论文之:百篇软考高级架构设计师论文范文软考高级系统架构设计师系列之:论文题目类型、论文考试大纲、历…

基于微信小程序的英语互助小程序设计与实现(亮点:小组制打卡、模拟考试答题、错题本、学习论坛)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

Java 接口多实现动态调用

简单定义一个接口,做数据插入 public interface ImportingData<T> {AjaxResult addData(T t); }目前本文使用的是根据泛型类实现动态调用,在引入时必须明确是那个实体类, 还有种方法就是给每一个实现类定义业务类型的枚举,这时候子啊接口里面就得多写一个返回枚举的实现…

代码随想录 第8章 二叉树

1、理论知识 &#xff08;1&#xff09;、满二叉树 如果一棵二叉树只有度为0的节点和度为2的节点&#xff0c;并且度为0的节点在同一层上&#xff0c;则这棵二叉树为满二叉树。 &#xff08;2&#xff09;、完全二叉树 除了底层节点可能没有填满&#xff0c;其余每层的节点…

什么是 AirServer?Mac专用投屏工具AirServer 7 .27 for Mac中文破解版百度网盘下载

AirServer 7 .27 for Mac中文免费激活版是一款Mac专用投屏工具&#xff0c;能够通过本地网络将音频、照片、视频以及支持AirPlay功能的第三方App&#xff0c;从 iOS 设备无线传送到 Mac 电脑的屏幕上&#xff0c;把Mac变成一个AirPlay终端的实用工具。 目前最新的AirServer 7.2…