main-web/src/store/modules/permission.js

173 lines
4.8 KiB
JavaScript

/**
* Created by HaijunZhang on 2018/11/12.
*/
import { resolvePath } from 'utils/resolvePath'
import { removeToken, removeTrxToken, getTrxToken } from 'utils/auth'
import { getUserPermissions } from 'services'
import BlankView from '@/layouts/blank.vue'
import router, { resetRouter } from '@/router'
import { menuKey, enablePermissionStorage } from '@/config'
import actionStore from '@/core/actions'
import { trimStart } from 'lodash-es'
const resultRoutes = []
const createSubRoute = permissions => {
permissions.forEach(item => {
const { path } = item
router.addRoute('Home', {
name: trimStart(path, '/'),
path: `${path}/:page*`,
component: BlankView
})
})
}
// 对异步路由数据进行处理生成路由表
const handleAsyncRouter = (routes, basePath = '/') => {
const res = []
routes.forEach(route => {
const { router, component, name, redirect, icon, id, category, meta, params } = route
// 生成meta对象
const metaCache = {}
JSON.parse(meta).forEach(item => {
metaCache[item.key] = item.value
})
// 生成params对象
const paramsCache = {}
JSON.parse(params).forEach(item => {
paramsCache[item.key] = item.value
})
const tmp = {
id,
path: resolvePath(basePath, route.path),
name: router,
component,
redirect,
hidden: category === 'view',
meta: {
...metaCache,
title: name,
icon
},
params: paramsCache
}
if (route.children) {
tmp.children = handleAsyncRouter(route.children, tmp.path)
}
res.push(tmp)
})
return res
}
function getRouteMap(menus) {
let routerMap = {}
menus.forEach(menuItem => {
const { path, children } = menuItem
if (children) {
routerMap = Object.assign(routerMap, getRouteMap(children))
}
routerMap[path] = menuItem
})
return routerMap
}
const state = {
addRoutes: null,
buttons: [],
routeMap: {}
}
const mutations = {
SET_ROUTES: (state, routers) => {
state.addRoutes = routers
state.routeMap = getRouteMap(routers || [])
},
SET_BUTTONS: state => {
state.buttons = JSON.parse(localStorage.getItem('buttonData'))
}
}
const actions = {
GenerateRoutes({ commit, state: { addRoutes } }) {
return new Promise(resolve => {
const callback = permissions => {
resultRoutes.length = 0
actionStore.setGlobalState({
permissions
})
createSubRoute(permissions)
const asyncRouter = handleAsyncRouter(permissions)
commit('SET_ROUTES', asyncRouter)
resolve(asyncRouter)
}
// 如果启用了本地缓存并且刷新界面进入,直接在缓存取数据,因为存在一种情况主动更新数据
if (enablePermissionStorage && !addRoutes) {
const menuData = JSON.parse(localStorage.getItem(menuKey))
if (menuData) {
// 判断下菜单数据是否存在
callback(menuData)
return
}
}
console.log('开始获取权限 getUserPermissions, 传参 trxToken:', getTrxToken())
getUserPermissions({ trxToken: getTrxToken() })
.then(data => {
console.log('getUserPermissions, data:', data)
if (data.success) {
if (enablePermissionStorage) {
localStorage.setItem(menuKey, JSON.stringify(data.data))
}
callback(data.data)
}
})
.catch(err => {
console.log('getUserPermissions, err:', err)
console.log(err)
})
})
},
// 动态更新权限
ChangeRoutes({ dispatch }) {
return new Promise(resolve => {
resetRouter()
dispatch('GenerateRoutes').then(() => {
resolve()
})
})
},
ResetRoutes({ commit, dispatch }, redirectToLogin = true) {
return new Promise(resolve => {
console.trace('ResetRoutes')
const reset = () => {
resetRouter()
commit('SET_ROUTES', null)
if (enablePermissionStorage) {
localStorage.removeItem(menuKey)
}
// 重置用户信息
commit('RESET_USER', null, { root: true })
// 重置用户信息
commit('SETTING_SIDE_MENU', [], { root: true })
// 重置标签信息
dispatch('tagsView/delAllViews', null, { root: true })
removeToken()
removeTrxToken()
// if (redirectToLogin) window.location.href = '/login'
resolve()
}
// 调用天融信单点退出系统
console.log('调用天融信单点退出系统 ResetRoutes 方法', redirectToLogin)
if (redirectToLogin) {
dispatch('ukey/Logout', null, { root: true }).then(res => {
console.log('调用天融信单点退出系统 dispatch(ukey/Logout) 方法 res:', res)
reset()
})
} else {
reset()
}
})
}
}
export default {
namespaced: true,
state,
mutations,
actions
}