123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- import auth from "/src/plugins/auth";
- import router, { constantRoutes, dynamicRoutes } from "/src/router";
- import { getRouters } from "/src/api/menu";
- import Layout from "/src/layout/index";
- import ParentView from "/src/components/ParentView";
- import InnerLink from "/src/layout/components/InnerLink";
- // 匹配views里面所有的.vue文件
- const modules = import.meta.glob("./../../views/**/*.vue");
- const usePermissionStore = defineStore("permission_sd", {
- state: () => ({
- routes: [],
- addRoutes: [],
- defaultRoutes: [],
- topbarRouters: [],
- sidebarRouters: [],
- }),
- actions: {
- setRoutes(routes) {
- this.addRoutes = routes;
- this.routes = constantRoutes.concat(routes);
- },
- setDefaultRoutes(routes) {
- this.defaultRoutes = constantRoutes.concat(routes);
- },
- setTopbarRoutes(routes) {
- this.topbarRouters = routes;
- },
- setSidebarRouters(routes) {
- this.sidebarRouters = routes;
- },
- generateRoutes(roles) {
- return new Promise((resolve) => {
- // 向后端请求路由数据
- getRouters().then((res) => {
- if (roles.user.userId === "1699598709941104641") {
- res.data[0].children[7].children = res.data[0].children[7].children.concat([
- {
- type: 1,
- name: "Distribution-of-goods",
- path: "distribution-of-goods",
- hidden: false,
- component: "group/data-board/distribution-of-goods/index",
- meta: {
- title: "配货看板",
- icon: "#",
- noCache: false,
- link: null,
- },
- },
- {
- type: 1,
- name: "Daily-board",
- path: "daily-board",
- hidden: false,
- component: "group/data-board/daily-board/index",
- meta: {
- title: "每日看板",
- icon: "#",
- noCache: false,
- link: null,
- },
- },
- {
- type: 1,
- name: "Bom-quoted-price",
- path: "bom-quoted-price",
- hidden: false,
- component: "group/data-board/quoted-price/index",
- meta: {
- title: "BOM报价看板",
- icon: "#",
- noCache: false,
- link: null,
- },
- },
- {
- type: 1,
- name: "Sku-quoted-price",
- path: "sku-quoted-price",
- hidden: false,
- component: "group/data-board/sku-quoted-price/index",
- meta: {
- title: "SKU报价看板",
- icon: "#",
- noCache: false,
- link: null,
- },
- },
- {
- type: 1,
- name: "Turnover-rate",
- path: "turnover-rate",
- hidden: false,
- component: "group/data-board/turnover-rate/index",
- meta: {
- title: "周转率",
- icon: "#",
- noCache: false,
- link: null,
- },
- },
- {
- type: 1,
- name: "Subsidiary-sales-volume",
- path: "subsidiary-sales-volume",
- hidden: false,
- component: "group/data-board/subsidiary-sales-volume/index",
- meta: {
- title: "事业部销量看板",
- icon: "#",
- noCache: false,
- link: null,
- },
- },
- {
- type: 1,
- name: "Safety-stock",
- path: "safety-stock",
- hidden: false,
- component: "group/data-board/safety-stock/index",
- meta: {
- title: "成品安全库存看板",
- icon: "#",
- noCache: false,
- link: null,
- },
- },
- {
- type: 1,
- name: "Sales-volume",
- path: "sales-volume",
- hidden: false,
- component: "group/data-board/sales-volume/index",
- meta: {
- title: "三十天销量看板",
- icon: "#",
- noCache: false,
- link: null,
- },
- },
- {
- type: 1,
- name: "Calculator",
- path: "calculator",
- hidden: false,
- component: "group/BOM/calculator/index",
- meta: {
- title: "裸垫价格计算器",
- icon: "#",
- noCache: false,
- link: null,
- },
- },
- ]);
- }
- const sdata = JSON.parse(JSON.stringify(res.data));
- const rdata = JSON.parse(JSON.stringify(res.data));
- const defaultData = JSON.parse(JSON.stringify(res.data));
- const sidebarRoutes = filterAsyncRouter(sdata);
- const rewriteRoutes = filterAsyncRouter(rdata, false, true);
- const defaultRoutes = filterAsyncRouter(defaultData);
- const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
- asyncRoutes.forEach((route) => {
- router.addRoute(route);
- });
- this.setRoutes(rewriteRoutes);
- this.setSidebarRouters(constantRoutes.concat(sidebarRoutes));
- this.setDefaultRoutes(sidebarRoutes);
- this.setTopbarRoutes(defaultRoutes);
- resolve(rewriteRoutes);
- });
- });
- },
- },
- });
- // 遍历后台传来的路由字符串,转换为组件对象
- function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
- return asyncRouterMap.filter((route) => {
- if (type && route.children) {
- route.children = filterChildren(route.children);
- }
- if (route.component) {
- // Layout ParentView 组件特殊处理
- if (route.component === "Layout") {
- route.component = Layout;
- } else if (route.component === "ParentView") {
- route.component = ParentView;
- } else if (route.component === "InnerLink") {
- route.component = InnerLink;
- } else {
- route.component = loadView(route.component);
- }
- }
- if (route.children != null && route.children && route.children.length) {
- route.children = filterAsyncRouter(route.children, route, type);
- } else {
- delete route["children"];
- delete route["redirect"];
- }
- return true;
- });
- }
- function filterChildren(childrenMap, lastRouter = false) {
- var children = [];
- childrenMap.forEach((el, index) => {
- if (el.children && el.children.length) {
- if (el.component === "ParentView" && !lastRouter) {
- el.children.forEach((c) => {
- c.path = el.path + "/" + c.path;
- if (c.children && c.children.length) {
- children = children.concat(filterChildren(c.children, c));
- return;
- }
- children.push(c);
- });
- return;
- }
- }
- if (lastRouter) {
- el.path = lastRouter.path + "/" + el.path;
- }
- children = children.concat(el);
- });
- return children;
- }
- // 动态路由遍历,验证是否具备权限
- export function filterDynamicRoutes(routes) {
- const res = [];
- routes.forEach((route) => {
- if (route.permissions) {
- if (auth.hasPermiOr(route.permissions)) {
- res.push(route);
- }
- } else if (route.roles) {
- if (auth.hasRoleOr(route.roles)) {
- res.push(route);
- }
- }
- });
- return res;
- }
- export const loadView = (view) => {
- let res;
- for (const path in modules) {
- const dir = path.split("views/")[1].split(".vue")[0];
- if (dir === view) {
- res = () => modules[path]();
- }
- }
- return res;
- };
- export default usePermissionStore;
|