vue根据后端菜单自动生成路由(动态路由)

router.js

import Vue from 'vue'
import Router from 'vue-router'
import store from '../store'
import generateRouter from './generateRouter'
import cookie from './cookie.js'
Vue.use(Router)
let router = new Router()
const getRouter = () => {
router.matcher = new Router().matcher//重置路由
router = generateRouter(router)
}

// 在菜单改变时调用重新生成菜单
getRouter() // 全局守卫 控制用户未登录状况下的加载
router.beforeEach(async (to, from, next) => {
if (to.name) { //路由正确
if (to.matched.some(res => res.meta.requireLogin)) { //需要登录
// 判断是否需要登录权限
if (['true', true].indexOf(cookie.getCookie('isLogin')) > -1) {
//判断是否有用户信息
!sessionStorage.getItem('userInfo') && (await store.dispatch('getUserInfo'))
//判断是否有权限树信息
!localStorage.getItem('menuList') && (await store.dispatch('getMenuListByUser')) // next()
} else {
next({
name: 'loginLink1'
})
}
} else {
next()
}
} else { //路由错误
if (['true', true].indexOf(cookie.getCookie('isLogin')) > -1) { //已经登录
next({
name: 'navigationLink'
})
} else {
next({
name: 'loginLink1'
})
}
}
})
const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
}
export { router, getRouter }

生成菜单generateRouter.js

// import router from './index'
// import Router from 'vue-router'
// const router = new Router()
const routes = [
{
path: '/',
name: 'indexLink1',
component: resolve => require(['@/view/index.vue'], resolve),
redirect: '/navigation',
meta: {
title: '首页',
requireLogin: true
},
children: []
},
{
path: '/navigation',
name: 'navigationLink',
component: resolve => require(['@/view/navigation/index.vue'], resolve),
meta: {
title:'导航页',
requireLogin: true
}
},
{
path: '/login',
name: 'loginLink1',
component: resolve => require(['@/view/login/login.vue'], resolve),
meta: {
requireLogin: false
}
},
{
path: '/404',
name: 'unfoundLink',
component: resolve => require(['@/view/404.vue'], resolve),
meta: {
requireLogin: true
}
},
{
path: '/401',
name: 'unPermissionLink',
component: resolve => require(['@/view/401.vue'], resolve),
meta: {
requireLogin: true
}
}
]
const generateRouter = (router) => {
routes[0].children = []
const menuList = JSON.parse(localStorage.getItem('menuList'))
function getAllLeaf(data) {
const result = []
function getLeaf(data) {
data.forEach(item => {
if (!item.hasChild) {
result.push(item)
} else {
getLeaf(item.children)
}
})
}
getLeaf(data)
return result
} if (menuList && menuList.length !== 0) {
const menuLeafList = getAllLeaf(menuList)
menuLeafList.forEach(item => {
if (item.url) {
routes[0].children.push({
path: item.url,
name: `${item.url.split('/').join('')}Link`,
component: (resolve) => require(['@/view' + item.url + '.vue'], resolve),
meta: {
requireLogin: true
}
})
}
})
} router.options.routes = []
routes.forEach(item => {
router.addRoute(item)
router.options.routes.push(item)
})
return router
} export default generateRouter

cookie.js

const cookie = {
/**
* 设置cookie
* @param cname 名称
* @param cvalue 值
* @param exhours 过期时间(单位:小时)
*/
setCookie(cname, cvalue, exhours = 0) {
let expires = ''
if (exhours) {
const d = new Date();
d.setTime(d.getTime() + (exhours * 60 * 60 * 1000));
expires = "expires=" + d.toGMTString();
}
document.cookie = cname + "=" + cvalue + "; " + expires;
},
/**
* 获取cookie
* @param cname 名称
* @return {string}
*/
getCookie(cname) {
const name = cname + "=";
const ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
const c = ca[i].trim();
if (c.indexOf(name) === 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
} export default cookie

vue根据后端菜单自动生成路由(动态路由)的更多相关文章

  1. 06 Vue路由简介,原理,实现及嵌套路由,动态路由

    路由概念 路由的本质就是一种对应关系,比如说我们在url地址中输入我们要访问的url地址之后,浏览器要去请求这个url地址对应的资源. 那么url地址和真实的资源之间就有一种对应的关系,就是路由. 路 ...

  2. vue路由--动态路由

    前面介绍的路由都是路径和组件一对一映射的 有时候需要多个路径映射到一个组件,这个组件根据参数的不同动态改变,这时候需要用到动态路由 动态路由这样定义路由路径: path: '/foo/:id'--可以 ...

  3. 组件化框架设计之apt编译时期自动生成代码&动态类加载(二)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将继续从以下两个内容来介绍组件化框架设计: apt编译时 ...

  4. vue路由-动态路由和嵌套路由

    一.动态路由 我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件.例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染.那么,我们可以在 vue-route ...

  5. SpringCloud微服务实战——搭建企业级开发框架(三十一):自定义MybatisPlus代码生成器实现前后端代码自动生成

      理想的情况下,代码生成可以节省很多重复且没有技术含量的工作量,并且代码生成可以按照统一的代码规范和格式来生成代码,给日常的代码开发提供很大的帮助.但是,代码生成也有其局限性,当牵涉到复杂的业务逻辑 ...

  6. 使用vscode,新建.vue文件,tab自动生成vue代码模板

    第一步: 新建模板并保存 文件 --> 首选项 --> 用户代码片段 --> 输入vue,选择vue.json -->复制 第三步中的模板内容中内容保存 第二步: 添加配置,让 ...

  7. android menu菜单自动生成

    Android提供了一些简单的方法来为应用添加Menu菜单. 提供了三种类型应用菜单: 一.Options Menu:通过Menu按钮调用菜单 1.在/res/目录下新建menu文件夹,用于存储Men ...

  8. Vue 动态路由的实现以及 Springsecurity 按钮级别的权限控制

    思路: 动态路由实现:在导航守卫中判断用户是否有用户信息,通过调用接口,拿到后台根据用户角色生成的菜单树,格式化菜单树结构信息并递归生成层级路由表并使用Vuex保存,通过 router.addRout ...

  9. Vue + Element UI 实现权限管理系统(动态加载菜单)

    动态加载菜单 之前我们的导航树都是写死在页面里的,而实际应用中是需要从后台服务器获取菜单数据之后动态生成的. 我们在这里就用上一篇准备好的数据格式Mock出模拟数据,然后动态生成我们的导航菜单. 接口 ...

随机推荐

  1. springboot集成spring security实现登录和注销

    文章目录 一.导入坐标 二.Users实体类及其数据库表的创建 三.controller,service,mapper层的实现 四.核心–编写配置文件 五.页面的实现 运行结果 一.导入坐标 < ...

  2. socket套接字模块及黏包现象

    一.socket套接字模块 socket概念 socket层 理解socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模 ...

  3. 2021牛客暑期多校训练营3 J 思维

    传送门 J-Counting Triangles_2021牛客暑期多校训练营3 (nowcoder.com) 题目 Goodeat finds an undirected complete graph ...

  4. 论文阅读 Continuous-Time Dynamic Network Embeddings

    1 Continuous-Time Dynamic Network Embeddings Abstract ​ 描述一种将时间信息纳入网络嵌入的通用框架,该框架提出了从CTDG中学习时间相关嵌入 Co ...

  5. python基础练习题(题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少)

    day13 --------------------------------------------------------------- 实例021:猴子偷桃 题目 猴子吃桃问题:猴子第一天摘下若干 ...

  6. Fauce:Fast and Accurate Deep Ensembles with Uncertainty for Cardinality Estimation 论文解读(VLDB 2021)

    Fauce:Fast and Accurate Deep Ensembles with Uncertainty for Cardinality Estimation 论文解读(VLDB 2021) 本 ...

  7. Android 12(S) 图像显示系统 - SurfaceFlinger之VSync-上篇(十六)

    必读: Android 12(S) 图像显示系统 - 开篇 一.前言 为了提高Android系统的UI交互速度和操作的流畅度,在Android 4.1中,引入了Project Butter,即&quo ...

  8. jmeter工具初探

    jmeter工具初探 一.jmeter工具介绍 1.一种免费的java开源工具,可以进行二次开发 2.运行环境:java运行环境,需要安装JDK,配置JAVAHOME 环境变量 3.下载jmeter: ...

  9. Halo 开源项目学习(五):评论与点赞

    基本介绍 博客系统中,用户浏览文章时可以在文章下方发表自己的观点,与博主或其他用户进行互动,也可以为喜欢的文章点赞.下面我们一起分析一下 Halo 项目中评论和点赞功能的实现过程. 发表评论 评论可以 ...

  10. 【CSAPP】Architecture Lab 实验笔记

    archlab属于第四章的内容.这章讲了处理器体系结构,就CPU是怎样构成的.看到时候跃跃欲试,以为最后实验是真要去造个CPU,配套资料也是一如既往的豪华,合计四十多页的参考手册,一大包的源码和测试程 ...