前端开发之vue动态路由实现方案
前端开发之vue动态路由实现方案
- 前言
- 2. 实现
- 1、登录页面创建登录函数和watch监听路由
- 2、调用的login方法
- (1)登录方法
- (2)存储token
- 3、router.push的时候调用路由守卫
- (1)创建路由守卫,建议路由守卫封装为单独的文件
- (2)var文件引用
- (3)将在main中添加调用,由于我封装到permissions.ts文件中,通过var文件调用
- (4) setRoutes方法:存储vuex中routes,合并路由列表
- (5)filterRoutes:根据权限和rolesControl过滤路由
- (6)toLoginRoute:
- 4、创建router.js 文件,创建路由列表和添加路由的方法
前言
本篇讲解的路由实现方案:默认存在的路由json->登录获取路由的json数据和权限->index.vue页面通过watch监听router为路由附加默认值->通过router.push跳转->触发beforeEach实现页面权限的判断和addrouter合并路由列表
2. 实现
1、登录页面创建登录函数和watch监听路由
//redirect 赋值
watch: {$route: {handler (route) {this.redirect = (route.query && route.query.redirect) || '/'},immediate: true}},
//登录函数
const ruleForm = ref('')
const login = (userInfo) => {dispatch('user/login', userInfo)
}
const handleRoute = () => {return data.redirect === '/404' || data.redirect === '/403'? '/': data.redirect
}
const handleLogin = () => {ruleForm.value.validate(async (valid) => {if (valid) {try {data.loading = trueawait login(data.forms)await router.push(handleRoute())} finally {data.loading = false}}})
}
2、调用的login方法
(1)登录方法
const actions = {//登录成功将token存储到localStorage中,并为vuex的token中赋值async login ({ commit }: { commit: any }, userInfo: any) {// const { data } = await login(userInfo)// const token = data[tokenName]const token = 'admin-token-bbfd1c4e-4e11-F71E-B4B6-aEbCE62cDC3A'if (token) {commit('setToken', token)const hour = new Date().getHours()} else {const err = `登录接口异常,未正确返回${tokenName}...`throw err}}
}
(2)存储token
* @description 存储token* @param token*/
export function setToken (token:any) {if (storage) {if (storage === 'localStorage') {return localStorage.setItem(tokenTableName, token)} else if (storage === 'sessionStorage') {return sessionStorage.setItem(tokenTableName, token)} else if (storage === 'cookie') {return cookie.set(tokenTableName, token)} else {return localStorage.setItem(tokenTableName, token)}} else {return localStorage.setItem(tokenTableName, token)}
}
3、router.push的时候调用路由守卫
(1)创建路由守卫,建议路由守卫封装为单独的文件
详细讲解了路由的跳转和
/*** @description 路由守卫*/
import store from '@/store'
import router from '@/router'
import getPageTitle from '@/utils/pageTitle'
import { toLoginRoute } from '@/utils/routes'
import configOb from '@/config'
//调用封装的配置文件
//intelligence(前端导出路由)和all(后端导出路由)两种方式
//authentication: 'intelligence',
const { authentication } = configOb
export function setup () {router.beforeEach(async (to, from, next) => {//获取tokenlet hasToken = store.getters['user/token']if (hasToken) {if (store.getters['routes/routes'].length) {// 禁止已登录用户返回登录页if (to.path === '/login') {next({ path: '/' })} else next()} else {//setRoutes:下面讲解,存储vuex中routes,合并路由列表await store.dispatch('routes/setRoutes', authentication)next({ ...to, replace: true })}} else {next(toLoginRoute(to.path))}})router.afterEach((to) => {//设置标题document.title = getPageTitle(to.meta.title)})
}
(2)var文件引用
export function setupVab (app: any) {// 加载插件const Plugins = require.context('./plugins', true, /\.ts$/)Plugins.keys().forEach((key) => Plugins(key).setup(app))
}
(3)将在main中添加调用,由于我封装到permissions.ts文件中,通过var文件调用
import { createApp } from 'vue'
import App from './App.vue'
import { setupVab } from '@/vab'const app = createApp(App)
setupVab(app)
(4) setRoutes方法:存储vuex中routes,合并路由列表
async setRoutes ({ commit }: { commit: any }, mode = 'none') {// 默认前端路由const routes = [...asyncRoutes]// 设置游客路由关闭路由拦截const control = mode === 'visit' ? false : rolesControl// 后端路由// if (authentication === 'all') {// const { data } = await getRouterList()// const { list } = data// if (!isArray(list))// gp.$baseMessage(// '路由格式返回有误!',// 'error',// false,// 'vab-hey-message-error'// )// if (list[list.length - 1].path !== '*') {// list.push({// path: '/:pathMatch(.*)*',// redirect: '/404',// name: 'NotFound',// hidden: true// })// routes = convertRouter(list)// }// 根据权限和rolesControl过滤路由const finallyRoutes = filterRoutes([...constantRoutes, ...routes], control)// // 设置菜单所需路由commit('setRoutes', finallyRoutes)// // 根据可访问路由重置Vue Routerawait resetRouter(finallyRoutes)},
(5)filterRoutes:根据权限和rolesControl过滤路由
export function filterRoutes (routes:any, rolesControl:any, baseUrl = '/') {return routes.filter((route:any) => {if (rolesControl && route.meta && route.meta.roles) {return hasAccess(route.meta.roles)return false} else { return true }})// .map((route) => {// if (route.path !== '*' && !isExternal(route.path))// route.fullPath = resolve(baseUrl, route.path)// if (route.children)// route.children = filterRoutes(// route.children,// rolesControl,// route.fullPath// )// return route// })
}
(6)toLoginRoute:
/*** 获取当前跳转登录页的Route* @param currentPath 当前页面地址*/
export function toLoginRoute (currentPath:any) {if (recordRoute && currentPath !== '/') {return {path: '/login',query: { redirect: currentPath },replace: true}} else {return { path: '/login', replace: true }}
}
4、创建router.js 文件,创建路由列表和添加路由的方法
设置默认路由和模拟请求后添加的路由,定义添加路由的方法
// 定义路由和路由添加的方法
import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router'
import configOb from '@/config'
import { getNames } from '@/utils/routes'//设置默认数组
export const constantRoutes = [{path: '/login',name: 'Login',component: () => import('@/views/login/index.vue'),hidden: true},{path: '/403',name: '403',component: () => import('../views/403.vue'),hidden: true},{path: '/404',name: '404',component: () => import('../views/404.vue'),hidden: true}
]//假设请求的到的数组
export const asyncRoutes = [{path: '/',name: 'Root',// component: Layout,redirect: '/index',meta: {title: '平台首页',icon: 'iconfont icon-ptsyy icon-white'},children: [{path: 'index',name: 'Index',component: () => import('../views/index/index.vue'),meta: {title: '首页',icon: 'home-2-line',noClosable: true}}]},{path: '/error',name: 'Error',// component: Layout,redirect: '/error/403',menuHidden: true,meta: {title: '错误页',icon: 'error-warning-line'},children: [{path: '403',name: 'Error403',component: () => import('../views/403.vue'),meta: {title: '403',icon: 'error-warning-line'}},{path: '404',name: 'Error404',component: () => import('../views/404.vue'),meta: {title: '404',icon: 'error-warning-line'}}]},{path: '/:pathMatch(.*)*',redirect: '/404',name: 'NotFound',hidden: true}
]//是否开启hash模式
const { isHashRouterMode, publicPath } = configOb
const router = createRouter({history: isHashRouterMode? createWebHashHistory(publicPath): createWebHistory(publicPath),routes: constantRoutes
})/*** 添加路由* @param routes*/
function addRouter (routes:any) {routes.forEach((route:any) => {if (!router.hasRoute(route.name)) router.addRoute(route)if (route.children) addRouter(route.children)})
}export default router
相关文章:

前端开发之vue动态路由实现方案
前端开发之vue动态路由实现方案 前言2. 实现1、登录页面创建登录函数和watch监听路由2、调用的login方法(1)登录方法(2)存储token 3、router.push的时候调用路由守卫(1)创建路由守卫,建议路由守…...

JAVA接口的基本测试------JAVA入门基础教程
public class Interface {public static void main(String[] args){System.out.println(Flyable.max_speed);System.out.println(Flyable.min_speed);//类与接口是实现关系Bullet b new Bullet();b.attack();b.fly();Flyable f new Bullet();f.fly();} }interface Flyable {p…...

SLAM论文速递:SLAM—— 面向动态环境的多用途SLAM框架—4.25(1)
论文信息 题目: Multi-purpose SLAM framework for Dynamic Environment 面向动态环境的多用途SLAM框架论文地址: 2020 IEEE/SICE International Symposium on System Integration (SII)https://ieeexplore.ieee.org/abstract/document/9026299发表期刊…...

Dubbo 简易环境搭建以及使用(2)
目录 环境搭建 Dubbo的3种使用方式: 1. XML配置的方式,一般用于Spring MVC工程 2. 配置文件的方式 (spring boot工程) 3. 注解方式 Dubbo 控制台 环境搭建 本篇将介绍Spring boot zookeeper Dubbo 简易环境的搭建以及使用…...

免费无需魔法会语音聊天的ChatGPT
今天发现了一个很好的ChatGPT,可以语音聊天,而且免费无需魔法 角色目前包括夏洛克、雷电影等等,对话的声调完全模拟了原角色! 目前只有英文和日语两种对话,我们可以文字输入或者语音输入,中文即可ÿ…...

springboot 参数统一处理
目录 一、普通参数:ParameterRequestWrapper 二、HttpHelper请求处理字符串工具类 三、实体json参数:RequestWrapper 四、过滤器:PostFilter 五、Controller 一、普通参数:ParameterRequestWrapper import javax.servlet.http.HttpServletRequest;…...

成就更强大的自己
每一次低谷,都会酝酿向上的力量。 每一次痛苦过后,都会洗涤掉心理深处的灰尘。 人生的路上,坎坷前行,只有保持积极向上的态度,才能把坎坷化为坦途。 走过一段路后,才发现,当内心强大、修养、爱…...

android 富文本编辑器有哪些
android 富文本编辑器有哪些 有许多优秀的开源富文本编辑器插件可用于Android平台,下面列举几个常用的: RichEditorView:这是一个基于Web技术的富文本编辑器插件,有多种编辑功能与选项。 Android Rich Text Editor:这…...

flex布局属性详解
Flex布局 flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content其他orderflexalign-self 含义:Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。 flex-direction flex-direction属性决定主轴的方向&…...

上传了ipa但iTunes Connect没有构建版本问题
上传了ipa但iTunes Connect没有构建版本问题 转载:上传了ipa但iTunes Connect没有构建版本问题 AU上传ipa出现下图红框提示说明成功上传,如果App Store后台没有出现构建版本,请登录 apple账号对应的邮箱查看反馈,特别留意垃圾邮…...

记录一次armbian系统搭建路由功能的失败过程
根据 使用 Debian 作为路由器 :: 星野玲的博客 https://blog.bling.moe/post/3/ 优化ubuntu dns解析,关掉systemd-resolved - MR__Wang - 博客园 https://www.cnblogs.com/xzlive/p/17139520.html ChatGPT 背景需求,新入手了一款RK3568系列的小主机,带有2*2.5G2*1…...

OpenGL与Metal API的Point Sprite
我们在实际用OpenGL等3D图形渲染API时 点图元 往往用得不多,而在粒子系统中可能也是用一个正方形来绘制一单个粒子。不过在当前大部分3D图形渲染API中都能支持用点图元来绘制一个具有纹理贴图的粒子,从早在OpenGL 1.4开始就能支持了,而在Open…...

从0搭建Vue3组件库(七):使用 gulp 打包组件库并实现按需加载
使用 gulp 打包组件库并实现按需加载 当我们使用 Vite 库模式打包的时候,vite 会将样式文件全部打包到同一个文件中,这样的话我们每次都要全量引入所有样式文件做不到按需引入的效果。所以打包的时候我们可以不让 vite 打包样式文件,样式文件将使用 gulp 进行打包。那么本篇文…...

Python入门教程+项目实战-11.4节: 元组与列表的区别
目录 11.4.1 元组与列表的区别 11.4.2 可变数据类型 11.4.3 元组与列表的区别 11.4.4 知识要点 11.4.5 系统学习python 11.4.1 不可变数据类型 不可变数据类型是指不可以对该数据类型进行修改,即只读的数据类型。迄今为止学过的不可变数据类型有字符串&#x…...

如何做好采购计划和库存管理?
“销售计划不专业且不稳定”“准确性低” “目前只按照过往销量和采购周期做安全库存,但欠货和滞销依然严重” 题主的问题其实蛮有代表性的, 也是传统采购和库存管理常常面临的问题: ① 前后方协作困难 采购/销售/财务工作相互独立&#x…...

客户管理系统的作用有哪些?
阅读本文您将了解:1.客户管理系统的作用;2.客户管理系统软件怎么用;3.客户管理的注意事项。 一、客户管理系统的作用 客户是企业的重要财富,因此客户管理是企业发展过程中至关重要的一部分,那么客户管理怎么做&#…...

Sqlmap手册—史上最全
Sqlmap手册—史上最全 一.介绍 开源的SQL注入漏洞检测的工具,能够检测动态页面中的get/post参数,cookie,http头,还能够查看数据,文件系统访问,甚至能够操作系统命令执行。 检测方式:布尔盲注、…...

《花雕学AI》13:早出对策,积极应对ChatGPT带来的一系列风险和挑战
ChatGPT是一款能和人类聊天的机器人,它可以学习和理解人类语言,也可以帮人们做一些工作,比如翻译、写文章、写代码等。ChatGPT很强大,让很多人感兴趣,也让很多人担心。 使用ChatGPT有一些风险,比如数据的质…...

windows开机启动软件、执行脚本,免登录账户
文章目录 前言一、打开任务计划程序1.我电脑上的是点搜索“任务计划程序”,可能每个电脑的搜索按钮不一样,自行查找2.打开后应该是长这样的 二、创建文件夹1.点击任务计划程序库、右键选择新建文件夹2.名字顺便,点击确定3.创建后如图、点击目…...

Rocky Linux 8 安装实时内核
【方法一:yum 安装】 在 /etc/yum.repos.d 目录下新建一个Rocky8-rt.repo安装rt内核和相关工具$ sudo yum install kernel-rt重启系统$ sudo reboot【方法二:rpm安装】 查看系统内核版本$ uname -a 4.18.0-425.3.1.el8_7.x86_64根据系统内核版本下载实…...

数据预处理(Data Preprocessing)
Data Preprocessing 前言Why preprocess?Major Tasks in Data PreprocessingData CleaningIncomplete (Missing) DataWhat to Consider When Handling Missing Data?MCARMARMNAR How to Handle Missing Data - ImputationMore on ImputationEven More on ImputationPreproces…...

MySQL数据库——MySQL WHERE:条件查询数据
在 MySQL 中,如果需要有条件的从数据表中查询数据,可以使用 WHERE 关键字来指定查询条件。 使用 WHERE 关键字的语法格式如下: WHERE 查询条件 查询条件可以是: 带比较运算符和逻辑运算符的查询条件带 BETWEEN AND 关键字的查询…...

【JavaEE初阶】多线程(三)volatile wait notify关键字 单例模式
摄影分享~~ 文章目录 volatile关键字volatile能保证内存可见性 wait和notifywaitnotifynotifyAllwait和sleep的区别小练习 多线程案例单例模式饿汉模式懒汉模式 volatile关键字 volatile能保证内存可见性 import java.util.Scanner;class MyCounter {public int flag 0; }p…...

git把一个分支上的某次修改同步到另一个分支上,并解决git cherry-pick 冲突
背景 我们在工作中经常会碰到好几个同事共同在一个分支上开发,一个项目同时会有好几个分支,我们在feature上开发的功能时,有可能某个需求需要提前发布,这个时候我们已经在feature A上开发完成,但是需要在master上发布…...

S32K3系列单片机开发笔记(SIUL是什么/配置引脚复用的功能·)
前言 今天花时间看了一下,SIUL2模块的相关内容,并参照文档,以及例程作了一些小记录,知道该如何使用这个外设,包括引脚的配置,中断配置,以及常用函数的使用等,但对其中的一些细节还需…...

Linux没网络的情况下快速安装依赖或软件(挂载本地yum仓库源(Repository))
一、上传iso系统镜像: 上传和系统同一版本、同一位数(32bit:i686或i386/64bit:x86_64)的系统,不能是Minimal版本,可以是DVD(较全)或everything(最全)。 注&am…...

为了安装pip install pyaudio花费不少时间,坑
记录一下吧: 环境: mac OS Monterey 12.6.5 pyaudio是没有mac下的whl, 通过pip安装是需要进行编译的,我原来系统的是/usr/local/bin/clang 15.0.0版本,然后调用的C_CLUDE_PATH就是/usr/local/include和下面的c/v1&am…...

第十一章 组合模式
文章目录 前言一、组合模式基本介绍二、UML类图三、完整代码抽象类,所有类都继承此类学校类以父类型引用组合一个学院类学院类以父类型引用组合一个专业类专业类,叶子节点,不能再组合其他类测试类 四、组合模式在JDK集合的源码分析五、组合模…...

LeetCode链表OJ题目 代码+思路分享
目录 删除有序数组中的重复项合并两个有序数组移除链表元素 删除有序数组中的重复项 链接: link 题目描述: 题目思路: 本题使用两个指针dst和src一前一后 相同情况: 如果nums[dst]nums[src],那么src 不相同情况: 此…...

第06讲:为何各大开源框架专宠 SPI 技术?
在此前的内容中,已经详细介绍了 SkyWalking Agent 用到的多种基础技术,例如,Byte Buddy、Java Agent 以及 OpenTracing 中的核心概念。本课时将深入介绍 SkyWalking Agent 以及 OAP 中都会使用到的 SPI 技术。 JDK SPI 机制 SPI(…...