index.js 3.73 KB
import Vue from "vue";
import Router from "vue-router";
Vue.use(Router);
import i18n from "@/i18n";

/* Layout */
import Layout from "@/layout";
import store from '@/store'

//业务文件
import * as routeConfig from "@/utils/routeConfig";
import * as perApi from "@/api/systemPermission/userPermission";

/**

 * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
   后续有新增路径配置写在 src\utils routeConfig.js文件 serverRoutesConfig 变量
 */
export const sysDefaultRoutes = [
    {
        path: "/login",
        component: () => import("@/views/login/index"),
        hidden: true,
    },
    {
        path: "/",
        component: Layout,
        redirect: "/mainPage",
        name: "main",
        children: [
            {
                path: "mainPage",
                name: "mainPage",
                component: () => import("@/views/main/index"),
                meta: {
                    title: "system.mainPage",
                    icon: "el-icon-house",
                    affix: true,
                },
            },
        ],
    },
    {
        path: "/system/index",
        component: Layout,
        hidden: true,
        redirect: "noredirect",
        children: [
            {
                path: "system",
                component: (resolve) => require(["@/views/systemPermission/index"], resolve),
                name: "system",
                meta: { title: "授权", icon: "" },
            },
        ],
    }
];

export const asyncRoutes = []


const createRouter = () =>
    new Router({
        // mode: 'history', // require service support
        scrollBehavior: () => ({ y: 0 }),
        routes: sysDefaultRoutes,
    });

const router = createRouter();
let flag = 0
router.beforeEach((to, from, next) => {
    debugger
    //没有登入跳转到登入页面
    const token = store.getters.token
    // 1. 检查是否已登录
    if (!token) {
        if (to.path === '/login') {
            next()
        } else {
            next(`/login?redirect=${encodeURIComponent(to.fullPath)}`)
        }
        return
    }
    if (to.path !== '/login') {
        if (flag == 0) {
            getPermissionData(() => {
                next({ ...to, replace: true })
            })
            flag++
        } else {
            next()
        }
    } else {
        next();
    }
});


// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() {
    const newRouter = createRouter();
    router.matcher = newRouter.matcher; // reset router
}

export default router;

//获取用户权限,在登入页面登入成功后调用 getPermissionData
export function getPermissionData(callBack) {
    // 1. 检查是否已登录
    if(!store.getters.token) {
        next(`/login`)
        return // 直接终止后续逻辑
    }
    perApi.getPermissions().then((res) => {
        if (res.code !== 'Success') {
            sessionStorage.removeItem('sys_menu_per_data')
            this.$message.error("权限数据读取失败原因:" + res.msg);
            return
        }
        debugger
        // 接口数据转换 vue路由结构数据格式
        const serverRoutesData = routeConfig.generatePermissionRoutes(res, routeConfig.serverRoutesConfig);
        const result = [
            ...serverRoutesData,
            routeConfig.sys_outesMapConfig,
            routeConfig.sys_routes404Config
        ];

        // 重置路由,并重新添加静态和动态路由
        resetRouter();
        router.addRoutes(result);

        // 存储到Vuex和localStorage
        store.commit('permission/SET_ROUTES_Routes', result);
        localStorage.setItem('sys_menu_per_data', JSON.stringify(result));
        callBack();
    });
}