记录pure admin 使用

  • Post author:
  • Post category:其他




左侧路由只有一个子菜单时显示父菜单

这个没有配置需要自己改

layout->components->sidebar->sidbarItem

搜索这行,将返回改为false就可以了

if (showingChildren.length === 1) 



请求怎么携带formdata

export const addReq = (campusId, formdataV) => {
  const formdata = new FormData();
  formdata.append("file", formdataV);
  return http.request("post", `/AdminArticleBorrow/${campusId}`, {
    data: formdata
  });
};



路由根据权限的管理

一般路由权限是两种方式,一种后台过滤好返回的,一种前端有全部的路由根据后台的角色来过滤,我这里是第二种方式。

我这里是更改的asncRouters.ts,更改为下面这种结构

{
    path: "/inside",
    name: "inside",
    alwaysShow: true,
    // redirect: "/WeiXin/toilet/index",
    meta: {
      // icon: icons.WeiXinY,
      title: "班内管理",
      rank: 4,
      roles: ["任课教师", "副班主任", "校班主任"]
    },
    children: [
      {
        path: "/inside/Class/index",
        name: "insidelClass",
        meta: {
          activeMenu: "/inside",

          title: "班级管理",
          roles: ["校班主任"]
        }
      },
      {
        path: "/Article/Book/index",
        name: "ArticleBook",
        meta: {
          activeMenu: "/Article",

          title: "推荐书目",
          roles: ["校班主任", "副班主任", "任课教师"]
        }
      }
    ]
  },

然后找到router>utils.ts里面的initRouter,这个是初始化路由的方法,开始改造

新建一个是否拥有角色的方法

function hasRole(route, roles) {
  if (route.meta && route.meta.roles) {
    return roles.some(item => route.meta.roles.includes(item));
  } else {
    return false;
  }
}

新建一个过滤路由的方法

// 过滤路由
function filterRouters(routers, role) {
  const filterRouterArr = [];
  routers.forEach(item => {
    const tmp = { ...item };
    if (hasRole(item, role)) {
      if (tmp.children) {
        tmp.children = filterRouters(tmp.children, role);
      }
      filterRouterArr.push(tmp);
    }
  });
  return filterRouterArr;
}

找到initRouter,我这是把和原来的稍微改了一点,逻辑并没变,将原来的路由数组变为我过滤后的

const info = filterRouters(acyncRoutes, getUserInfo().permission);
    router.options.routes[0].redirect = info[0].children[0].path;
    if (info.length === 0) {
      usePermissionStoreHook().changeSetting(info);
    } else {
      formatFlatteningRoutes(addAsyncRoutes(info)).map((v: RouteRecordRaw) => {
        // 防止重复添加路由
        if (
          router.options.routes[0].children.findIndex(
            value => value.path === v.path
          ) !== -1
        ) {
          return;
        } else {
          // 切记将路由push到routes后还需要使用addRoute,这样路由才能正常跳转
          router.options.routes[0].children.push(v);
          // 最终路由进行升序;
          ascending(router.options.routes[0].children);
          if (!router.hasRoute(v?.name)) router.addRoute(v);
          const flattenRouters: any = router
            .getRoutes()
            .find(n => n.path === "/");
          router.addRoute(flattenRouters);
        }
        resolve(router);
      });
      usePermissionStoreHook().changeSetting(info);
    }
    addPathMatch();
    console.log(router);



设置不同的角色跳转不同的首页

我这里是在拦截器加了一层判断

router>index.ts,在router.beforeEach最下面加一层,path为你想要跳转的path,这里的顺序其实就是角色的优先级,假如用户拥有多个角色,就会优先选择第一个。

if (_from.path == "/login" && to.path == "/") {
    const roleTxt = JSON.stringify(getUserInfo().permission);
    const roles = [
      {
        role: "校管理员",
        path: ""
      },
      {
        role: "校班主任",
        path: ""
      },
      {
        role: "副班主任",
        path: ""
      },
      {
        role: "任课教师",
        path: ""
      }
    ];
    for (const item of roles) {
      if (roleTxt.includes(item.role)) {
        routes[0].redirect = item.path;
        router.replace(routes[0].redirect);
        return;
      }
    }
  }



版权声明:本文为qq_43371595原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。