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, isMobile } from '@/utils/util' import { getSSOUserInfo, getTodoSSOUserInfo } from './api/api' 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) => { if (isMobile()) { if (to.path !== '/') { next({ path: '/' }) } else { next() } return } // 单点登录-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 && to.query.state === 'feishu') { // 如果没有登录,state是飞书,并且有code,就请求飞书单点登录 await store.dispatch('FeiShuLogin', to.query.code).catch((e) => { // 从飞书跳转进来,正常提示,系统内跳转进来不提示(解决用了replace,但是go(-1)还会跳转回来) if (from.path === '/') { Vue.prototype.$message.warning(e.message, 3) } next({ path: '/user/login', replace: true }) }) } 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 === '/transferRedirectPage') { // 去掉重定向的参数,然后跳转对应页面 const query = Object.assign({}, to.query) delete query.finalRedirectPage delete query.code delete query.state next({ path: to.query.finalRedirectPage, replace: true, query }) } else 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 { // 跳转到目的路由 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 })