permission.js 3.63 KB
/*
 * @Description: 项目权限
 * @Autor: renchao
 * @LastEditTime: 2023-06-01 16:16:04
 */
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")
    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('ACCESS_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);
                permission()
            }
        } else {
            permission()
        }
        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 (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()
})