token权限思路描述
login接口返回token,getInfo接口返回routes,name等信息
如果有name则放行,否则,发请求去拿用户信息
token权限代码
import router from "./router";
import store from "./store";
import { Message } from "element-ui";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import getPageTitle from "@/utils/get-page-title";
NProgress.configure({ showSpinner: false });
const whiteList = ["/login"];
router.beforeEach(async (to, from, next) => {
NProgress.start();
document.title = getPageTitle(to.meta.title);
const token = store.getters.token;
if (token) {
if (to.path === "/login") {
next({ path: "/" });
NProgress.done();
} else {
const hasLogin = !!store.getters.name;
if (hasLogin) {
next();
} else {
try {
await store.dispatch("user/getInfo");
next(to);
NProgress.done();
} catch (error) {
await store.dispatch("user/resetUser");
Message.error(error || "Has Error");
next(`/login?redirect=${to.path}`);
NProgress.done();
}
}
}
} else {
if (whiteList.indexOf(to.path) !== -1) {
next();
} else {
next(`/login?redirect=${to.path}`);
NProgress.done();
}
}
});
router.afterEach(() => {
NProgress.done();
});
路由权限
1.常量路由
包括登陆/404/首页
2.
3.
router.addRoutes([...asyncRoutes, anyRoute]);
按钮权限
<template>
<el-button v-bind="$attrs" v-if="userInfoStore.buttons.includes(permission)">
<slot />
</el-button>
</template>
<script lang="ts">
export default {
name: "PermissionButton",
};
</script>
<script lang="ts" setup>
import { useUserInfoStore } from "@/stores/userInfo";
const userInfoStore = useUserInfoStore();
defineProps<{
permission: string;
}>();
</script>
<style scoped></style>