173 lines
4.8 KiB
JavaScript
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
|
|
}
|