vue-admin-template 动态路由的实现(方式一)

{

path: ‘/404’,

component: () => import(‘@/views/404’),

hidden: true

},

{

path: ‘/’,

component: Layout,

redirect: ‘/home’,

children: [{

path: ‘home’,

name: ‘Home’,

component: () => import(‘@/views/home/index’),

meta: { title: ‘AI业务培训管理系统’, icon: ‘’ }

}]

},

{

path: ‘/addrole’,

hidden: true,

component: Layout,

children: [

{

path: ‘index/:id’,

name: ‘Addrole’,

component: () => import(‘@/views/usermanage/addrole/index’),

meta: { title: ‘添加角色’, icon: ‘’ }

}

]

},

{

path: ‘/addaccount’,

hidden: true,

component: Layout,

children: [

{

path: ‘index/:id’,

name: ‘AddAccount’,

component: () => import(‘@/views/usermanage/addaccount/index’),

meta: { title: ‘添加账户’, icon: ‘’ }

}

]

},

{

path: ‘/addbanner’,

hidden: true,

component: Layout,

children: [

{

path: ‘index/:id’,

name: ‘AddBanner’,

component: () => import(‘@/views/appmanage/addbanner/index’),

meta: { title: ‘添加Banner’, icon: ‘’ }

}

]

},

{

path: ‘/createactivationcode’,

hidden: true,

component: Layout,

children: [

{

path: ‘index’,

name: ‘CreateActivationCode’,

component: () => import(‘@/views/vipmanage/createactivationcode/index’),

meta: { title: ‘生成激活码’, icon: ‘’ }

}

]

},

]

/**

  • 放置服务器可配置的动态路由

*/

export const asyncRoutes = [

{

path: ‘/usermanagement’,

component: Layout,

redirect: ‘/usermanagement/rolemanagement’,

meta: { title: ‘用户管理’, icon: ‘user’ },

children: [

{

path: ‘rolemanagement’,

component: () => import(‘@/views/usermanage/rolemanagement/index’),

meta: { title: ‘角色管理’, icon: ‘’ }

},

{

path: ‘accountlist’,

component: () => import(‘@/views/usermanage/accountlist/index’),

meta: { title: ‘账号列表’, icon: ‘’ }

}

]

},

{

path: ‘/voicemanage’,

component: Layout,

redirect: ‘/voicemanage/albumscategories’,

meta: { title: ‘语音管理’, icon: ‘voice’ },

children: [

{

path: ‘albumscategories’,

component: () => import(‘@/views/voicemanage/albumscategories/index’),

meta: { title: ‘专辑分类’, icon: ‘’ }

},

{

path: ‘listenmanage’,

component: () => import(‘@/views/voicemanage/listenmanage/index’),

meta: { title: ‘收听管理’, icon: ‘’ }

}

]

},

{

path: ‘/appmanagement’,

component: Layout,

redirect: ‘/appmanagement/banner’,

meta: { title: ‘App管理’, icon: ‘app’ },

children: [

{

path: ‘banner’,

component: () => import(‘@/views/appmanage/banner/index’),

meta: { title: ‘Banner管理’, icon: ‘’ }

},

{

path: ‘appversions’,

component: () => import(‘@/views/appmanage/appversions/index’),

meta: { title: ‘App版本管理’, icon: ‘’ }

}

]

},

{

path: ‘/vipmanagement’,

component: Layout,

redirect: ‘/vipmanagement/setmeal’,

meta: { title: ‘VIP管理’, icon: ‘vip’ },

children: [

{

path: ‘setmeal’,

component: () => import(‘@/views/vipmanage/setmeal/index’),

meta: { title: ‘套餐管理’, icon: ‘’ }

},

{

path: ‘activationcode’,

component: () => import(‘@/views/vipmanage/activationcode/index’),

meta: { title: ‘激活码管理’, icon: ‘’ }

},

{

path: ‘activationcodelist’,

component: () => import(‘@/views/vipmanage/activationcodelist/index’),

meta: { title: ‘激活码生成列表’, icon: ‘’ }

},

{

path: ‘activationcodeexport’,

component: () => import(‘@/views/vipmanage/activationcodeexport/index’),

meta: { title: ‘激活码导出列表’, icon: ‘’ }

},

{

path: ‘orderlist’,

component: () => import(‘@/views/vipmanage/orderlist/index’),

meta: { title: ‘订单列表’, icon: ‘’ }

},

{

path: ‘vipequity’,

component: () => import(‘@/views/vipmanage/vipequity/index’),

meta: { title: ‘VIP权益说明’, icon: ‘’ }

}

]

},

{

path: ‘/brandownermanage’,

component: Layout,

redirect: ‘/brandownermanage/brandownerlist’,

alwaysShow: true,

meta: { title: ‘品牌商管理’, icon: ‘brand’ },

children: [

{

path: ‘brandownerlist’,

component: () => import(‘@/views/brandownermanage/brandownerlist/index’),

meta: { title: ‘品牌商列表’, icon: ‘’ }

}

]

},

{

path: ‘/machinemanage’,

component: Layout,

redirect: ‘/machinemanage/machinelist’,

alwaysShow: true,

meta: { title: ‘机器管理’, icon: ‘android’ },

children: [

{

path: ‘machinelist’,

component: () => import(‘@/views/machinemanage/machinelist/index’),

meta: { title: ‘机器列表’, icon: ‘’ }

}

]

},

{

path: ‘/softwaremanage’,

component: Layout,

redirect: ‘/softwaremanage/versions’,

meta: { title: ‘软件管理’, icon: ‘software’ },

children: [

{

path: ‘versions’,

component: () => import(‘@/views/softwaremanage/versions/index’),

meta: { title: ‘版本管理’, icon: ‘’ }

},

{

path: ‘usedirection’,

component: () => import(‘@/views/softwaremanage/usedirection/index’),

meta: { title: ‘使用说明’, icon: ‘’ }

}

]

},

{

path: ‘/officialaccounts’,

component: Layout,

redirect: ‘/officialaccounts/accesssettings’,

meta: { title: ‘公众号设置’, icon: ‘weichat’ },

children: [

{

path: ‘accesssettings’,

component: () => import(‘@/views/officialaccounts/accesssettings/index’),

meta: { title: ‘接入设置’, icon: ‘’ }

},

{

path: ‘menu’,

component: () => import(‘@/views/officialaccounts/menu/index’),

meta: { title: ‘菜单设置’, icon: ‘’ }

},

{

path: ‘attentionreply’,

component: () => import(‘@/views/officialaccounts/attentionreply/index’),

meta: { title: ‘关注回复’, icon: ‘’ }

},

{

path: ‘keywordreply’,

component: () => import(‘@/views/officialaccounts/keywordreply/index’),

meta: { title: ‘关键字回复’, icon: ‘’ }

},

{

path: ‘material’,

component: () => import(‘@/views/officialaccounts/material/index’),

meta: { title: ‘素材管理’, icon: ‘’ }

}

]

},

]

const createRouter = () => new Router({

// mode: ‘history’, // require service support

scrollBehavior: () => ({ y: 0 }),

routes: constantRoutes.concat(asyncRoutes).concat(errorRoutes)

})

export const router = createRouter()

// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465

export function resetRouter() {

const newRouter = createRouter()

router.matcher = newRouter.matcher // reset router

}

export default router

  • 获取动态路由数据api/user.js

import request from ‘@/utils/request’

import qs from ‘qs’

/**

*动态路由

*/

export function getAuthMenu() {

return request({

url: ‘/Admin/Index’,

method: ‘get’

})

}

  • 修改权限规则(store/module/permission.js)

vue-admin-template模板本身是没有做权限的,自己创建一个即可,规则自己设定,admin中使用的roles配置的,我这里是自动生成的,本质还是生成新的路由list(只是包含新的路由)

注意:store/module/permission.js和项目根目录下的permission别搞混了

import { asyncRoutes, constantRoutes, errorRoutes } from ‘@/router’

import { getAuthMenu } from ‘@/api/user’

import Layout from ‘@/layout’

import { Message } from “element-ui”

/**

  • 后台查询的菜单数据拼装成路由格式的数据

  • 这里是demo使用的是以前项目的后台数据,这里强制修改了一下

  • @param routes

*/

export function generaMenu(routes, data, parent) {

data.forEach(item => {

let menu

let viewpath

if (parent == “/usermanagement”) {

viewpath = “/usermanage”

} else if (parent == “/appmanagement”) {

viewpath = “/appmanage”

} else if (parent == “/vipmanagement”) {

viewpath = “/vipmanage”

} else {

viewpath = parent

}

if (parent === ‘#’) {

menu = {

path: item.path,

component: Layout,

children: [],

redirect: ${item.path}/${item.children[0].path},

meta: { title: item.name, icon: item.icon }

}

} else {

menu = {

path: item.path,

component: loadView(viewpath, item.path),

children: [],

name: item.path,

meta: { title: item.name }

}

}

if (item.children) {

generaMenu(menu.children, item.children, item.path)

}

routes.push(menu)

})

}

export const loadView = (parent, path) => { // 路由懒加载

return (resolve) => require([@/views${parent}/${path}/index], resolve)

// return () => import(@/views${parent}/${path}/index)

}

const state = {

routes: [],

addRoutes: []

}

const mutations = {

SET_ROUTES: (state, routes) => {

state.addRoutes = routes

state.routes = constantRoutes.concat(routes).concat(errorRoutes)

}

}

const actions = {

generateRoutes({ commit }, roles) {

return new Promise(resolve => {

const loadMenuData = []

// 先查询后台并返回左侧菜单数据并把数据添加到路由

getAuthMenu().then(response => {

if (response.code !== 200) {

Message({

message: “菜单数据加载异常”,

type: 0,

duration: 2 * 1000

});

} else {

let data = response.data.menu_list

Object.assign(loadMenuData, data)

let routes=[]

generaMenu(routes, loadMenuData, “#”)

let accessedRoutes

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

Vue 面试题

1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?

43)]
[外链图片转存中…(img-FCMYMelE-1712003423043)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-ieoR1KZS-1712003423043)]

Vue 面试题

1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?
[外链图片转存中…(img-R9rCqPvu-1712003423044)]

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态路由是指路由表在运行时动态生成,而不是在编译时生成。在 Vue.js 中,可以使用 Vue Router 实现动态路由。下面是一个简单的步骤,可以帮助你搭建一个基于 Vue-admin-template动态路由。 1. 安装 Vue Router ```bash npm install vue-router --save ``` 2. 在 src/router/index.js 中引入 Vue Router,并创建一个路由实例 ```javascript import Vue from 'vue'; import Router from 'vue-router'; import Layout from '@/layout'; Vue.use(Router); 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: 'Dashboard', icon: 'dashboard' } }] } ]; const createRouter = () => new Router({ mode: 'history', // 启用 history 模式 scrollBehavior: () => ({ y: 0 }), routes: constantRoutes }); const router = createRouter(); export default router; ``` 3. 在 src/store/modules/permission.js 中创建一个动态路由生成函数 ```javascript import { constantRoutes } from '@/router'; /** * 递归过滤异步路由表,返回符合用户角色权限的路由表 * @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; } /** * 判断用户角色是否有权限访问该路由 * @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; } } 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 => { let accessedRoutes; if (roles.includes('admin')) { accessedRoutes = asyncRoutes || []; } else { accessedRoutes = filterAsyncRoutes(asyncRoutes, roles); } commit('SET_ROUTES', accessedRoutes); resolve(accessedRoutes); }); } }; export default { namespaced: true, state, mutations, actions }; ``` 4. 在 src/router/index.js 中引入动态路由生成函数,并在路由实例中使用 ```javascript import Vue from 'vue'; import Router from 'vue-router'; import Layout from '@/layout'; import store from '@/store'; Vue.use(Router); 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: 'Dashboard', icon: 'dashboard' } }] } ]; const createRouter = () => new Router({ mode: 'history', // 启用 history 模式 scrollBehavior: () => ({ y: 0 }), routes: constantRoutes }); const router = createRouter(); // 刷新页面时重新生成动态路由 router.beforeEach(async(to, from, next) => { const hasRoles = store.getters.roles && store.getters.roles.length > 0; if (hasRoles) { next(); } else { try { // 获取用户角色信息 const { roles } = await store.dispatch('user/getInfo'); // 生成动态路由 const accessedRoutes = await store.dispatch('permission/generateRoutes', roles); // 添加动态路由 router.addRoutes(accessedRoutes); next({ ...to, replace: true }); } catch (error) { console.log(error); } } }); export function resetRouter() { const newRouter = createRouter(); router.matcher = newRouter.matcher; // reset router } export default router; ``` 以上是一个基于 Vue-admin-template动态路由搭建步骤,你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值