【pure-admin】pureadmin的登录对接后端

pureadmin的登录对接后端

在这个项目中,登录对接后端的路由主要通过以下几个部分实现:

1. 路由获取入口 - initRouter函数

登录成功后获取后端路由的核心函数是 initRouter(),它定义在:

ts:src/router/utils.ts 复制代码
function initRouter() {
  if (getConfig()?.CachingAsyncRoutes) {
    // 开启动态路由缓存本地localStorage
    const key = "async-routes";
    const asyncRouteList = storageLocal().getItem(key) as any;
    if (asyncRouteList && asyncRouteList?.length > 0) {
      return new Promise(resolve => {
        handleAsyncRoutes(asyncRouteList);
        resolve(router);
      });
    } else {
      return new Promise(resolve => {
        getAsyncRoutes().then(({ data }) => {
          handleAsyncRoutes(cloneDeep(data));
          storageLocal().setItem(key, data);
          resolve(router);
        });
      });
    }
  } else {
    return new Promise(resolve => {
      getAsyncRoutes().then(({ data }) => {
        handleAsyncRoutes(cloneDeep(data));
        resolve(router);
      });
    });
  }
}

2. 后端路由API接口定义

获取后端路由的API调用定义在:

ts:src/api/routes.ts 复制代码
export const getAsyncRoutes = () => {
  return http.request<Result>("get", "/get-async-routes");
};

这里调用了后端的 /get-async-routes 接口来获取用户有权限的路由信息。

3. 登录流程中的路由获取触发

在登录页面的登录处理函数中,当登录成功后会调用 initRouter() 函数:

ts:src/views/login/index.vue 复制代码
const onLogin = async (formEl: FormInstance | undefined) => {
  // ... 登录验证逻辑 ...
  useUserStoreHook()
    .loginByUsername({/* 登录数据 */})
    .then(res => {
      if (res.success) {
        // 获取后端路由
        return initRouter().then(() => {
          // 跳转到顶级菜单页面
          router.push(getTopMenu(true).path)
          // ... 其他处理 ...
        });
      }
    });
};

4. 后端路由处理与添加

获取到后端路由后,通过 handleAsyncRoutes() 函数进行处理并添加到路由实例中:

ts:src/router/utils.ts 复制代码
function handleAsyncRoutes(routeList) {
  if (routeList.length === 0) {
    usePermissionStoreHook().handleWholeMenus(routeList);
  } else {
    formatFlatteningRoutes(addAsyncRoutes(routeList)).map(
      (v: RouteRecordRaw) => {
        // 防止重复添加路由
        if (router.options.routes[0].children.findIndex(
            value => value.path === v.path
          ) !== -1) {
          return;
        } else {
          // 添加路由
          router.options.routes[0].children.push(v);
          ascending(router.options.routes[0].children);
          if (!router.hasRoute(v?.name)) router.addRoute(v);
          // ... 其他处理 ...
        }
      }
    );
    usePermissionStoreHook().handleWholeMenus(routeList);
  }
  // ... 其他处理 ...
}

5. 路由权限存储

处理后的路由会存储在 permission store 中,供菜单渲染和权限控制使用:

ts:src/store/modules/permission.ts 复制代码
/** 组装整体路由生成的菜单 */
handleWholeMenus(routes: any[]) {
  this.wholeMenus = filterNoPermissionTree(
    filterTree(ascending(this.constantMenus.concat(routes)))
  );
  this.flatteningRoutes = formatFlatteningRoutes(
    this.constantMenus.concat(routes) as any
  );
}

整体流程总结

  1. 用户在登录页面输入账号密码,点击登录
  2. 调用 userStore 中的 loginByUsername 方法,向后端发送登录请求
  3. 登录成功后,调用 initRouter() 函数获取后端路由
  4. initRouter() 函数通过 getAsyncRoutes() 调用后端 /get-async-routes 接口
  5. 获取到后端路由后,通过 handleAsyncRoutes() 函数处理并添加到路由实例中
  6. 最后将处理后的路由存储在 permission store 中,用于菜单渲染和权限控制
  7. 登录成功后跳转到获取的顶级菜单页面

这种设计实现了前端动态路由加载,根据用户权限显示不同的菜单和页面。

相关推荐
RuoyiOffice1 天前
SpringBoot3+Vue3 招聘 Offer:发出、审批通过、转入职怎么走完
spring boot·vue3·offer·入职·spring boot 3·hrm·招聘管理
RuoyiOffice7 天前
SpringBoot3+Vue3 最推荐的开源 OA 系统 2026:流程驱动、资源闭环、多端互通
spring boot·vue3·flowable·oa·协同办公·spring boot 3·开源oa
鱼与宇8 天前
Element-plus离线访问(适用内网)
elementui·vue3
我就是DaLing呀!10 天前
vue3 + 独立的数据管理 Store实现视频剪辑功能
前端·typescript·vue3·canvas·store
我才是银古13 天前
当 360° 全景遇上真实地图:Vue 3 实现全景-地图双向联动的工程实践
3d·vue3·360影像
XLYcmy14 天前
HTML/CSS/JS 基础与 Vue 技术栈深度解析
java·前端·css·html·vue3·vue2·api
码视野17 天前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
码视野17 天前
基于 Spring Boot + Vue3 的【高校化学实验室安全准入考试与危化品配伍排查系统】设计与实现(含PRD/三端高保真源码/大屏)
前端·人工智能·spring boot·后端·安全·vue3
fxshy17 天前
WebGIS 游戏化实践:基于 Cesium + Vue3 实现全球飞行模拟系统:从球体坐标、飞行动力学到地形碰撞实战
游戏·vue3·cesium·webgis·飞行模拟
jonyleek18 天前
技术实践:基于 Vue3 + Spring Cloud 微服务实现私有化文档系统的类 SaaS 协同体验
微服务·私有化部署·vue3·springcloud·协同编辑·jvs企业文档·无忧企业文档