vue 动态路由实现 后端控制权限时的前端处理

7 篇文章 2 订阅

前端思路: 

上图中 获取路由信息 ,可以是后端控制的,可以是前端根据用户信息从路由表中筛选的。

此处讲解后端存储路由信息的情况

组织路由信息

请求后台,获取返回结果,结果有两种可能,一种是组合好的树状结构,一种是路由平铺

树状结构:

不需要重组路由结构,但是需要替换组件信息

import components from '@/router/components'

/* 遍历后台传来的路由字符串,转换为组件对象
 * @params asyncRouterMap MyRoute[] 异步路由数组
 * @params type boolean 是否需要重写子路由路径
*/
function filterAsyncRouter(asyncRouterMap: MyRoute[], type = false) {
  return asyncRouterMap.filter(route => {

    if (type && route.children) {
      route.children = rewriteChildrenPath(route.children, route)
    }
    if (route.component) {
      // 如果路径组件在路由表中查询不到,默认渲染NotFound组件,其他情况可自定义处理
      if (!Object.keys(components).includes(route.component as string)) {
        route.component = components.NotFound
      } else {
        route.component = components[route.component as keyof typeof components]
      }
    }
    if (route.children != null && route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children, type)
    } else {
      delete route[`children`]
      delete route[`redirect`]
    }
    return true
  })
}

/* 重写路由中子路由路径
 * @params childernMap MyRoute[] 子路由数组信息
 * @params lastRouter MyRoute 父路由信息
*/
function rewriteChildrenPath(childrenMap: MyRoute[], lastRouter: MyRoute) {
  let children: MyRoute[] = []
  childrenMap.forEach((el) => {
    el.path = `${lastRouter.path }/${ el.path}`
    children = children.concat(el)
  })
  return children
}

 路由平铺

此时除了替换组件信息,还需要构建树状路由结构

let routes = res.map(organizeRoute) //organizeMenu 工具函数 重组路由结构
routes = recursiveData(routes, ``)

import Components from '@/routers/component'

// 菜单组织为route形式
const organizeRoute= (route) => {
  // 防止顶级路由未加斜杠报错
  const path = route.path.indexOf(`/`) !== 0 ? `/${route.path}` : route.path
  const _route= {
    //...符合route的属性和其他自定义属性
    component: route.component && Components[route.component] || Components.NotFound,
    meta: {
      title: route.title,
      hidden: route.hidden,
      icon: route.icon,
      //...其他自定义属性
    },
    query: {},
    params: {},
  }
  // 重定向
  route.redirect && Object.assign(_route, { redirect: { name: route.redirect } })
  return _route
}


//重组树状路由结构
const organizeRouteTree= (routes, pid = `0`) => {
  const _routes= routes.filter(item => item.pid === pid) //找出所有父级路由

  if (!_routes|| _routes.length === 0) return []

  _routes.sort((prev, next) => {
    return prev.sort - next.sort
  })
  _routes.map(item => {
    const children = organizeRouteTree(routes, item.id)
    children && children.length > 0 && (item.children = children)
  })
  return _routes
}

动态加到路由表

路由守卫中动态添加

//获取用户信息
userStore.getUserInfo()
  .then(() => {
    //isRelogin.show = false
    perssionStore.getRoutes()
      .then(accessRoutes => { //accessRoutes上一步中处理好的树状路由信息
        accessRoutes.forEach(route => {
          if (!isHttp(route.path)) {
            router.addRoute(route as RouteRecordRaw) // 动态添加可访问路由表
          }
        })
        next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
      })
  })
  .catch(err => {
    userStore.logOut()
      .then(() => {
        notification.error({
          message: err.code,
          description: err.message || err.msg,
        })
        next({ path: `/` })
      })
  })


/**
 * 判断url是否是http或https
 * @param {string} path
 * @returns {Boolean}
 */
export function isHttp(url:string) {
  return url.indexOf(`http://`) !== -1 || url.indexOf(`https://`) !== -1
}

非路由守卫中添加 

const createRouter = (routes = []) => {
  const _routes = [...baseRoutes, ...routes]
  return new Router({
    mode: `hash`,
    routes: _routes,
    scrollBehavior: () => ({ y: 0 }),
  })
}

const router = createRouter()

export function resetRouter (routes = []) {
  const newRouter = createRouter(routes)
  router.matcher = newRouter.matcher // the relevant part
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Vue菜单权限路由权限可以通过Java接口提供数据来实现。在Vue中,我们可以定义一个菜单权限数据,该数据包含了用户在系统中具有的菜单权限。可以使用Java接口来提供这些菜单权限数据,然后在Vue中进行调用和展示。 在Java中,我们可以定义一个接口,例如MenuService,该接口提供获取菜单权限数据的方法。在该接口中,可以定义获取所有菜单权限的方法、根据用户ID获取相应的菜单权限等方法。具体的实现可以根据业务需求来进行编写,可以从数据库或其他数据源中获取相应的菜单权限数据。 在Vue中,可以通过调用Java接口的方法来获取菜单权限数据。可以在Vue的页面组件中调用这些接口方法,然后将获取到的菜单权限数据进行展示。可以根据用户的菜单权限动态地渲染菜单和路由,并且可以根据用户的权限进行相应的权限校验和控制。 通过Java接口提供数据可以实现菜单权限路由权限的管理和控制。可以根据具体的需求来灵活地定义和设计接口,满足系统的功能和安全性要求。同,使用Vue可以实现前端动态展示和控制,使得系统更加灵活和易用。 ### 回答2: vue菜单权限路由权限一般是由后端的java接口提供数据。在前端vue项目中,我们可以通过调用java接口获取菜单数据和权限数据,并根据返回的数据来动态生成菜单和控制路由权限。 首先,我们需要在vue项目中配置路由,包括定义路由路径和组件的映射关系。然后,在java接口中,我们可以编写相应的接口来返回菜单数据和权限数据。一般来说,菜单数据和权限数据可能都需要根据用户的角色、权限等信息来进行动态的获取和过滤。 在vue项目中,我们可以使用axios等库来发送请求获取java接口的数据。一般来说,我们可以在vue的created或mounted等生命周期钩子函数中发送请求,并在请求成功后,将返回的数据保存到vue的data或vuex的状态管理中。 接着,我们可以在vue项目的菜单组件中根据接口返回的菜单数据来动态生成菜单结构。根据用户的权限,可能需要对菜单数据进行删减或隐藏某些菜单项。 对于路由权限,我们可以在路由配置中根据接口返回的权限数据来动态设置路由的访问权限。这样,当用户访问某个需要权限才能访问的路由,我们可以根据用户的权限判断是否允许访问。 总体而言,通过java接口提供数据可以实现vue项目的菜单权限路由权限动态管理。通过动态生成菜单和控制路由的访问权限,我们可以根据用户的角色和权限来灵活控制菜单展示和页面访问。这种基于后端java接口提供数据的方式,可以提高项目的安全性和可维护性。 ### 回答3: Vue菜单权限路由权限是一种常用的前端权限管理方式,通常与Java接口配合使用。 菜单权限指的是根据用户角色或权限级别,动态展示和控制菜单项的可见性和可操作性。通过Java接口传递用户角色或权限信息到前端前端根据这些信息动态生成菜单项,并根据用户的权限显示或隐藏相应的菜单项。例如,管理员拥有全部菜单权限,在菜单中会展示所有功能选项,而普通用户可能只能看到部分功能。 路由权限则是根据不同用户角色或权限级别,决定用户是否能够访问特定的路由页面。通过Java接口传递用户角色信息或权限信息到前端前端根据这些信息进行路由拦截或权限校验,只有具备相应权限的用户才能够访问相应的页面。例如,某些页面只有管理员或高级用户才能够访问。 Java接口在这里起到了向前端提供权限数据的作用。通常,前端会通过发起HTTP请求访问Java接口,将用户的角色或权限信息传递到接口端。接口端进行相应的权限验证或菜单数据处理,然后返回给前端对应的数据。前端接收到数据后,根据这些数据进行菜单项和路由的生成、权限验证等操作。 总之,通过Vue菜单权限路由权限的方式,配合Java接口提供数据,可以实现灵活的权限管理功能,根据用户的角色或权限级别来动态控制菜单和路由的展示和访问。这种权限管理方式可以有效提高应用的安全性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值