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 } }) } } })