后端登录后返回访问令牌、刷新令牌、用户角色,采用 localStorage 本地存储方式,但基本每个页面都需要调用,如加载角色信息,根据角色显示界面,登录态管理等。
如果自己写一套函数打包,然后调用,耗时耗力。这是每个项目重复的工作,可使用 Vue Pinia 工具管理。
创建存储函数
创建变量
根据 pinia 模板,先创建 3 个变量,同时从 localStorage 读取初始化
state: () => ({
accessToken: localStorage.getItem(ACCESS_TOKEN_KEY),
refreshToken: localStorage.getItem(REFRESH_TOKEN_KEY),
user: parseUser(localStorage.getItem(USER_KEY)),
}),行为控制
创建四个函数
SetAuth()当登录成功后保存返回的登录信息。clear()登出按钮可用hasRole()是不是该角色hasAnyRole()是否拥有任意一个角色
actions: {
setAuth(accessToken, refreshToken, user) {},
clear() {},
hasRole(role) {},
hasAnyRole(…roles) {},
},setAuth()
setAuth(accessToken, refreshToken, user) {
// 在 state 中存一份
this.accessToken = accessToken
this.refreshToken = refreshToken
this.user = user
// 本地存一份
localStorage.setItem(ACCESS_TOKEN_KEY, accessToken)
localStorage.setItem(REFRESH_TOKEN_KEY, refreshToken)
localStorage.setItem(USER_KEY, JSON.stringify(user))
},获取派生状态
getters: {
//判断是否存在登录
isLoggedIn: (state) => !!state.accessToken,
},getters 主要是对内部的变量进行派生计算,可以看到 isLoggedIn 是根据 state 内的变量产生的,不依赖外部变量,如果需要传入外部参数的,都应放到 actions 中
调用
在其他模块文件中导入,将函数赋值到常量中,可通过下面示例方式调用。
import { useAuthStore } from '@/stores/auth'
const auth = useAuthStore()
const user = auth.user
auth.clear()