| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- /*
- * @Author: From-wh from-wh@hotmail.com
- * @Date: 2023-03-04 11:49:55
- * @FilePath: /admin/src/router/index.js
- * @Description:
- *
- */
- // +----------------------------------------------------------------------
- // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
- // +----------------------------------------------------------------------
- // | Author: CRMEB Team <admin@crmeb.com>
- // +----------------------------------------------------------------------
- import Vue from 'vue';
- import Router from 'vue-router';
- import routes from './routers';
- import Setting from '@/setting';
- import store from '@/store';
- import iView from 'iview';
- import { removeCookies, getCookies, setTitle } from '@/libs/util';
- import { includeArray } from '@/libs/auth';
- import { PrevLoading } from '@/utils/loading.js';
- Vue.use(Router);
- // 解决 `element ui` 导航栏重复点菜单报错问题
- const originalPush = Router.prototype.push;
- Router.prototype.push = function push(location) {
- return originalPush.call(this, location).catch((err) => err);
- };
- const router = new Router({
- routes,
- mode: Setting.routerMode,
- });
- // 判断路由 meta.roles 中是否包含当前登录用户权限字段
- export function hasAuth(roles, route) {
- if (route.meta && route.meta.auth) return roles.some((role) => route.meta.auth.includes(role));
- else return true;
- }
- // 递归过滤有权限的路由
- export function setFilterMenuFun(routes, role) {
- const menu = [];
- routes.forEach((route) => {
- const item = { ...route };
- if (hasAuth(role, item)) {
- if (item.children) item.children = setFilterMenuFun(item.children, role);
- menu.push(item);
- }
- });
- return menu;
- }
- // 递归处理多余的 layout : <router-view>,让需要访问的组件保持在第一层 layout 层。
- // 因为 `keep-alive` 只能缓存二级路由
- // 默认初始化时就执行
- export function keepAliveSplice(to) {
- if (to.matched && to.matched.length > 2) {
- to.matched.map((v, k) => {
- if (v.components.default instanceof Function) {
- v.components.default().then((components) => {
- if (components.default.name === 'parent') {
- to.matched.splice(k, 1);
- router.push({ path: to.path, query: to.query });
- keepAliveSplice(to);
- }
- });
- } else {
- if (v.components.default.name === 'parent') {
- to.matched.splice(k, 1);
- keepAliveSplice(to);
- }
- }
- });
- }
- }
- // 延迟关闭进度条
- export function delayNProgressDone(time = 300) {
- setTimeout(() => {
- NProgress.done();
- }, time);
- }
- /**
- * 路由拦截
- * 权限验证
- */
- router.beforeEach(async (to, from, next) => {
- // PrevLoading.start();
- keepAliveSplice(to);
- if (to.fullPath.indexOf('kefu') != -1) {
- return next();
- }
- // if (Setting.showProgressBar) iView.LoadingBar.start()
- // 判断是否需要登录才可以进入
- if (to.matched.some((_) => _.meta.auth)) {
- // 这里依据 token 判断是否登录,可视情况修改
- const token = getCookies('token');
- if (token && token !== 'undefined') {
- const access = store.state.userInfo.uniqueAuth;
- const isPermission = includeArray(to.meta.auth, access);
- if (isPermission) {
- next();
- } else {
- if (access.length == 0) {
- next({
- name: 'login',
- query: {
- redirect: to.fullPath,
- },
- });
- localStorage.clear();
- removeCookies('token');
- removeCookies('expires_time');
- removeCookies('uuid');
- } else {
- next({
- name: '403',
- });
- }
- }
- // next();
- } else {
- // 没有登录的时候跳转到登录界面
- // 携带上登陆成功之后需要跳转的页面完整路径
- next({
- name: 'login',
- query: {
- redirect: to.fullPath,
- },
- });
- localStorage.clear();
- removeCookies('token');
- removeCookies('expires_time');
- removeCookies('uuid');
- }
- } else {
- // 不需要身份校验 直接通过
- next();
- }
- });
- router.afterEach((to) => {
- // if (Setting.showProgressBar) iView.LoadingBar.finish()
- // 更改标题
- setTitle(to, router.app);
- // 返回页面顶端
- window.scrollTo(0, 0);
- PrevLoading.done();
- });
- export default router;
|