需求
- 在Pinia Store存储登录凭证,在router中使用。登录失效或退出时,清空凭证。
- 未登录时,禁止通过地址栏跳转页面。
- 登录失效时,禁止history地址导航。并且替换掉失效前的地址,只在login页停留。
一、代码
import { reactive, ref } from "vue";
import { defineStore, acceptHMRUpdate } from "pinia";
export const useUser = defineStore(
"userInfo",
() => {
let token = ref<string>("");
let isAuthenticated = ref<boolean>(false);
const setToken = (str: string = "") => {
token.value = str;
};
const setAuthenticated = (flag: boolean = false) => {
isAuthenticated.value = flag;
};
const clearStorage = () => {
setToken();
setAuthenticated();
};
return {
isAuthenticated,
token,
setToken,
setAuthenticated,
clearStorage,
};
},
{
persist: {
storage: window.sessionStorage,
},
}
);
if (import.meta.hot) {
import.meta.hot.accept(acceptHMRUpdate(useUser, import.meta.hot));
}
import {
createRouter,
createWebHistory,
createWebHashHistory,
} from "vue-router";
import { useUser } from "@/stores/user";
const router = createRouter({
});
router.beforeEach((to, from, next) => {
const userStore = useUser();
if (to.path !== "/login" && !userStore.isAuthenticated) {
next({ path: "/login", replace: true ,force:true});
} else {
next();
}
});
export default router;