第一种:完全由前端拦截
1.定义几种用户权限:
属性名:用户名;
let ku={
'xtadmin':['/菜单路由地址1','/菜单路由地址2'],
'aqadmin':['/菜单路由地址1','/菜单路由地址2'],
'sjadmin':['/菜单路由地址1','/菜单路由地址2']
}
2.登陆成功后判断是哪个用户登陆的,让其跳转到其对于的权限的首页
全局守卫:
router.beforeEach((to, from, next) => {
//监听跳转的路由地址是否为该用户权限范围内的,若不是则跳回其权限首页
}
3.封装axios请求拦截器去拦截不是该用户权限的请求
// 请求拦截器
service.interceptors.request.use(config => {
//判断 config.url和config.method去拦截请求
return
}, error => {
console.log(error)
Promise.reject(error)
})
缺点
- 加载所有的路由,如果路由很多,而用户并不是所有的路由都有权限访问,对性能会有影响。
- 全局路由守卫里,每次路由跳转都要做权限判断。
- 菜单信息写死在前端,想修改权限都要修改前端代码
- 菜单跟路由耦合在一起,定义路由的时候还有添加菜单显示标题,图标之类的信息,而且路由不一定作为菜单显示,还要多加字段进行标识
第二种:用户的权限路由地址存在数据库中,登陆时由后端返回
这种方式工作中常用
菜单与路由完全由后端返回
1.前端统一定义路由组件
const Home = () => import("../pages/Home.vue");
const UserInfo = () => import("../pages/UserInfo.vue");
export default {
home: Home,
userInfo: UserInfo
};
后端返回的格式:(后端返回该用户所对应的路由信息,如下)
const permissionRouter=[
{name: "home",path: "/",component: "home"},
{name: "UserInfo ",path: "/userinfo",component: "userInfo"}
]
2.在将后端返回路由通过addRoutes动态挂载之前,需要将数据处理一下,将component字段换为真正的组件。
后端返回的地址是字符串,把它转化为真正的组件
const formatRoutesByComponentPath = function (routes) {
routes.forEach(route => {
route.component = () => import(`../${route.componentPath}.vue`)
//判断是否套着子路由
if (route.children) {
formatRoutesByComponentPath(route.children)
}
})
}
//调用
formatRoutesByComponentPath(permissionRouter);
//添加有权限的路由组件
router.addRoutes(permissionRouter);
此方法不要每个页面都去添加路由守卫狗去判断有无权限,手动修改无权限地址直接报404!