vue根据后端菜单自动生成路由(动态路由)
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根据后端菜单自动生成路由(动态路由)的更多相关文章
- 06 Vue路由简介,原理,实现及嵌套路由,动态路由
路由概念 路由的本质就是一种对应关系,比如说我们在url地址中输入我们要访问的url地址之后,浏览器要去请求这个url地址对应的资源. 那么url地址和真实的资源之间就有一种对应的关系,就是路由. 路 ...
- vue路由--动态路由
前面介绍的路由都是路径和组件一对一映射的 有时候需要多个路径映射到一个组件,这个组件根据参数的不同动态改变,这时候需要用到动态路由 动态路由这样定义路由路径: path: '/foo/:id'--可以 ...
- 组件化框架设计之apt编译时期自动生成代码&动态类加载(二)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将继续从以下两个内容来介绍组件化框架设计: apt编译时 ...
- vue路由-动态路由和嵌套路由
一.动态路由 我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件.例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染.那么,我们可以在 vue-route ...
- SpringCloud微服务实战——搭建企业级开发框架(三十一):自定义MybatisPlus代码生成器实现前后端代码自动生成
理想的情况下,代码生成可以节省很多重复且没有技术含量的工作量,并且代码生成可以按照统一的代码规范和格式来生成代码,给日常的代码开发提供很大的帮助.但是,代码生成也有其局限性,当牵涉到复杂的业务逻辑 ...
- 使用vscode,新建.vue文件,tab自动生成vue代码模板
第一步: 新建模板并保存 文件 --> 首选项 --> 用户代码片段 --> 输入vue,选择vue.json -->复制 第三步中的模板内容中内容保存 第二步: 添加配置,让 ...
- android menu菜单自动生成
Android提供了一些简单的方法来为应用添加Menu菜单. 提供了三种类型应用菜单: 一.Options Menu:通过Menu按钮调用菜单 1.在/res/目录下新建menu文件夹,用于存储Men ...
- Vue 动态路由的实现以及 Springsecurity 按钮级别的权限控制
思路: 动态路由实现:在导航守卫中判断用户是否有用户信息,通过调用接口,拿到后台根据用户角色生成的菜单树,格式化菜单树结构信息并递归生成层级路由表并使用Vuex保存,通过 router.addRout ...
- Vue + Element UI 实现权限管理系统(动态加载菜单)
动态加载菜单 之前我们的导航树都是写死在页面里的,而实际应用中是需要从后台服务器获取菜单数据之后动态生成的. 我们在这里就用上一篇准备好的数据格式Mock出模拟数据,然后动态生成我们的导航菜单. 接口 ...
随机推荐
- caioj 1000: [视频]整数运算[水题]
题目大意:输入两个整数a和b,输出他们的和. 题解:水题不用题解,简单看一下就知道了-- 代码: #include <cstdio> int a, b; int main() { whil ...
- 搭建Vue小页面
学习链接:https://blog.csdn.net/zhenzuo_x/article/details/81013475 环境搭建: 浏览器:Chrome IDE:VS Code或者WebStorm ...
- Cocos Creator绕远做圆周运动,且变换运动物体的角度
需求:绕远做圆周运动 并且精灵的角度要随着位置的改变而改变 网上有很多做圆周运动的代码,但是要不然就是角度不变 要不然就是cocos版本老旧 摘了一段3.x的圆周运动,自己加了角度变换 圆周运动,已知 ...
- 如何为我的VUE项目编写高效的单元测试--Jest
Unit Testing(单元测试)--Jest 一个完整的测试程序通常由几种不同的测试组合而成,比如end to end(E2E)测试,有时还包括整体测试.简要测试和单元测试.这里要介绍的是Vue中 ...
- 打基础丨Python图像处理入门知识详解
摘要:本文讲解图像处理基础知识和OpenCV入门函数. 本文分享自华为云社区<[Python图像处理] 一.图像处理基础知识及OpenCV入门函数>,作者: eastmount. 一.图像 ...
- 【在下版本,有何贵干?】Dockerfile中 RUN yum -y install vim失败Cannot prepare internal mirrorlist: No URLs in mirrorlist
隐秘的版本问题---- Dockerfile中 RUN yum -y install vim失败Cannot prepare internal mirrorlist: No URLs in mirro ...
- 详解计算miou的代码以及混淆矩阵的意义
详解计算miou的代码以及混淆矩阵的意义 miou的定义 ''' Mean Intersection over Union(MIoU,均交并比):为语义分割的标准度量.其计算两个集合的交集和并集之比. ...
- Unity实现简单的对象池
一.简介 先说说为什么要使用对象池 在Unity游戏运行时,经常需要生成一些物体,例如子弹.敌人等.虽然Unity中有Instantiate()方法可以使用,但是在某些情况下并不高效.特别是对于那些需 ...
- NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法)
前言 本文介绍了NMS的应用场合.基本原理.多类别NMS方法和实践代码.NMS的缺陷和改进思路.介绍了改进NMS的几种常用方法.提供了其它不常用的方法的链接. 本文很早以前发过,有个读者评论说 ...
- Spring 源码(12)Spring Bean 的创建过程(3)
继续上一篇Spring Bean的创建过程的解读,上一篇介绍了Spring在创建过程中doGetBean方法,在执行过程中会调用getSingleton方法并且设置一个lambda表达式,这个lamb ...