vue 后台管理系统菜单权限管理
来自:https://www.cnblogs.com/fqh123/p/11094296.html 侵删
login登录方法
login() {
if (!this.username) {
return this.$message.error("请输入用户名");
}
if (!this.password) {
return this.$message.error("请输入密码");
}
if (this.checked) {
localStorage.setItem("username", this.username);
localStorage.setItem("password", this.password);
localStorage.setItem("checked", 1);
} else {
localStorage.removeItem("username");
localStorage.removeItem("password");
localStorage.removeItem("token");
}
let data = {
username: this.username,
password: this.password
}; this.$store
.dispatch("login", data)
.then(() => {
this.$message.success("登录成功");
this.$router.push({ path: "/" });
})
.catch(() => {
console.log(222);
this.$message.error("登陆失败");
// this.loading = false;
});
},
store中
import Vue from "vue";
import Vuex from "vuex";
import { getToken, setToken, removeToken, deepClone } from '@/utils/auth'
import { formatDate } from "@/utils/index.js";
import { login, getUserInfo } from "@/api/mine.js";
import { asyncRouterMap, constantRoutes } from '@/router'; Vue.use(Vuex); function hasPermission(menuMap, route) {
if (route.meta && route.meta.menu_code) {
for (const item of menuMap) {
if (item === route.meta.menu_code) {
return true
}
}
return false
} else {
return true
}
}
function filterAsyncRouter(asyncRouterMap, menuMap) {
const accessedRouters = asyncRouterMap.filter(route => {
if (hasPermission(menuMap, route)) {
if (route.children && route.children.length) {
route.children = filterAsyncRouter(route.children, menuMap)
}
return true
}
return false
})
return accessedRouters
} const store = new Vuex.Store({
state: {
userId: '',
mapcontrols: '', //地图的集合
carlist: '', //行车的集合
attachment: '', //附近的集合
menulist: null,//一级导航
lnglat: {},//经纬度
actionUrl: process.env.VUE_APP_BASE_API + "/couplet-admin/file/uploadImage", //上传图片的url
tokenObj: { "author-token-key": localStorage.getItem("token") }, //上传的请求头token
token: getToken(),
routers: constantRoutes,
addRouters: []
},
getters: {
userId_: state => state.userId,
mapcontrols_: state => state.mapcontrols,
carlist_: state => state.carlist,
attachment_: state => state.attachment,
menulist_: state => state.menulist,
lnglat_: state => state.lnglat,
actionUrl_: state => state.actionUrl,
tokenObj_: state => state.tokenObj,
token_: state => state.token,
routers_: state => state.routers,
addRouters_: state => state.addRouters
},
mutations: {
changemapcontrols: function (state, payload) {
state.mapcontrols = payload
},
changecarlist: function (state, payload) {
state.carlist = payload
},
changeMenulist: function (state, payload) {
state.menulist = payload
},
changecheckAttachment: function (state, payload) {
state.attachment = payload
},
changelnglat: function (state, payload) {
state.lnglat = payload
},
changecheckUserId: function (state, payload) {
state.userId = payload
},
SET_TOKEN: (state, token) => {
state.token = token
},
SET_ROUTERS: (state, routers) => {
state.addRouters = deepClone(routers)
state.routers = deepClone(constantRoutes.concat(routers))
}
},
actions: {
changeformDatas({ commit }, datatime) {
return new Promise((resolve, reject) => {
let time = formatDate(Number(datatime), "yyyy-MM-dd")
resolve(time)
})
},
login({ commit }, userInfo) {
const { username, password } = userInfo
return new Promise((resolve, reject) => {
login({ username: username.trim(), password: password }).then(response => {
commit('SET_TOKEN', response.body)
setToken(response.body)
resolve()
}).catch(error => {
reject(error)
})
})
},
getInfo({ dispatch, commit, state }) {
return new Promise((resolve, reject) => {
getUserInfo().then(response => {
// if (!data) {
// reject('Verification failed, please Login again.')
// }
// const menus = data.menuCodes
commit('changecheckUserId', response.body.userId)
var data = response.body
console.log('response', data)
// localStorage.setItem('MENU_CODE', menus)
const menus = ['/equipmentManagement', '/camera']
dispatch('GenerateRoutes', menus).then(res => {
resolve(data)
})
}).catch(error => {
reject(error)
})
})
},
resetToken({ commit }) {
return new Promise(resolve => {
commit('SET_TOKEN', '')
removeToken()
resolve()
})
},
GenerateRoutes({ commit }, data) {
return new Promise(resolve => {
const accessRouters = filterAsyncRouter(asyncRouterMap, data)
accessRouters.push({ path: '*', redirect: '/404', hidden: true })
commit('SET_ROUTERS', accessRouters)
resolve()
})
}
}
});
export default store
@/utils/auth 中
// import Cookies from 'js-cookie' const TokenKey = 'Authorization' export function getToken() {
// return Cookies.get(TokenKey)
return localStorage.getItem(TokenKey)
} export function setToken(token) {
// return Cookies.set(TokenKey, token)
return localStorage.setItem(TokenKey, token)
} export function removeToken() {
// return Cookies.remove(TokenKey)
return localStorage.removeItem(TokenKey)
} export function deepClone(source) {
if (!source && typeof source !== 'object') {
throw new Error('error arguments', 'shallowClone')
}
const targetObj = source.constructor === Array ? [] : {}
for (const keys in source) {
if (source.hasOwnProperty(keys)) {
if (source[keys] && typeof source[keys] === 'object') {
targetObj[keys] = source[keys].constructor === Array ? [] : {}
targetObj[keys] = deepClone(source[keys])
} else {
targetObj[keys] = source[keys]
}
}
}
return targetObj
}
@/router 中
import Vue from "vue"
import Router from "vue-router"
import store from "./store"; Vue.use(Router) // console.log("store.getters",store.getters)
// console.log("store.getters.menulist_",store.getters.menulist_) const notFound = () => import('@/views/404.vue') //
//登录相关
const login = () => import('@/views/mine/login.vue') //用户登录
const phoneLogin = () => import('@/views/mine/phoneLogin.vue') //手机登录
const retrievePassword = () => import('@/views/mine/retrievePassword.vue') //找回密码
const modifyPassword = () => import('@/views/mine/modifyPassword.vue') //修改密码 const layout = () => import('@/views/layout/index.vue') //导航
const Index = () => import('@/views/index/index.vue') //首页 //管控中心菜单
const mapControls = () => import('@/views/controlsMenu/mapControls/index.vue') //管控地图
const security = () => import('@/views/controlsMenu/security/index.vue') //安防管理
const fire = () => import('@/views/controlsMenu/fire/index.vue') //消防管理
const car = () => import('@/views/controlsMenu/car/index.vue') //车行管理
const lighting = () => import('@/views/controlsMenu/lighting/index.vue') //智慧照明
const checkAttachment = () => import('@/views/controlsMenu/checkAttachment/index.vue') //附近设备 //设备管理菜单
const equipmentManagement = () => import('@/views/equimentMenu/equipmentManagement/index.vue') //设备管理
const camera = () => import('@/views/equimentMenu/camera/index.vue') //摄像头
const wifismoke = () => import('@/views/equimentMenu/wifismoke/index.vue') //路灯控制
const lightAll = () => import('@/views/equimentMenu/lightAll/index.vue') //智慧灯杆
const postScreen = () => import('@/views/equimentMenu/postScreen/index.vue') //发布屏
//告警管理菜单
const alarmManagement = () => import('@/views/alarmMenu/alarmManagement/index.vue') //告警管理
const alarmManagementHoistory = () => import('@/views/alarmMenu/alarmManagementHoistory/index.vue') //告警管理历史 //事件工单菜单
const eventOrder = () => import('@/views/orderMenu/eventOrder/index.vue') //事件工单
const eventOrderHistory = () => import('@/views/orderMenu/eventOrderHistory/index.vue') //事件工单历史 //巡检菜单
const inspectionTrajectory = () => import('@/views/inspectionMenu/inspectionTrajectory/index.vue') //巡检轨迹
const InspectionTask = () => import('@/views/inspectionMenu/InspectionTask/index.vue') //巡检任务单
const InspectionProject = () => import('@/views/inspectionMenu/InspectionProject/index.vue') //巡检项目组
const InspectionConfig = () => import('@/views/inspectionMenu/InspectionConfig/index.vue') //巡检配置 //预案菜单
const emergencyPlan = () => import('@/views/planMenu/emergencyPlan/index.vue') //应急预案 //系统配置菜单
const user = () => import('@/views/systemMenu/user/index.vue') //用户管理
const org = () => import('@/views/systemMenu/org/index.vue') //组织管理
const area = () => import('@/views/systemMenu/area/index.vue') //区域管理
const role = () => import('@/views/systemMenu/role/index.vue') //角色管理
const menu = () => import('@/views/systemMenu/menu/index.vue') //菜单管理
const log = () => import('@/views/systemMenu/log/index.vue') //操作日志
const partition = () => import('@/views/systemMenu/partition/index.vue') //系统项目管理
const dictionary = () => import('@/views/systemMenu/dictionary/index.vue') //数据字典管理
const appPlat = () => import('@/views/systemMenu/platform/appPlat/index.vue') //平台服务管理 -- 应用平台
const provider = () => import('@/views/systemMenu/platform/provider/index.vue') //平台服务管理 -- 供应商平台
const configManage = () => import('@/views/systemMenu/platform/provider/configManage/index.vue') //平台服务管理 -- 供应商平台--园区配置管理
const apiManage = () => import('@/views/systemMenu/platform/provider/apiManage/index.vue') //平台服务管理 -- 供应商平台--接口管理 //-----------------------------
/**
* constantRoutes
* a base page that does not have permission requirements
* all roles can be accessed
*/
export const constantRoutes = [
{ path: "/404", name: '404', component: notFound, hidden: true },
{ path: "/login", name: "login", component: login, hidden: true },
{ path: "/phoneLogin", name: "phoneLogin", component: phoneLogin, hidden: true },
{ path: "/retrievePassword", name: "retrievePassword", component: retrievePassword, hidden: true },
{ path: "/modifyPassword", name: "modifyPassword", component: modifyPassword, hidden: true },
{
path: '/',
component: layout,
redirect: '/mapControls',
children: [{
path: 'mapControls',
name: 'mapControls',
component: mapControls,
},
]
},
]
//动态加载路由
export const asyncRouterMap = [
{
path: '/equipmentManagement',
component: layout,
meta: { title: 'equipmentManagement', menu_code: '/equipmentManagement' },
redirect: '/equipmentManagement',
children: [{
path: '/equipmentManagement',
name: 'equipmentManagement',
component: equipmentManagement,
meta: { title: 'equipmentManagement', menu_code: '/equipmentManagement' },
hidden: true
},
{
path: '/camera',
name: 'camera',
component: camera,
meta: { title: 'camera', menu_code: '/camera' },
hidden: true
}
]
},
] const createRouter = () => new Router({
// mode: 'history', // require service support
// mode: 'hash', // require service support
scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes
}) 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
permission.js 中
import router from './router'
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 NProgress.configure({ showSpinner: false }) // NProgress Configuration 是否有转圈效果
const whiteList = ['/login'] // 没有重定向白名单 router.beforeEach(async (to, from, next) => {
// 开始进度条
NProgress.start()
// 确定用户是否已登录
const hasToken = getToken()
if (hasToken) {
if (to.path === '/login') {
// 如果已登录,则重定向到主页
next({ path: '/' })
NProgress.done()
} else {
const hasGetUserInfo = store.getters.userId_;
if (hasGetUserInfo) {
// console.log("有用户信息");
next();
} else {
// console.log("没用户信息");
try {
// 获得用户信息
await store.dispatch('getInfo');
router.addRoutes(store.getters.addRouters_)//动态路由
next({ ...to })
} catch (error) {
// 删除token,进入登录页面重新登录
await store.dispatch('resetToken');
Message.error(error || 'Has Error');
next(`/login?redirect=${to.path}`);
NProgress.done();
}
} }
} else {
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
// 在免费登录白名单,直接去
next()
} else {
// 没有访问权限的其他页面被重定向到登录页面。
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
}) router.afterEach(() => {
// 完成进度条
NProgress.done()
})
基本剩下的雷同文章来源了
vue 后台管理系统菜单权限管理的更多相关文章
- VUE 后台管理系统权限控制
谈一谈VUE 后台管理系统权限控制 前端权限从本质上来讲, 就是控制视图层的展示,比如说是某个页面或者某个按钮,后端权限可以控制某个用户是否能够查询数据, 是否能够修改数据等操作,后端权限大部分是基于 ...
- vue后台管理系统权限处理
vue后台管理系统权限 1.权限问题:用户和管理员进入管理系统看到的模块是不一样的,管理员看的的要比用户看到的多.需要用到动态加载路由,router.addRouters()来动态的挂载路由 // 1 ...
- vue中如何实现后台管理系统的权限控制
vuejs单页应用的权限管理实践 一.前言 在广告机项目中,角色的权限管理是卡了挺久的一个难点.首先我们确定的权限控制分为两大部分,其中根据粒的大小分的更细: 接口访问的权限控制 页面的权限控制 菜单 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--系统权限及操作指引
系列目录 1.权限包括菜单权限,按钮权限,数据权限 2.角色组和用户之间是多对多的关系,即多个用户可以拥有多个角色组,权限是拥有角色组的并集 1.菜单界面,菜单都是动态数据由模块管理进行设置 2.权限 ...
- 初识ABP vNext(4):vue用户登录&菜单权限
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 登录 菜单权限 运行测试 最后 前言 上一篇已经创建好了前后端项目,本篇开始编码部分. 开始 几乎所有的系统都绕不开登 ...
- 完整开发vue后台管理系统小结
最近业余帮朋友做两个vue项目,一个是面向用户纯展示系列的(后统称A项目),一个是后端管理系统类的(后统称B项目).两者在技术上都没难度,这里对开发过程遇到的问题.取舍等做一个小节. 关于项目搭建 目 ...
- vue后台_登录权限
登录权限控制包含着这么几个方面的含义: 1)不同的权限对应不同的路由 2)侧边栏需要根据不同的权限,异步生成 登录:使用用户名和密码,登录成功后返回用户的token(防止XSS攻击),将此token存 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--系统权限全套完整图
根据角色或用户或模块查询权限.
- VUE+element tree 实现权限管理
先写个标题~ ~,后续有空在写 具体功能: 1. 获取所有角色权限列表展示,点击进行编辑,编辑用terr树形结构显示页面结构 2.提交的数据格式(页面名称,角色ID,父节点ID,子节点ID) 3.后面 ...
随机推荐
- Flutter 中AlertDialog确认提示弹窗
import 'package:flutter/material.dart'; import 'dart:async'; enum Action { Ok, Cancel } class AlertD ...
- 测试一下windowsLiveWriter
一个是看看这个东西能不能发布出博客,还有一个就是准备开始写博客了,所以随便写个作为开始吧,我不想多说什么目标啊,什么的,所以就这一句简单的一句话就够了.
- 查看Oracle中是否有锁表
转: 查看Oracle中是否有锁表 2018-04-23 17:59 alapha 阅读(19450) 评论(0) 编辑 收藏 一.用dba用户登录,或者将用户赋权为DBA用户 命令: su - or ...
- Win10 x64 pnglib Debug
Win10 x64 pnglib Debug >------ 已启动生成: 项目: ZERO_CHECK, 配置: Debug x64 ------ > Checking Build S ...
- 为什么NtReadVirtualMemory 硬件断点无法下断
win7 x64为例 nt!NtReadVirtualMemory ----- nt!MmCopyVirtualMemory NTSTATUS NTAPI MmCopyVirtualMemory(IN ...
- mysql 1045
1.sudo gedit /etc/my.cnf 2.加入 skip-grant-tables 3.直接登录,输密码时回车 mysql -u root -p 4.修改密码 use mysql; upd ...
- RabbitMQ 入门教程(PHP版) 第五部分:通过主题进行消息分发(Topics)
对于 Message 的 routing_key 字符串格式是有限制的:以点号"."分割的字符表,如php.laravel,并且长度不能超过 255 个字节. 对于 routing ...
- HTML布局水平导航条2制作
前两个博文导航条都不是铺满水平的浏览器的,很多导航条样式都是随着浏览器的移动,是100%.此外前两个博文导航条都是块状点击的,也就是给a标签加宽高,设置成块状显示,点击的时候不一定要点文字,只要点击该 ...
- FreeRTOS 时间片,外部中断,任务优先级的一个疑问
时间片1ms 假设有两个任务,A和B,A任务等待中断里面发出的信号量,B任务在运行 此时,B任务运行了300us的时候中断发生,发出信号量,那么任务A接收到信号量,A任务优先级高,A任务运行 有个问题 ...
- 【ARTS】01_40_左耳听风-201900812~201900818
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...