目录:
1.1、什么是权限管理
1.2、实现思路
2.1、目录结构
... -src -api ... -assets .... -common .... -mock -home.js -index.js -permission.js //权限文件 -user.js -store -index.js -tab.js //动态菜单添加 -user.js -views .... -Loigin -Login.vue //登录组件 -APP.vue -main.js -routes.js ....
2.2、 路由routes.js配置
//懒加载 const Main = () => import(‘@/views/Main‘); //公共组件加载 .... //登录组件 const Login = () => import(‘@/views/Login/Login.vue‘) let routes = [ { path: ‘/‘, component: Main, children: [....] }, { path: ‘/login‘, name: ‘login‘, component: Login //登录组件 } ]; export default routes;
2.2、Login.vue组件
<template> <div style="padding: 20px"> <el-form :model="form" label-width="120"> <el-form-item label="用户名"> <el-input v-model="form.username"></el-input> </el-form-item> <el-form-item label="密码"> <el-input v-model="form.password" type="password"></el-input> </el-form-item> <el-form-item align="center"> <el-button type="primary" @click="login">登录</el-button> </el-form-item> </el-form> </div> </template> <script> export default { data() { return { form: { username: ‘‘, password: ‘‘ } } }, methods: { login() { //定义login事件,去调用permisson.js this.$http.post(‘api/permission/getMenu‘, this.form).then(res => { res = res.data; console.log(res); //调式login组件 }) } } } </script> <style scoped> .el-form { width: 50%; margin: auto; padding: 45px; height: 450px; background-color: #fff; } </style>
2.3、 新增权限文件permission.js
import Mock from ‘mockjs‘ export default { getMenu: config => { const { username, password } = JSON.parse(config.body); console.log(JSON.parse(config.body)); // 先判断用户是否存在 if (username === ‘admin‘ || username === ‘wp‘) { // 判断账号和密码是否对应 if (username === ‘admin‘ && password === ‘123456‘) { return { code: 20000, data: { menu: [ { path: ‘/‘, name: ‘home‘, label: ‘首页‘, icon: ‘s-home‘, url: ‘Home/Home‘ }, { path: ‘/video‘, name: ‘video‘, label: ‘视频管理页‘, icon: ‘video-play‘, url: ‘VideoManage/VideoManage‘ }, { path: ‘/user‘, name: ‘user‘, label: ‘用户管理页‘, icon: ‘user‘, url: ‘UserManage/UserManage‘ }, { label: ‘其他‘, icon: ‘location‘, children: [ { path: ‘/page1‘, name: ‘page1‘, label: ‘页面1‘, icon: ‘setting‘, url: ‘Other/PageOne‘ }, { path: ‘/page2‘, name: ‘page2‘, label: ‘页面2‘, icon: ‘setting‘, url: ‘Other/PageTwo‘ } ] } ], token: Mock.Random.guid(), message: ‘获取成功‘ } } } else if (username === ‘wp‘ && password === ‘123456‘) { return { code: 20000, data: { menu: [ { path: ‘/‘, name: ‘home‘, label: ‘首页‘, icon: ‘s-home‘, url: ‘Home/Home‘ }, { path: ‘/video‘, name: ‘video‘, label: ‘视频管理页‘, icon: ‘video-play‘, url: ‘VideoManage/VideoManage‘ } ], token: Mock.Random.guid(), message: ‘获取成功‘ } } } else { return { code: -999, data: { message: ‘密码错误‘ } } } } else { return { code: -999, data: { message: ‘用户不存在‘ } } } } }
2.4、在index.js的文件中mock请求url
import Mock from ‘mockjs‘ .... import permissionApi from ‘./permission‘ .... // 权限相关 Mock.mock(/\/permission\/getMenu/, ‘post‘, permissionApi.getMenu);
2.5、我们在并且我们在store下的tab.js中需要定义动态的state:menu
const state = { ...., menu: [], //存储动态菜单 tabsList: [...] }; .... export default { state, mutations, actions }
2.6、编辑Aside.vue组件获取动态的menu菜单
<template>
<!--background-color自定义颜色-->
<el-menu default-active="2" class="el-menu-vertical-demo" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b" :collapse="isCollage">
<h3 v-show="!isCollage">高高后台管理系统</h3>
<h3 v-show="isCollage">高高</h3>
<el-menu-item :index="item.path" v-for="item in noChildren" :key="item.path" @click="clickMenu(item)">
<i :class="‘el-icon-‘ + item.icon"></i>
<span slot="title">{{ item.label }}</span>
</el-menu-item>
<el-submenu index="item.path" v-for="(item,index) in hasChildren" :key="index">
<template slot="title">
<i :class="‘el-icon-‘ + item.icon"></i>
<span slot="title">{{ item.label }}</span>
</template>
<el-menu-item-group>
<el-menu-item :index="subItem.path" v-for="(subItem,subIndex) in item.children" :key="subIndex" @click="clickMenu(subItem)">
<i :class="‘el-icon-‘ + subItem.icon"></i>
<span slot="title">{{ subItem.label }}</span>
</el-menu-item>
</el-menu-item-group>
</el-submenu>
</el-menu>
</template>
<script>
export default {
computed: {
noChildren(){ //改成this.asideMenu 变成 this.menu
return this.menu.filter(item => !item.children)
},
hasChildren(){
return this.menu.filter(item => item.children)
},
isCollage(){
return this.$store.state.tab.isCollapse;
},
menu(){ //获取动态的菜单
return this.$store.state.tab.menu;
}
},
....
}
</script>
<style scoped>
....
</style>
原文:https://www.cnblogs.com/zhangqigao/p/12699399.html