import Vue from 'vue' import router from './router' import store from './store' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css' // progress bar style import { ACCESS_TOKEN, OAUTH2_LOGIN_PAGE_PATH, UI_CACHE_DB_DICT_DATA, USER_INFO, USER_NAME } from '@/store/mutation-types' import { generateIndexRouter, isOAuth2AppEnv, findFirstRoute, welcome } from '@/utils/util' import { getSSOUserInfo, getTodoSSOUserInfo } from './api/api' import { isCanLookDetail } from './api/enterpriseStandardLibraryApi' import { updatePageHeight } from './components/tools/setting' NProgress.configure({ showSpinner: false }) // NProgress Configuration const whiteList = ['/user/login', '/user/register', '/user/register-result', '/user/alteration', '/user/internalLogin'] // no redirect whitelist whiteList.push(OAUTH2_LOGIN_PAGE_PATH) router.beforeEach(async (to, from, next) => { // 单点登录-OA单点登录 if (to.query.ticket) { const { result, success, message } = await getTodoSSOUserInfo({ ticket: to.query.ticket }) if (!success) { Vue.prototype.$message.warning(message, 3, () => { window.location.replace(process.env.VUE_APP_LOGOUT_PAGE) }) // 必须切断执行 return } else { const userInfo = result.userInfo Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000) Vue.ls.set(USER_NAME, userInfo.username, 7 * 24 * 60 * 60 * 1000) Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000) Vue.ls.set(UI_CACHE_DB_DICT_DATA, result.sysAllDictItems, 7 * 24 * 60 * 60 * 1000) store.commit('SET_TOKEN', result.token) store.commit('SET_INFO', userInfo) store.commit('SET_NAME', { username: userInfo.username, realname: userInfo.realname, welcome: welcome() }) store.commit('SET_AVATAR', userInfo.avatar) } } else if (to.query.code) { // 研发大前台单点登录 const { result, success, message } = await getSSOUserInfo({ code: to.query.code }) if (!success) { Vue.prototype.$message.warning(message, 3, () => { window.location.replace(process.env.VUE_APP_LOGOUT_PAGE) }) // 必须切断执行 return } else { const userInfo = result.userInfo Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000) Vue.ls.set(USER_NAME, userInfo.username, 7 * 24 * 60 * 60 * 1000) Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000) Vue.ls.set(UI_CACHE_DB_DICT_DATA, result.sysAllDictItems, 7 * 24 * 60 * 60 * 1000) store.commit('SET_TOKEN', result.token) store.commit('SET_INFO', userInfo) store.commit('SET_NAME', { username: userInfo.username, realname: userInfo.realname, welcome: welcome() }) store.commit('SET_AVATAR', userInfo.avatar) } } // 处理是否是嵌入其他系统,是需要隐藏左侧和上面,如果当前值是true,就不需要修改了 const isEmbedded = store.getters.isEmbedded // 用是否iframe嵌套判断 if (!isEmbedded && window.frames.length !== parent.frames.length) { store.commit('SET_IS_EMBEDDED', true) } // 更新页面高度 updatePageHeight() NProgress.start() // start progress bar if (Vue.ls.get(ACCESS_TOKEN)) { /* has token */ if (to.path === '/user/login' || to.path === OAUTH2_LOGIN_PAGE_PATH) { store.dispatch('GetPermissionList').then(res => { const menuData = res.result.menu if (menuData === null || menuData === '' || menuData === undefined) { return } const constRoutes = generateIndexRouter(menuData) // 添加主界面路由 store.dispatch('UpdateAppRouter', { constRoutes }).then(() => { // 根据roles权限生成可访问的路由表 // 动态添加可访问路由表 router.addRoutes(store.getters.addRouters) next(findFirstRoute(menuData)) NProgress.done() }) }) .catch(() => { store.dispatch('Logout').then(() => { next() }) }) } else { if (store.getters.permissionList.length === 0) { store.dispatch('GetPermissionList').then(res => { const menuData = res.result.menu if (menuData === null || menuData === '' || menuData === undefined) { return } const constRoutes = generateIndexRouter(menuData) // 添加主界面路由 store.dispatch('UpdateAppRouter', { constRoutes }).then(() => { // 根据roles权限生成可访问的路由表 // 动态添加可访问路由表 router.addRoutes(store.getters.addRouters) let redirect = decodeURIComponent(from.query.redirect || to.fullPath) if (redirect.indexOf('code') !== -1) { redirect = redirect.substring(0, redirect.indexOf('code')) } if (to.path === redirect) { // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record next({ ...to, replace: true }) } else { if (to.path === '/enterpriseStandardLibrary/enterpriseStandardDetail') { // 跳企标详情,需要判断是否能看详情 const params = {} if (to.query.id) { params.id = to.query.id } else if (to.query.standardNumber) { params.standardNumber = to.query.standardNumber } isCanLookDetail(params).then(res => { if (res.success && res.result) { next({ path: redirect }) } else { next({ path: '/404' }) } }) } else { // 跳转到目的路由 next({ path: redirect }) } } }) }) .catch((error) => { return Promise.reject(error) }) } else { next() } } } else { if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,如果进入的页面是login页面并且当前是OAuth2app环境,就进入OAuth2登录页面 if (to.path === '/user/login' && isOAuth2AppEnv()) { next({ path: OAUTH2_LOGIN_PAGE_PATH }) } else { const path = to.fullPath // 在免登录白名单,直接进入 if (to.path === '/user/login' && to.path !== process.env.VUE_APP_LOGIN_PAGE) { const toPage = process.env.VUE_APP_LOGIN_PAGE.replace('/dashboard/analysis', path.replaceAll('&', '%26')) console.log(toPage) window.location.replace(toPage) return } next() } NProgress.done() } else { // 如果当前是在OAuth2APP环境,就跳转到OAuth2登录页面 const path = isOAuth2AppEnv() ? OAUTH2_LOGIN_PAGE_PATH : '/user/login' if (path === '/user/login' && to.path !== process.env.VUE_APP_LOGIN_PAGE) { const toPage = process.env.VUE_APP_LOGIN_PAGE.replace('/dashboard/analysis', to.fullPath.replaceAll('&', '%26')) console.log(toPage) window.location.replace(toPage) return } next({ path: path, query: { redirect: to.fullPath } }) NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it } } }) router.afterEach(() => { NProgress.done() // finish progress bar })