|
|
<
项目创立过程当中常常碰到的一个需供便是权限办理,本文便我正在利用静态路由的过程当中举办一个总结
起首,前端念要完成对菜单的静态衬着实践上有两种操纵方法
1.前端仍是誊写静态路由表,按照后端传去的code利用v-if来判定衬着菜单项
实践这类利用方法其实不可与,由于没有便利前期保护。
2.前端只写出有权限掌握的login,register, 404 页里的路由,其他路由则是按照后端传过去的,拼接进路由表。
那里我正在项目中利用的第两种办法
起首,我们要先了解静态路由表的恳求战增加皆是发作正在路由保卫里边的。
没有空话间接上代码
- const whiteList = ["/login", "/register"]; // 利剑名单,没有需求token也能够进进的页里
- router.beforeEach(async (to, from, next) => {
- NProgress.start();
- // document.title = to.meta.title;
- // 获得用户token,用去判定当前用户能否登录
- const hasToken = getToken();
- if (hasToken) {
- if (whiteList.indexOf(to.path) !== -1) {
- next();
- NProgress.done();
- } else {
- // 用去获得背景拿到的路由
- const route = await store.getters.addRouters;
- // console.log("to.path", to.path, route);
- if (route && route.length > 0) {
- if (to.path === "/") {
- next("/console");
- }
- next();
- NProgress.done();
- } else {
- store.dispatch("queryMenuList").then(({ servers }) => {
- // console.log("拿到的初初路由构造", servers);
- filterAsyncRouter(servers);
- const menus = store.getters.addRouters;
- const routerMap = newRouter(menus);
- for (let key in routerMap) {
- router.addRoute("layout", routerMap[key]);
- }
- router.addRoute({ // 那里是对404页里的一个重定背
- path: "*",
- redirect: "/404",
- hidden: true,
- });
- let homeChildren = router.options.routes[2];
- // homeChildren = menus
- homeChildren["children"] = routerMap;
- // console.log("终极的", menus);
- next({
- ...to,
- replace: true,
- }); // hack办法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
- NProgress.done();
- });
- }
- next();
- NProgress.done();
- }
- } else {
- if (whiteList.indexOf(to.path) !== -1) {
- // 需求跳转的路由能否是whiteList中的路由,如果,则间接条状
- next();
- } else {
- // 需求跳转的路由没有是whiteList中的路由,间接跳转到登录页
- // console.log("redirect",to.fullPath)
- next("/login?redirect=" + to.fullPath);
- // 完毕粗度条
- NProgress.done();
- }
- }
- });
复造代码 store.dispatch(“queryMenuList”)那里是我正在vuex中界说的恳求静态路由表的办法;
filterAsyncRouter办法
从后端间接恳求过去的静态路由表常常是不克不及间接利用的,我们需求把他的数据构造转换成我们前端路由表的构造。而且把组件对应到路由中来。
- const _import = require("@/router/_import_" + process.env.NODE_ENV); //获得组件的办法
- function filterAsyncRouter(asyncRouterMap) {
- // 过滤静态路由
- const newArr = [];
- asyncRouterMap.forEach((item) => {
- const component = _import(item.component);
- // console.log("component", component, item.component ,item.path);
- let routerTemplate = {
- name: item.serverName,
- id: item.id,
- path: item.path,
- component,
- };
- if (item.children && item.children.length > 0) {
- routerTemplate.children = filterRouter(item.children);
- }
- newArr.push(routerTemplate);
- });
- return newArr;
- }
复造代码 _import是引进组件的办法,具体感化便是把组件对应到路由表中来
- module.exports = (file) => {
- // console.log("传出去的组件地点", file);
- var a = true;
- try {
- // (resolve) => require("@/views/" + file + "/index.vue", resolve)
- return require("@/views/" + file + "/index.vue").default;
- } catch (e) {
- a = false;
- }
- if (a) {
- // console.log("要找的地点2", "@/views/" + file + "/index.vue");
- return require("@/views/" + file + "/index.vue").default;
- }
- };
复造代码 拿到及格的路由以后我们就能够把路由放到项目路由表中来了
先看一下我们的静态路由
- // 设置项目中出有触及权限的大众路由
- export const constantRoutes = [
- {
- path: "/login", // 登岸
- component: login,
- },
- {
- path: "/register", // 登岸
- component: register,
- },
- {
- path: "/",
- name: "layout",
- component: layout,
- children: [],
- },
- {
- path: "/404",
- name: "notFound",
- component: notFound,
- },
- // {
- // path: "*",
- // redirect: "/404",
- // },
- ];
复造代码 我利用的是vue-router是@3.5.2版本以是增加路由利用的是addRoute办法,低版本的vue-router能够测验考试addRoutes办法。(ps:addRoute办法需求一个工具一个工具增加,因而下边利用了for轮回,addrouters办法能够间接把数组增加到路由表中)
- for (let key in routerMap) {
- router.addRoute("layout", routerMap[key]);
- }
- router.addRoute({
- path: "*",
- redirect: "/404",
- hidden: true,
- });
复造代码 大要:addRoute能够选则路由插进地位。
- router.addRoutes(menus.concat([{
- path: '*',
- redirect: '/404',
- hidden: true
- }]));
复造代码 给各人表白一下上边对404的疑问,之以是静态路由表把重定背来失落,是由于利用静态路由是同步减载,假设把重定背放静态路由便会招致404劣先级变得很下。放正在同步路由以后再减载重定背,无疑是最公道且契合项目请求的。
到那里同步路由便减载终了了,能够一般利用。后边便是对多级菜单的静态衬着了,假设有需供能够参考另外一篇文章
对多级菜单的静态衬着
免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作! |
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
|