Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to realize vue-admin-template dynamic routing

2025-02-27 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >

Share

Shulou(Shulou.com)06/02 Report--

This article introduces the relevant knowledge of "how to implement vue-admin-template dynamic routing". In the operation of actual cases, many people will encounter such a dilemma, so let the editor lead you to learn how to deal with these situations. I hope you can read it carefully and be able to achieve something!

Provide data interface for logging in and obtaining user information

In 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'})}

Login interface data

{'code': 200,' data': {'token':' Xmuradmin'}, 'message': "operation succeeded"}

Exit interface data

{'code': 200,' data': 'success',' message': "operation succeeded"}

Detailed interface data

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

Revamping router/index.js

Import Vue from 'vue'import Router from' vue-router'Vue.use (Router) / * Layout * / import Layout from'@ / layout'// basic routing export const constantRoutes = [{path:'/ login', component: () = > import ('@ / views/login/index'), hidden: true}, {path:'/ 404 routes, component: () = > import ('@ / views/404'), hidden: true} {path:'/', component: Layout, redirect:'/ dashboard', children: [{path: 'dashboard', name:' Dashboard', component: () = > import ('@ / views/dashboard/index'), meta: {title: 'home', icon: 'el-icon-menu'}}]} ] / * * dynamic routing * / export const asyncRoutes = [{path:'/ studentinformation', component: Layout, children: [{path: 'index', component: () = > import (' @ / views/studentinformation/index'), meta: {title: 'student information', icon: 'el-icon-s-check'}}]} {path:'/ lecturerinformation', component: Layout, children: [{path: 'index', component: () = > import (' @ / views/lecturerinformation/index'), meta: {title: 'instructor Information', icon: 'el-icon-s-custom', roles: [' editor']}]}, {path:'/ coursemanage', component: Layout Meta: {roles: ['admin']}, children: [{path:' index', component: () = > import ('@ / views/coursemanage/index'), meta: {title: 'course Management', icon: 'el-icon-s-platform'}}]}, / / 404 pages must be placed on the last page {path:' *' Redirect:'/ 404mm, hidden: true}] const createRouter = () = > newRouter ({/ / 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

Write dynamically displayed routes in asyncRoutes and add roles, such as meta: {roles: ['admin']}

Add permission.js under the store/modulds directory

Import {asyncRoutes, constantRoutes} from'@ / router'/** * Use meta.role to determine if the current user has permission * @ param roles * @ param route * / function hasPermission (roles, route) {if (route.meta & & route.meta.roles) {return roles.some (role = > route.meta.roles.includes (role))} else {return true}} / * * Filter asynchronous routing tables by recursion * @ param routes asyncRoutes * @ param roles * / 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}

Modify 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 ('validation failed) Please log in')} 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}

Add roles: [] Save permission list, add the following

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', []).})}}

Add roles to store/getters.js

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, / / add roles roles: state = > state.user.roles, / / dynamic routing permission_routes: state = > state.permission.routes,} export default getters

Add permission to 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'// add permissionimport permission from'. / modules/permission'Vue.use (Vuex) const store = new Vuex.Store ({modules: {app, settings, user, / / add permission permission}, getters}) export default store

Finally, modify the permission.js in the root directory

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 an 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 tore-login await store.dispatch ('user/resetToken') Message.error (error | |' Has Error') next (`/ login?redirect=$ {to.path}`) NProgress.done ()}} else {/ * has no token*/ 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 ()})

Bind data to the nav navigation bar

In layout/components/sidebar/index.vue

... mapGetters ([/ / add permission_routes' permission_routes', 'sidebar'] for dynamic routing)

The full code is as follows:

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 ([/ / dynamic routing adds 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},} "how to implement vue-admin-template dynamic routing" ends here. Thank you for your reading. If you want to know more about the industry, you can follow the website, the editor will output more high-quality practical articles for you!

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Development

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report