permission.js 3.07 KB
/*
 * @Description: 项目权限
 * @Autor: renchao
 * @LastEditTime: 2023-06-08 10:42:33
 */
import Vue from 'vue'
import axios from 'axios'
import router from './router'
import store from './store'
import Cookies from 'js-cookie'
import { getMenuInfo } from '@/api/user'
import { getUrlParam } from '@/utils/operation'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import getPageTitle from '@/utils/get-page-title'

NProgress.configure({ showSpinner: false }) // NProgress Configuration

router.beforeEach(async (to, from, next) => {
  Vue.prototype.$currentRoute = to
  NProgress.start()
  document.title = getPageTitle(to.meta.title)
  let hasAddDict = store.state.dict.addDict
  let hasAddRoute = store.state.permission.addRoutes
  // cas操作
  const token = localStorage.getItem("token") || Cookies.get('token');
  if (to.path === '/login') {
    if (token) {
      next('/')
    } else {
      next()
    }
    return
  }
  if (window._config.casEnable === true) {
    let locationUrl = window.location.protocol + '//' + window.location.host + window.location.pathname;
    if (!token) {
      let ticket = getUrlParam('ticket');
      if (ticket) {
        axios.get(Vue.prototype.BASE_API.ip + "/management/cas/validate", {
          params: {
            'ticket': ticket,
            'service': locationUrl
          }
        }).then(async (res) => {
          if (process.env.NODE_ENV === 'development') {
            localStorage.setItem('token', res.data.content.accessToken)
          } else {
            Cookies.set('token', res.data.content.accessToken)
          }
          window.location.href = localStorage.getItem('location')

        }).catch(e => {
          console.log(e)
        })
      } else {
        localStorage.setItem("location", window.location.href)
        window.location.href = window._config.casBaseURL + '/login?service=' + encodeURIComponent(locationUrl);
      }
    } else {
      permission()
    }

    async function permission () {
      if (!hasAddDict) {
        store.dispatch('dict/generateDic')
      }
      if (hasAddRoute) {
        next()
      } else {
        const { result: getMenuData } = await getMenuInfo()
        const accessRoutes = await store.dispatch('permission/generateRoutes', getMenuData)
        // 获取用户信息
        await store.dispatch('user/getUserInfo')
        router.addRoutes([...accessRoutes, { path: '*', redirect: '/404', hidden: true }])
        const routeTo = Cookies.get('routerTo')
        if (routeTo && routeTo !== '/') {
          next({ ...to, replace: true })
        } else {
          next('/home')
        }
      }
    }
  } else {
    if (!token) {
      const redirectData = {
        path: '/login',
        replace: true,
      }
      if (to.path) {
        redirectData.query = {
          ...redirectData.query,
          redirect: to.path,
        };
      }
      next(redirectData)
      return
    }
    next()
  }
  NProgress.done()
})
router.afterEach(to => {
  // 解决刷新页面报404问题
  Cookies.set("routerTo", to.fullPath)
  NProgress.done()
})