Vue路由权限
Posted web-gmy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue路由权限相关的知识,希望对你有一定的参考价值。
一、路由权限
1、服务端返回权限列表
rules:
// 路有权限,页面权限
page:
home: true,
home_index: true,
count_to: true,
upload: false,
form: true,
store: true
,
component:
// 组件权限
edit_button: true,
dele_button: false
2、拆分路由(把公共路由和权限路由分开,根据路由构建组件)
// 动态路由
export const routerMap = [
path: "/home",
name: "home",
component: Home,
meta: title: "首页" ,
children: [
path: "/home_index",
name: "home_index",
component: () => import("../views/homeIndex.vue"),
meta: title: "首页第一页"
]
,
path: "/count-to",
name: "count_to",
component: () => import("../views/countTo.vue"),
meta: title: "数量"
,
path: "/upload",
name: "upload",
component: () => import("../views/upload.vue"),
meta: title: "下载"
,
path: "/form",
name: "form",
component: () => import("../views/form.vue"),
meta: title: "表单"
,
path: "/store",
name: "store",
component: () => import("../views/store.vue"),
meta: title: "商店"
];
// 默认大家都能访问的路由
export const routes = [
path: "/",
name: "login",
component: () => import("../views/login.vue")
,
path: "*",
component: () => import("../views/404.vue")
];
const router = new VueRouter(
routes
);
3、判断是否获取权限,如果没有获取就发送请求获取在vuex中设置是否获取过权限的标识
export default new Vuex.Store(
state:
// 初始化设置用户没有获取过权限
hasPermisson: false
,
mutations:
setPermisson(state)
console.log("已经获取过权限");
state.hasPermisson = true;
,
actions: ,
modules: router
);
4、在路由的钩子函数中,判断是否获取过权限,如果没有就获取
// 路由钩子
if (process.env.NODE_ENV === "development") require("./mock");
router.beforeEach(async (to, from, next) =>
// 如果没有获取过权限,则获取路由权限
if (!store.state.hasPermisson)
// 发送请求获取权限
let newRouter = await store.dispatch("router/getAuthRouter");
// vueApi动态添加路由的方法
router.addRoutes(newRouter);
// 保证路由加载完毕
next( ...to, replace: true );
else
next();
);
5、在vuex中获取权限列表,并过滤出需要的路由
// 管理路由
import getAuth from "../../api";
// 引入动态路由列表
import routerMap from "../../router/index";
// 过滤,返回有权限的路由列表
function getAccesRouterList(routes, page)
return routes.filter(route =>
if (page[route.name])
// 如果有子路由,递归判断子路由是否有权限
if (route.children)
route.children = getAccesRouterList(route.children, page);
return true;
else
return false;
);
const state =
menuList: [],
// 组件权限
btnPermission:
edit_button: true,
dele_button: true
// edit_button: true,
// dele_button: true
;
const actions =
async getAuthRouter( commit )
let needRouter;
try
// 获取后台返回的权限列表
const authList = await getAuth();
let
rules:
page,
component: edit_button, dele_button
= authList;
// 设置按钮权限
commit("setComp", edit_button, dele_button );
// 根据权限列表来过滤我们需要的路由列表
needRouter = getAccesRouterList(routerMap, page);
// 把权限路由列表放在state
commit("setMenulist", needRouter);
// 已经获取权限,修改权限状态,提交到全局
commit("setPermisson", null, root: true );
catch (e)
console.log(e);
return needRouter;
;
const mutations =
setMenulist(state, routes)
state.menuList = routes;
,
setComp(state, edit_button, dele_button )
console.log("按钮权限");
state.btnPermission.edit_button = edit_button;
state.btnPermission.dele_button = dele_button;
;
export default
namespaced: true,
state,
actions,
mutations
;
以上是关于Vue路由权限的主要内容,如果未能解决你的问题,请参考以下文章