aiceps-mobile/src/router/permission.js

121 lines
3.1 KiB
JavaScript

import router from './router'
import store from '@/store'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { callMessage } from '@/utils/ui-merge'
import { entRegisterInfoCurrent } from '@/api/市场主体信息相关'
import { oauthLogin, oauthLoginByCerno } from '@/api/user'
import { sysNmgSsoCallback } from '@/api/系统支撑'
const StartRoute = '/login'
const skipToken = []
const skipPortalCode = []
router.beforeEach(async (to, from, next) => {
if (to.query.code && to.query.state2 === 'portal') {
const portalCode = to.query.code
if (!skipPortalCode.includes(portalCode)) {
skipPortalCode.push(portalCode)
await sysNmgSsoCallback({
code: to.query.code,
state: to.query.state
}).then(() => {
setToken('token')
next({
path: '/business',
replace: true
})
}).catch((error) => {
removeToken()
callMessage({
type: 'error',
message: error?.message || '统一门户登录失败'
})
next({
path: StartRoute,
replace: true
})
})
return
}
}
if (to.path === '/oauth' && !skipToken.includes(to.query.token)) {
skipToken.push(to.query.token)
if (to.query.cerno && to.query.tel) {
await oauthLoginByCerno(to.query.token, to.query.cerno, to.query.tel).then((data) => {
setToken('token')
}).catch(() => {
})
} else {
await oauthLogin(to.query.token).then((data) => {
setToken('token')
}).catch(() => {
})
}
next({
path: '/redirect',
replace: true,
query: {
redirect: '/'
}
})
return
}
if (!getToken()) {
await entRegisterInfoCurrent().then((data) => {
if (data.username !== 'guest') {
setToken('token')
}
}).catch((e) => {
removeToken()
// need login
})
}
const hasToken = getToken()
if (hasToken) {
if (to.path === StartRoute) {
next({ path: '/' })
} else {
const hasRoles = store.getters.roles && store.getters.roles.length > 0
if (hasRoles) {
next()
} else {
try {
await store.dispatch('user/getInfo')
const accessRoutes = await store.dispatch(
'permission/generateRoutes',
store.getters.roles
)
for (const route of accessRoutes) {
router.addRoute(route)
}
next({ ...to, replace: true })
} catch (error) {
console.error(error)
// remove token and go to login page to re-login
await store.dispatch('user/resetToken')
callMessage({
type: 'error',
message: error || 'Has Error'
})
next({
path: StartRoute,
query: {
redirect: to.fullPath
}
})
}
}
}
} else {
if (to?.meta?.roles?.includes('guest')) {
next()
} else {
next({
path: StartRoute,
query: {
redirect: to.fullPath
}
})
}
}
})