前端开发之vue动态路由实现方案

news/2025/2/13 5:23:44/

前端开发之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

http://www.ppmy.cn/news/53177.html

相关文章

docker以外挂目录的方式部署springboot项目

前置准备: 清单: 安装有docker的Linuxspringboot打包的jar文件(该项目只有一个返回"hello world"接口) Linux的IP地址:192.168.221.129 springboot项目的接口: 1、上传jar文件至Linux 我上传…

Java有很多初学者常见的问题

作为一门流行的编程语言,Java有很多初学者常见的问题。以下是两个例子: 1.理解Java的数据类型 Java有不同的数据类型,包括整型、浮点型、布尔型等等。初学者可能会困惑如何选择合适的数据类型来存储他们的数据。例如,他们可能会…

thinkphp 的 whereIN() 、where IN 如何使用?

在 ThinkPHP 中,可以通过 whereIN 方法来构建 WHERE IN 子句。以下是 whereIN 方法的语法: $result Db::table(table_name)->whereIn(column, $array)->select();table_name:表示表名;column:表示要查询的列名…

最值得学的编程语言是哪个?

如果让我推荐的话,我肯定首选是python啦! 编程语言是一个计算机的概念,在我们有了计算机以后,想让它帮助我们做事情,就要通过计算机语言和它进行对话、交互,计算机语言能够被计算机所执行,完成…

Java NIO原理机制详解

Java NIO原理机制 什么是NIO Java NIO(New IO)是Java 1.4版本引入的一个新的IO API,与传统的Java IO有着同样的作用和目的,但是使用方式完全不同。NIO支持面向缓冲区的、基于通道的IO操作,可以提供比传统IO更高效、更…

Git(六):基本命令(2):复位、修改、分支合并与日志

目录 9、reset 复位 9.1 描述 9.2 基本用法 9.2.1 回滚添加操作 9.2.2 回滚最近一次提交 9.2.3 回滚最近几次提交 9.2.4 回滚 pull 9.2.5 回滚 merge 9.2.6 区别 9.2.7 中断的工作流程处理 9.2.8 重置单独的文件 9.2.9 保留工作区并丢弃之前的提交 10、rm 删除 1…

本地 WAF 已死,云 WAF 永生

多年来,Web 应用程序防火墙 (WAF) 一直是应用程序保护的代名词。事实上,许多应用程序安全团队认为保护其应用程序的最佳选择是一流的本地 WAF 解决方案,尤其是当这些应用程序部署在本地或私有云中时。 但自从引入本地 WAF 以来,…

【大数据之Hadoop】二十二、Yarn调度器和调度算法

Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。 Apache Hadoop默认的资源调度器:容量调度器Capacity Scheduler。 CDH框架默认调度器是Fair Scheduler。 1 FIFO 单…