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.后面 ...
随机推荐
- git---主分支同步到子分支
在进行git项目协同开发的时候,每个分支的代码会被合并到主分支 master 分支上,但是如何将master分支上的代码合并到子分支上呢? 第一步:切换到本地的仓库,更新为最新的代码. 第二步:切换到 ...
- maven项目中,添加依赖后,出现"Dependency 'xxxx‘ not found"解决过程
转自:https://blog.csdn.net/lixld/article/details/82284269 idea中修改pom.xml文件,添加各种工程依赖的jar,一直没有问题, 但今天遇到问 ...
- Python 相对导入attempted relative import beyond top-level package
ValueError: attempted relative import beyond top-level package 假设有如下层次包目录 project/ __init__.py mypac ...
- ABAP函数篇1 日期函数
1. 日期格式字段检查 data:l_date type ekko-bedat. l_date = '20080901'. CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY ...
- 一些Python中的二维数组的操作方法
一些Python中的二维数组的操作方法 这篇文章主要介绍了一些Python中的二维数组的操作方法,是Python学习当中的基础知识,需要的朋友可以参考下 需要在程序中使用二维数组,网上找到一种这样的用 ...
- Linux查找含有特定字符串的文件
Linux查找含有特定字符串的文件命令为grep.以下为详细的使用方法 grep [OPTIONS] PATTERN [FILE...] #实例:递归查找当前文件夹下所有含有test的文件,并显示行号 ...
- oracle归档空间
select GROUP_NUMBER, NAME, STATE, TOTAL_MB-FREE_MB as USED_MB, FREE_MB, USABLE_FILE_MB from v$asm_di ...
- Cas(07)——建立使用Cas进行单点登录的应用
建立使用Cas进行单点登录的应用 目录 1.1加入cas-client-core-xxx.jar到classpath 1.2配置Filter 1.2.1AuthenticationFilter 1.2 ...
- VUE 多页面打包webpack配置
思路:多配置一个main的文件,用于webpack入口使用, 然后路由的导向也应该默认指向新组件,最后通过webpack构建出一个新的独立的html文件. 缺点:生成多个html会new出多个vu ...
- RabbitMQ官方教程三 Publish/Subscribe(GOLANG语言实现)
RabbitMQ官方教程三 Publish/Subscribe(GOLANG语言实现) 在上一个教程中,我们创建了一个工作队列. 工作队列背后的假设是,每个任务都恰好交付给一个worker处理. 在这 ...