返回顶部
首页 > 资讯 > 精选 >vue-admin-template动态路由怎么实现
  • 125
分享到

vue-admin-template动态路由怎么实现

2023-06-25 21:06:58 125人浏览 薄情痞子
摘要

本篇内容介绍了“Vue-admin-template动态路由怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!提供登录与获取用户信息数据

本篇内容介绍了“Vue-admin-template动态路由怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

提供登录与获取用户信息数据接口

api/user.js

import request from '@/utils/request'const Api = {  TakeOut: '/student/students/takeOut/',  LoginIn: '/student/students/loginIn/',  StudentInfo:'/student/students/studentInfo/',}export function login(parameter) {  return request({    url: Api.LoginIn,    method: 'get',    params: parameter  })}export function getInfo(token) {  return request({    url: Api.StudentInfo,    method: 'get',    params: {'token':token}  })}export function loGout() {  return request({    url: Api.TakeOut,    method: 'get'  })}

登录接口数据

{'code': 200, 'data': {'token': 'X-admin'}, 'message': "操作成功"}

退出接口数据

{'code': 200, 'data': 'success', 'message': "操作成功"}

详情接口数据

{    "code": 200,    "data": {        "avatar": "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif",        "name": "黄晓果",        "roles": [            "editor"        ]    }}

改造router/index.js

import Vue from 'vue'import Router from 'vue-router'Vue.use(Router)import Layout from '@/layout'// 基础路由export const constantRoutes = [  {    path: '/login',    component: () => import('@/views/login/index'),    hidden: true  },  {    path: '/404',    component: () => import('@/views/404'),    hidden: true  },  {    path: '/',    component: Layout,    redirect: '/dashboard',    children: [{      path: 'dashboard',      name: 'Dashboard',      component: () => import('@/views/dashboard/index'),      meta: { title: '首页', icon: 'el-icon-menu' }    }]  },]export const asyncRoutes = [  {    path: '/studentinfORMation',    component: Layout,    children: [      {        path: 'index',        component: () => import('@/views/studentinformation/index'),        meta: { title: '学生信息', icon: 'el-icon-s-check' }      }    ]  },  {    path: '/lecturerinformation',    component: Layout,    children: [      {        path: 'index',        component: () => import('@/views/lecturerinformation/index'),        meta: { title: '讲师信息', icon: 'el-icon-s-custom', roles: ['editor'] }      }    ]  },  {    path: '/coursemanage',    component: Layout,    meta: { roles: ['admin'] },    children: [      {        path: 'index',        component: () => import('@/views/coursemanage/index'),        meta: { title: '课程管理', icon: 'el-icon-s-platform'}      }    ]  },  // 404 页面必须放置在最后一个页面  { path: '*', redirect: '/404', hidden: true }]const createRouter = () => new Router({  // mode: 'history', // require service support  scrollBehavior: () => ({ y: 0 }),  routes: constantRoutes})const router = createRouter()// Detail see: Https://GitHub.com/vuejs/vue-router/issues/1234#issuecomment-357941465export function resetRouter() {  const newRouter = createRouter()  router.matcher = newRouter.matcher // reset router}export default router

将动态显示的路由写在asyncRoutes 中并添加 roles ,例如meta: { roles: [‘admin'] },

在store/modulds目录下添加permission.js

vue-admin-template动态路由怎么实现

import { asyncRoutes, constantRoutes } from '@/router'function hasPermission(roles, route) {  if (route.meta && route.meta.roles) {    return roles.some(role => route.meta.roles.includes(role))  } else {    return true  }}export function filterAsyncRoutes(routes, roles) {  const res = []  routes.forEach(route => {    const tmp = { ...route }    if (hasPermission(roles, tmp)) {      if (tmp.children) {        tmp.children = filterAsyncRoutes(tmp.children, roles)      }      res.push(tmp)    }  })  return res}const state = {  routes: [],  addRoutes: []}const mutations = {  SET_ROUTES: (state, routes) => {    state.addRoutes = routes    state.routes = constantRoutes.concat(routes)  }}const actions = {  generateRoutes({ commit }, roles) {    return new Promise(resolve => {      const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)      commit('SET_ROUTES', accessedRoutes)      resolve(accessedRoutes)    })  }}export default {  namespaced: true,  state,  mutations,  actions}

修改store/modulds/user.js

import { login, logout, getInfo } from '@/api/user'import { getToken, setToken, removeToken } from '@/utils/auth'import { resetRouter } from '@/router'const getDefaultState = () => {  return {    token: getToken(),    name: '',    avatar: '',    roles: []  }}const state = getDefaultState()const mutations = {  RESET_STATE: (state) => {    Object.assign(state, getDefaultState())  },  SET_TOKEN: (state, token) => {    state.token = token  },  SET_NAME: (state, name) => {    state.name = name  },  SET_AVATAR: (state, avatar) => {    state.avatar = avatar  },  SET_ROLES: (state, roles) => {    state.roles = roles  }}const actions = {  // user login  login({ commit }, userInfo) {    const { username, passWord } = userInfo    return new Promise((resolve, reject) => {      login({ username: username.trim(), password: password }).then(response => {        const { data } = response        commit('SET_TOKEN', data.token)        setToken(data.token)        resolve()      }).catch(error => {        reject(error)      })    })  },  // get user info  getInfo({ commit, state }) {    return new Promise((resolve, reject) => {      getInfo(state.token).then(response => {        const { data } = response        if (!data) {          return reject('验证失败,请重新登录')        }        const {roles, name, avatar } = data        commit('SET_ROLES', roles)        commit('SET_NAME', name)        commit('SET_AVATAR', avatar)        resolve(data)      }).catch(error => {        reject(error)      })    })  },  // user logout  logout({ commit, state }) {    return new Promise((resolve, reject) => {      logout(state.token).then(() => {        removeToken() // must remove  token  first        resetRouter()        commit('RESET_STATE')        commit('SET_ROLES', [])        resolve()      }).catch(error => {        reject(error)      })    })  },  // remove token  resetToken({ commit }) {    return new Promise(resolve => {      removeToken() // must remove  token  first      commit('RESET_STATE')      commit('SET_ROLES', [])      resolve()    })  }}export default {  namespaced: true,  state,  mutations,  actions}

添加roles: [] 保存权限列表 ,添加内容如下

const getDefaultState = () => {  return {    ...    roles: []  }}const mutations = {  ...  SET_ROLES: (state, roles) => {    state.roles = roles  }}  // get user info  getInfo({ commit, state }) {    return new Promise((resolve, reject) => {      getInfo(state.token).then(response => {        ...        const {roles, name, avatar } = data        commit('SET_ROLES', roles)        ...      }).catch(error => {        reject(error)      })    })  },  // user logout  logout({ commit, state }) {    return new Promise((resolve, reject) => {      logout(state.token).then(() => {        ...        commit('SET_ROLES', [])        ...      }).catch(error => {        reject(error)      })    })  },  // remove token  resetToken({ commit }) {    return new Promise(resolve => {      ...      commit('SET_ROLES', [])      ...    })  }}

在store/getters.js中添加roles

const getters = {  sidebar: state => state.app.sidebar,  device: state => state.app.device,  token: state => state.user.token,  avatar: state => state.user.avatar,  name: state => state.user.name,    //添加roles  roles: state => state.user.roles,  //动态路由  permission_routes: state => state.permission.routes,}export default getters

将permission添加到store/index.js中

import Vue from 'vue'import Vuex from 'vuex'import getters from './getters'import app from './modules/app'import settings from './modules/settings'import user from './modules/user'//添加permissionimport permission from './modules/permission'Vue.use(Vuex)const store = new Vuex.Store({  modules: {    app,    settings,    user,     //添加permission    permission  },  getters})export default store

最后修改根目录下的permission.js

import router, { constantRoutes } from './router'import store from './store'import { Message } from 'element-ui'import NProgress from 'nprogress' // progress barimport 'nprogress/nprogress.CSS' // progress bar styleimport { getToken } from '@/utils/auth' // get token from cookieimport getPageTitle from '@/utils/get-page-title'NProgress.configure({ showSpinner: false }) // NProgress Configurationconst whiteList = ['/login'] // no redirect whitelistrouter.beforeEach(async (to, from, next) => {  // start progress bar  NProgress.start()  // set page title  document.title = getPageTitle(to.meta.title)  // determine whether the user has logged in  const hasToken = getToken()  if (hasToken) {    if (to.path === '/login') {      // if is logged in, redirect to the home page      next({ path: '/' })      NProgress.done()    } else {      const hasRoles = store.getters.roles && store.getters.roles.length > 0      if (hasRoles) {        next()      } else {        try {          // get user info          // note: roles must be a object array! such as: ['admin'] or ,['developer','editor']          const { roles } = await store.dispatch('user/getInfo')          console.log(roles)          // generate accessible routes map based on roles          const accessRoutes = await store.dispatch('permission/generateRoutes', roles)          // dynamically add accessible routes          router.options.routes = constantRoutes.concat(accessRoutes)          router.addRoutes(accessRoutes)                    // hack method to ensure that addRoutes is complete          // set the replace: true, so the navigation will not leave a history record          next({ ...to, replace: true })        } catch (error) {          // remove token and go to login page to re-login          await store.dispatch('user/resetToken')          Message.error(error || 'Has Error')          next(`/login?redirect=${to.path}`)          NProgress.done()        }      }    }  } else {        if (whiteList.indexOf(to.path) !== -1) {      // in the free login whitelist, go directly      next()    } else {      // other pages that do not have permission to access are redirected to the login page.      next(`/login?redirect=${to.path}`)      NProgress.done()    }  }})router.afterEach(() => {  // finish progress bar  NProgress.done()})

将数据绑定到nav导航栏上

在layout/components/sidebar/index.vue中

...mapGetters([      // 动态路由 增加permission_routes      'permission_routes',      'sidebar'    ]), <!-- 动态路由 --> <sidebar-item v-for="route in permission_routes" :key="route.path" :item="route" :base-path="route.path" />

全部代码如下:

<template>  <div :class="{ 'has-logo': showLogo }">    <logo v-if="showLogo" :collapse="isCollapse" />    <el-scrollbar wrap-class="scrollbar-wrapper">      <el-menu        :default-active="activeMenu"        :collapse="isCollapse"        :background-color="variables.menuBg"        :text-color="variables.menuText"        :unique-opened="false"        :active-text-color="variables.menuActiveText"        :collapse-transition="false"        mode="vertical"      >        <!-- <sidebar-item          v-for="route in routes"          :key="route.path"          :item="route"          :base-path="route.path"        /> -->        <sidebar-item          v-for="route in permission_routes"          :key="route.path"          :item="route"          :base-path="route.path"        />      </el-menu>    </el-scrollbar>  </div></template><script>import { mapGetters } from 'vuex'import Logo from './Logo'import SidebarItem from './SidebarItem'import variables from '@/styles/variables.scss'export default {  components: { SidebarItem, Logo },  computed: {    ...mapGetters([      // 动态路由 增加permission_routes      'permission_routes',      'sidebar',    ]),    routes() {      return this.$router.options.routes    },    activeMenu() {      const route = this.$route      const { meta, path } = route      // if set path, the sidebar will highlight the path you set      if (meta.activeMenu) {        return meta.activeMenu      }      return path    },    showLogo() {      return this.$store.state.settings.sidebarLogo    },    variables() {      return variables    },    isCollapse() {      return !this.sidebar.opened    },  },}</script>

“vue-admin-template动态路由怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: vue-admin-template动态路由怎么实现

本文链接: https://lsjlt.com/news/306359.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue-admin-template动态路由怎么实现
    本篇内容介绍了“vue-admin-template动态路由怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!提供登录与获取用户信息数据...
    99+
    2023-06-25
  • vue-admin-template 动态路由的实现示例
    提供登录与获取用户信息数据接口 在api/user.js中 import request from '@/utils/request' const Api = { Take...
    99+
    2024-04-02
  • 怎么用vue实现动态路由
    这篇文章主要介绍了怎么用vue实现动态路由的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用vue实现动态路由文章都会有所收获,下面我们一起来看看吧。1、什么是动态路由?动态路由,动态即不是写死的,是可变的。...
    99+
    2023-07-02
  • VUE中怎么实现路由动态加载
    VUE中怎么实现路由动态加载,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先新建vue工程,一般我们不会特殊处理路由,但当项目页面越来越多,...
    99+
    2024-04-02
  • vue实现动态路由详细
    目录一、前端控制1、在router.js文件(把静态路由和动态路由分别写在router.js) 2、store/permission.js(在vuex维护一个state,通过配角色来...
    99+
    2024-04-02
  • vue怎么一步到位实现动态路由
    今天小编给大家分享一下vue怎么一步到位实现动态路由的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先呢,先看看静态路由的配...
    99+
    2023-06-30
  • Vue 动态路由的实现详情
    前言: 动态路由是一个常用的功能,根据后台返回的路由json表,前端动态显示可跳转的路由项,下面来讲解一下具体的实现方式: 大致业务需求:前端在login登陆页,输入账号密码后,点击...
    99+
    2024-04-02
  • Vue router动态路由如何实现
    本文小编为大家详细介绍“Vue router动态路由如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue router动态路由如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实...
    99+
    2023-07-05
  • Vue如何实现动态路由导航
    这篇文章主要介绍“Vue如何实现动态路由导航”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue如何实现动态路由导航”文章能帮助大家解决问题。1、导航守卫“导航” 表示路由正在发生改变正如其名,vu...
    99+
    2023-07-05
  • VUE路由动态加载如何实现
    这篇文章主要讲解了“VUE路由动态加载如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VUE路由动态加载如何实现”吧!首先新建vue工程,一般我们不会特殊处理路由,但当项目页面越来越多...
    99+
    2023-07-04
  • vue一步到位的实现动态路由
    目录静态路由的回顾动态路由的配置说一些笔者遇到的问题后记最近在写vue项目,需要由后台传来当前用户对应权限的路由表,前端通过调接口拿到后处理(后端处理路由),就是配置vue动态路由啦...
    99+
    2024-04-02
  • Vue实现动态路由导航的示例
    目录1、导航守卫二、功能展示 三、原理四、功能实现⛵小结1、导航守卫 “导航” 表示路由正在发生改变 正如其名,vue-router 提供的导航守卫...
    99+
    2023-02-24
    Vue 动态路由导航 Vue 路由导航
  • 手把手教你vue实现动态路由
    目录1、什么是动态路由?2、动态路由的好处3、动态路由如何实现总结1、什么是动态路由? 动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现...
    99+
    2024-04-02
  • 如何解决iView-admin动态路由问题
    这篇文章将为大家详细讲解有关如何解决iView-admin动态路由问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 IView-admin 在使用的时候跳转客...
    99+
    2024-04-02
  • vue-admin-template模板添加tagsview的实现
    目录一、从vue-element-admin复制文件二、修改 vue-admin-template\src\layout\components\AppMain.vue三、修改vue-...
    99+
    2024-04-02
  • Vue中怎么实现自动化路由
    Vue中怎么实现自动化路由,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为什么要自动化路由路由自动化在于解决以下的问题:每次新...
    99+
    2024-04-02
  • vue动态路由的实现方法有哪些
    本篇内容介绍了“vue动态路由的实现方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue动态路由的两种实现方法:1、简单的角色路由...
    99+
    2023-07-04
  • vue动态路由有哪两种实现方法
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。动态路由不同于常见的静态路由,可以根据不同的「因素」而改变站点路由列表。动态路由设置一般有两种:(1)、简单的角色路由设置:比如只涉及到管理员和普通用户的权限。通常直接在...
    99+
    2023-05-14
    动态路由 Vue
  • VUE 路由实现动态路由,轻松应对复杂应用场景
    VUE 路由是一个非常强大的路由库,它提供了丰富的功能,可以帮助我们轻松地构建单页应用。其中,动态路由是 VUE 路由的一大特色,它允许我们根据需要动态地生成路由,从而可以轻松地应对复杂应用场景。 动态路由的实现 动态路由的实现非常简单...
    99+
    2024-02-05
    VUE 路由 动态路由 路由管理 单页应用
  • Vue中的动态路由匹配路由问题
    目录vue-router 动态路由匹配总结vue-router 动态路由匹配 我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。 例如,我们有一个 User 组件,对于所有...
    99+
    2022-12-09
    Vue动态路由 Vue匹配路由 Vue路由
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作