permission.js 4.05 KB
/*
 * @Description: 项目权限
 * @Autor: renchao
 * @LastEditTime: 2023-06-20 10:07:56
 */
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 NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import getPageTitle from '@/utils/get-page-title'
import {getToken, getUrlParam, setToken} from "@/utils/util";

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 = getToken()
  let locationUrl = window.location.origin + window.location.pathname;
  function casValidate (ticket){
    axios.get(window._config.services.management + "/management/cas/validate", {
      params: {
        ticket: ticket,
        service: locationUrl,
      },
    }).then(async (res) => {
      if (res.data.status === 1) {
          setToken(res.data.content.accessToken)
          window.location.href = localStorage.getItem('dj-location') + '#' + localStorage.getItem('hash')
      } else {
          alert(res.data.message)
      }
    }).catch((e) => {
      console.log(e);
    });
  }
  async function permission () {
    if (!hasAddDict) {
      store.dispatch('dict/generateDic')
    }
    if (hasAddRoute) {
      next()
      // next({ ...to, replace: true })
    } 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 (to.fullPath||routeTo && routeTo !== '/') {
        next({ ...to, replace: true })
      } else {
        next('/home')
      }
    }
  }
  if (window._config.casEnable === true) {
    if (!token) {
      let ticket = getUrlParam("ticket");
      if (ticket) {
        casValidate(ticket)
      } else {
        localStorage.setItem("location", window.location.href)
        window.location.href = window._config.casBaseURL + '/login?service=' + encodeURIComponent(locationUrl);
      }
    } else {
      permission()
    }
  } else {
    // 使用自定义页面实现单点登录
    if (!token) {
      let ticket = getUrlParam('ticket');
      if (ticket) {
        casValidate(ticket)
      } else {
          if (to.path === '/login') {
              if (getUrlParam('_flag') === '1') {
                  next();
                  return
              } else {
                  //todo: loginUrl 需要业务系统根据登录页面路由地址获取,这里只是简写
                  localStorage.setItem('dj-location',locationUrl)
                  localStorage.setItem('hash',to.fullPath)
                  window.location.href = window._config.services.management + `/management/cas/status?loginUrl=${window._config.baseUrl}/dj/&hash=/login&`
                  return
              }
          }
          localStorage.setItem('dj-location',locationUrl)
          localStorage.setItem('hash',to.fullPath)
          //todo: loginUrl 需要业务系统根据登录页面路由地址获取,这里只是简写
          window.location.href = window._config.services.management + `/management/cas/status?loginUrl=${window._config.baseUrl}/dj/&hash=/login`
      }
    }else{
      if (to.path === '/login') {
        const redirectUrl = getUrlParam('redirectUrl');
        if (redirectUrl && redirectUrl !== '') {
            window.location.href = redirectUrl
            return
        } else {
            next('/');
            return
        }
      }
      permission()
    }
  }
  NProgress.done()
})
router.afterEach(to => {
  // 解决刷新页面报404问题
  Cookies.set("routerTo", to.fullPath)
  NProgress.done()
})