一、后端接口获取菜单信息

1、返回数据样式

{
"code": 20000,
"data": [{
"menuId": "2000000000000001",
"parentMenuId": "0",
"name": "Json工具",
"menuType": 2,
"component": "#",
"redirect": "",
"alwaysShow": true,
"hidden": false,
"sort": 0,
"level": 0,
"children": [{
"menuId": "2210574586898432",
"parentMenuId": "2000000000000001",
"name": "Json校验格式化工具",
"menuType": 2,
"component": "/amis/index",
"redirect": "",
"alwaysShow": true,
"hidden": false,
"sort": 0,
"level": 0,
"children": [],
"meta": {
"title": "Json校验格式化工具",
"icon": "",
"roles": null
}
}],
"meta": {
"title": "Json工具",
"icon": "user",
"roles": null
}
}],
"msg": "操作成功",
"pager": null
}

2、调整src/router/index.js文件内容

const createRouter = ()上面增加动态路由默认配置

// asyncRoutes 是动态的,后台返回哪些就只有哪些。
export const asyncRoutes = [
// 404 必须添加
{ path: '*', redirect: '/404', hidden: true }
]

3、增加permission处理

创建 src/store/modules/permission.js 文件

import { constantRoutes } from '@/router' // 引入路由表里的固定路由
import { getMenu } from '@/api/user' // 引入第一步创建的获取权限信息的接口
import Layout from '@/layout' // 引入布局 /**
* 后台查询的菜单数据拼装成路由格式的数据
*/
export function generaMenu(routes, data) {
data.forEach(item => {
console.log('菜单信息', JSON.stringify(item))
const menu = {
path: '/page/' + item.menuId,
component: item.component === '#' ? Layout : () => import('@/views/amis/index'),
hidden: item.hidden,
redirect: item.redirect,
children: [],
name: 'menu_' + item.menuId,
meta: item.meta
}
if (item.children) {
generaMenu(menu.children, item.children)
}
routes.push(menu)
})
}
const state = {
routes: [],
addRoutes: []
}
const mutations = {
SET_ROUTES: (state, routes) => {
state.addRoutes = routes // 路由访问
state.routes = constantRoutes.concat(routes) // 菜单显示
}
}
const actions = {
generateRoutes({ commit }) {
return new Promise(async resolve => {
const routes = await getMenu({menuType: 2}) // 接口获取到后台返回的权限信息,包含路由
console.log("查询的菜单信息",routes)
const asyncRoutes = []
generaMenu(asyncRoutes, routes.data)
commit('SET_ROUTES', asyncRoutes)
resolve(asyncRoutes)
})
}
} export default {
namespaced: true,
state,
mutations,
actions
}

4、把自定义的permission挂在到store上面

修改src/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'
// !!!!增加内容开始
import permission from './modules/permission'
// !!!!增加内容结束 Vue.use(Vuex) const store = new Vuex.Store({
modules: {
app,
settings,
user,
// !!!!增加内容开始
permission
// !!!!增加内容结束
},
getters
}) export default store

5、权限拦截

修改src/permission.js文件,注意路径: 不是上面新增的文件

// 修改内容开始
import router,{ constantRoutes } from './router' // 这里把constantRoutes 引入进来
// 修改内容结束
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title' NProgress.configure({ showSpinner: false }) // NProgress Configuration const whiteList = ['/login'] // no redirect whitelist router.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(token)放开就可以
next()
const accessRoutes = await store.dispatch('permission/generateRoutes')
router.addRoutes(accessRoutes) // if (hasToken) {
// if (to.path === '/login') {
// // if is logged in, redirect to the home page
// next({ path: '/' })
// NProgress.done()
// } else {
// const hasGetUserInfo = store.getters.name
// if (hasGetUserInfo) {
// next()
// } else {
// try {
// // get user info
// await store.dispatch('user/getInfo')
// // 这里调用的就是第三步新建的generateRoutes
// const accessRoutes = await store.dispatch('permission/generateRoutes')
// router.options.routers = constantRoutes.concat(accessRoutes) // 这一步必须写,不然会出现左侧菜单空白、刷新空白等问题
// router.addRoutes(accessRoutes)
// next({ ...to, replace: true }) // // next()
// } 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 {
// /* 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()
})

6、修改src/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,
// 增加内容开始
// 动态路由
permission_routes: state => state.permission.routes
// 增加内容结束
}
export default getters

7、修改菜单组件vue文件

修改src/layout/components/Sidebar/index.vue

<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', // 动态路由
//修改内容结束
'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>

参考文档:https://blog.csdn.net/qq_36873710/article/details/124430511

vue-element-template改为从后台获取菜单的更多相关文章

  1. 循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理

    在前面随笔<循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理>中介绍了在Vue + Element整合框架中,实现了动态菜单和动态路由的处理,从而可以根据 ...

  2. GitHub Vue项目推荐|Vue+Element实现的电商后台管理系统功能丰富

    GitHub Vue项目推荐|mall-admin-web是一个电商后台管理系统的前端项目基于Vue+Element实现 主要包括商品管理.订单管理.会员管理.促销管理.运营管理.内容管理.统计报表. ...

  3. vue+element UI递归方式实现多级导航菜单

    介绍 这是一个是基于element-UI的导航菜单组件基础上,进行了二次封装的菜单组件,该组件以组件递归的方式,实现了可根据从后端接收到的json菜单数据,动态渲染多级菜单的功能. 使用方法 由于该组 ...

  4. 循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理

    在我开发的很多系统里面,包括Winform混合框架.Bootstrap开发框架等系列产品中,我都倾向于动态配置菜单,并管理对应角色的菜单权限和页面权限,实现系统对用户权限的控制,菜单一般包括有名称.图 ...

  5. vue+element UI 使用select元素动态的从后台获取到

    VUE select元素动态的从后台获取到 <el-form-item label="选择店铺"> <el-select v-model="value& ...

  6. 循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用

    在我们开发BS页面的时候,往往需要了解常规界面组件的使用,小到最普通的单文本输入框.多文本框.下拉列表,以及按钮.图片展示.弹出对话框.表单处理.条码二维码等等,本篇随笔基于普通表格业务的展示录入的场 ...

  7. 循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

    在我们一些系统里面,有时候会需要一些让用户自定义的数据信息,一般这些可以使用扩展JSON进行存储,不过每个业务表的显示项目可能不一样,因此需要根据不同的表单进行设计,然后进行对应的数据存储.本篇随笔结 ...

  8. 循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理

    在我们一般开发的系统界面里面,列表页面是一个非常重要的综合展示界面,包括有条件查询.列表展示和分页处理,以及对每项列表内容可能进行的转义处理,本篇随笔介绍基于Vue +Element基础上实现表格列表 ...

  9. 循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用

    在我前面随笔<循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用>里面曾经介绍过一些常规的界面组件的处理,主要介绍到单文本输入框.多文本框.下拉列 ...

  10. 循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

    我们开发的系统,一般可以不用考虑语言国际化的问题,大多数系统一般是给本国人使用的,而且直接使用中文开发界面会更加迅速 一些,不过框架最好能够支持国际化的处理,以便在需要的时候,可以花点时间来实现多语言 ...

随机推荐

  1. 鸿蒙ArkUI-X已更新适配API13啦

    ArkUI-X 5.0.1 Release版配套OpenHarmony 5.0.1 Rlease,API 13,新增适配部分API 13接口支持跨平台:框架能力进一步完善,支持Android应用非压缩 ...

  2. AI让照片跳舞,人人都能是舞王!Swan下载介绍

    最近,兵马俑.马斯克以及各地网友跳科目三和网红舞的视频陆续在社交媒体和朋友圈刷屏,这些大约10秒左右的视频都不是真人出镜,均由大模型生成,这种低门槛的跳舞方式引发了网友的广泛体验,掀起了一波斗舞狂潮「 ...

  3. 优化简历的开源工具「GitHub 热点速览」

    有读者留言问我是不是"跑路"了,上周没发「GitHub 热点速览」是因为在忙于编写<HelloGitHub 月刊>.这不,我带着诚意满满的开源项目又回来啦!首先要分享一 ...

  4. PowerShell一键下载Nuget某个包的所有版本

    一转眼好几年没有写博客了,来博客园冒个泡,最近由于工作需要,内网办公,幸运的是只需要上传一个*.nupkg一个包信息就可以在私有nuget下载到了,下面就用PowerShell编写下载脚本,需要注意的 ...

  5. 以下哪一项是对CSMA/CA和CSMA/CD LAN控制通用的CSMA方法的适当描述?

    A.   检测载波信号并控制数据传输. B.   获得具有传输权的消息(令牌)的终端传输数据. C.   如果在数据传输过程中发生冲突,立即重新发送. D.   即使在使用传输线时也可以传输数据. = ...

  6. Mysql的个人习惯

    一定要有主键 一般使用的innodb引擎中会根据主健创建聚簇索引,这种方式会使得数据排列的更连续,减少随机IO 关于数据长度 考虑数据范围,够用的前提下,数据长度是越简单越好,数据类型是越小越好. 尽 ...

  7. manim边做边学--淡入淡出

    本篇介绍Manim中的淡入和淡出动画效果. 淡入FadeIn 主要用于让对象以渐变的方式在场景中显现. 它的特点是视觉上柔和过渡,能自然地引导观众注意新出现的元素. 淡出FadeOut 则是使对象逐渐 ...

  8. GraphQL Part VII: 实现数据变更

    我们已经可以使用各种方式来获取数据了.但是如何修改服务器端的数据呢?包括数据插入,修补,删除或者更新等等.GraphQL 的 mutation 就是负责这部分的. 在我们继续之前,我想对项目做一点调整 ...

  9. 一文学会powshell使用及功能

    声明! 原文来自微信公众号泷羽Sec-track 认识powsehll PowerShell(通常称作PowerShell或Windows PowerShell)是由微软开发的一种任务自动化和配置管理 ...

  10. 我们需要什么样的 ORM 框架

    了解我的人都知道, 本人一直非常排斥 ORM 框架, 由于对象关系阻抗不匹配, 一直觉得它没有什么用, 操作数据库最好的手段是 sql+动态语言. 但这两年想法有了重大改变. 2013 年用 js 实 ...