vue3-element-admin 去掉登录

1.src/router/index 去掉登录路由

复制代码
  // {
  //   path: "/login",
  //   component: () => import("@/views/login/index.vue"),
  //   meta: { hidden: true },
  // },

2./src/plugins/permission修改 未登录

复制代码
import type {
  NavigationGuardNext,
  RouteLocationNormalized,
  RouteRecordRaw,
} from "vue-router";

import NProgress from "@/utils/nprogress";
import { isLogin } from "@/utils/auth";

import router from "@/router";
import { usePermissionStore, useUserStore } from "@/store";

export function setupPermission() {
  // 白名单路由
 const whiteList = ["/login"];

  router.beforeEach(async (to, from, next) => {
        NProgress.start();
        
    if (isLogin()) {
      if (to.path === "/login") {
        // 如果已登录,跳转到首页
        next({ path: "/" });
        NProgress.done();
      } else {
        const userStore = useUserStore();
        const hasRoles =
        userStore.user.roles && userStore.user.roles.length > 0;
        if (hasRoles) {
          // 如果未匹配到任何路由,跳转到404页面
          if (to.matched.length === 0) {
            next(from.name ? { name: from.name } : "/404");
          } else {
            // 如果路由参数中有 title,覆盖路由元信息中的 title
            const title =
              (to.params.title as string) || (to.query.title as string);
            if (title) {
              to.meta.title = title;
            }
            next();
          }
        } else {
          const permissionStore = usePermissionStore();
          try {
            await userStore.getUserInfo();
            const dynamicRoutes = await permissionStore.generateRoutes();
            dynamicRoutes.forEach((route: RouteRecordRaw) =>
              router.addRoute(route)
            );
            next({ ...to, replace: true });
          } catch (error) {
            console.error(error);
            // 移除 token 并重定向到登录页,携带当前页面路由作为跳转参数
            await userStore.resetToken();
            redirectToLogin(to, next);
            NProgress.done();
          }
        }
      }
    } else {
      // 未登录
      if (whiteList.includes(to.path)) {
        // 在白名单,直接进入
        next(); 
      } else {
        // 不在白名单,重定向到登录页
        const permissionStore = usePermissionStore();
        const dynamicRoutes = await permissionStore.generateRoutes();
        dynamicRoutes.forEach((route: RouteRecordRaw) =>
          router.addRoute(route)
        );
        next(); 
        //redirectToLogin(to, next);
        NProgress.done();
      }
    }
  });

  router.afterEach(() => {
    NProgress.done();
  });
}

/** 重定向到登录页 */
function redirectToLogin(
  to: RouteLocationNormalized,
  next: NavigationGuardNext
) {
  const params = new URLSearchParams(to.query as Record<string, string>);
  const queryString = params.toString();
  const redirect = queryString ? `${to.path}?${queryString}` : to.path;
  next(`/login?redirect=${encodeURIComponent(redirect)}`);
}

/** 判断是否有权限 */
export function hasAuth(
  value: string | string[],
  type: "button" | "role" = "button"
) {
  const { roles, perms } = useUserStore().user;

  // 超级管理员 拥有所有权限
  if (type === "button" && roles.includes("ROOT")) {
    return true;
  }

  const auths = type === "button" ? perms : roles;
  return typeof value === "string"
    ? auths.includes(value)
    : value.some((perm) => auths.includes(perm));
}

3.src/store/moudles/permission 修改generateRoutes

复制代码
  /**
   * 生成动态路由
   */
  function generateRoutes() {
    return import('@/router').then(({ constantRoutes }) => {
      routes.value  = constantRoutes;
      return constantRoutes;
    });
    // return new Promise<RouteRecordRaw[]>((resolve, reject) => {
    //   MenuAPI.getRoutes()
    //     .then((data) => {
    //       const dynamicRoutes = transformRoutes(data);
    //       routes.value = constantRoutes.concat(dynamicRoutes);
    //       resolve(dynamicRoutes);
    //     })
    //     .catch((error) => {
    //       reject(error);
    //     });
    // });
  }
相关推荐
大龄码农有梦想6 小时前
Vue + BPMN.js + Camunda:搭建企业级流程设计器完整实践
javascript·vue.js·流程设计器·bpmn.js·bpmn·流程审批·工作流设计器
岁岁种桃花儿10 小时前
Vue核心语法第一篇:Vue是什么?
前端·javascript·vue.js
你挚爱的强哥11 小时前
【chromeDownload】自定义组件:多用于登录框底部提供下载Chrome谷歌浏览器的链接
前端·vue.js·chrome
daols8812 小时前
vue 甘特图 vxe-gantt 任务条拖拽自动更新日期
javascript·vue.js·甘特图
2601_9539880714 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·后端·物联网·tcp/ip·数学建模·前端框架
console.log('npc')14 小时前
大型前端项目的文档驱动协作实践:从混乱到有序
前端·前端框架
console.log('npc')15 小时前
React 19 + Vite 企业级前端项目:从零搭建到规范交付
前端·react.js·前端框架
光影少年15 小时前
react离线缓存、图片缓存方案
开发语言·前端·javascript·react native·react.js·缓存·前端框架
我命由我123451 天前
CesiumJS 笔记 - 获取容器中心点、Cartesian3 clone 方法、修改 Cartesian3 对象的高度
前端·javascript·css·前端框架·html·html5·js
java1234_小锋1 天前
Vue3专题 - 组件基础
vue.js·vite