forked from drone/command-center-dashboard

罗广辉
2025-04-21 2800fa4f32f3900509cb4d6eefaf2bfaf54efdd7
src/router/avue-router.js
@@ -1,171 +1,171 @@
import website from '@/config/website';
import website from '@/config/website'
const modules = import.meta.glob('../**/**/*.vue');
const modules = import.meta.glob('../**/**/*.vue')
function isURL(s) {
  return /^http[s]?:\/\/.*/.test(s);
   return /^http[s]?:\/\/.*/.test(s)
}
let RouterPlugin = function () {
  this.$router = null;
  this.$store = null;
};
   this.$router = null
   this.$store = null
}
RouterPlugin.install = function (option = {}) {
  this.$router = option.router;
  this.$store = option.store;
  let i18n = option.i18n.global;
  this.$router.$avueRouter = {
    safe: this,
    // 设置标题
    setTitle: title => {
      const defaultTitle = i18n.t('title');
      title = title ? `${title} | ${defaultTitle}` : defaultTitle;
      document.title = title;
    },
    closeTag: value => {
      let tag = value || this.$store.getters.tag;
      if (typeof value === 'string') {
        tag = this.$store.getters.tagList.find(ele => ele.fullPath === value);
      }
      this.$store.commit('DEL_TAG', tag);
    },
    generateTitle: (item, props = {}) => {
      let query = item[props.query || 'query'] || {};
      let title = query.name || item[props.label || 'label'];
      let meta = item[props.meta || 'meta'] || {};
      let key = meta.i18n;
      if (key) {
        const hasKey = i18n.te('route.' + key);
        if (hasKey) return i18n.t('route.' + key);
      }
      return title ? title.split(',')[0] : title;
    },
    //动态路由
    formatRoutes: function (aMenu = [], first) {
      const aRouter = [];
      const propsDefault = website.menu;
   this.$router = option.router
   this.$store = option.store
   let i18n = option.i18n.global
   this.$router.$avueRouter = {
      safe: this,
      // 设置标题
      setTitle: title => {
         const defaultTitle = i18n.t('title')
         title = title ? `${title} | ${defaultTitle}` : defaultTitle
         document.title = title
      },
      closeTag: value => {
         let tag = value || this.$store.getters.tag
         if (typeof value === 'string') {
            tag = this.$store.getters.tagList.find(ele => ele.fullPath === value)
         }
         this.$store.commit('DEL_TAG', tag)
      },
      generateTitle: (item, props = {}) => {
         let query = item[props.query || 'query'] || {}
         let title = query.name || item[props.label || 'label']
         let meta = item[props.meta || 'meta'] || {}
         let key = meta.i18n
         if (key) {
            const hasKey = i18n.te('route.' + key)
            if (hasKey) return i18n.t('route.' + key)
         }
         return title ? title.split(',')[0] : title
      },
      //动态路由
      formatRoutes: function (aMenu = [], first) {
         const aRouter = []
         const propsDefault = website.menu
      if (aMenu && aMenu.length === 0) return;
      for (let i = 0; i < aMenu.length; i++) {
        const oMenu = aMenu[i];
        let path = oMenu[propsDefault.path],
          isComponent = true,
          component = oMenu.component,
          name = oMenu[propsDefault.label] + ',' + oMenu.id,
          icon = oMenu[propsDefault.icon],
          children = oMenu[propsDefault.children],
          query = oMenu[propsDefault.query],
          meta = oMenu[propsDefault.meta];
        if (option.keepAlive) {
          meta.keepAlive = option.keepAlive;
        }
        const isChild = !!(children && children.length !== 0);
        const oRouter = {
          path: path,
          component: (() => {
            // 判断是否为首路由
            if (first) {
              return modules[
                option.store.getters.isMacOs || !website.setting.menu
                  ? '../page/index/layout.vue'
                  : '../page/index/index.vue'
              ];
              // 判断是否为多层路由
            } else if (isChild && !first) {
              return modules['../page/index/layout.vue'];
              // 判断是否为最终的页面视图
            } else {
              let result = modules[`../${component}.vue`];
              if (result) result().then(mod => (mod.default.name = path));
              else {
                isComponent = false;
              }
              return result;
            }
          })(),
          name,
          icon,
          meta,
          query,
          redirect: (() => {
            if (!isChild && first) return `${path}`;
            else return '';
          })(),
          // 处理是否为一级路由
          children: !isChild
            ? (() => {
                if (first) {
                  oMenu[propsDefault.path] = `${path}`;
                  let result = modules[`../${component}.vue`];
                  if (result) result().then(mod => (mod.default.name = path));
                  else {
                    isComponent = false;
                  }
                  return [
                    {
                      component: result,
                      icon: icon,
                      name: name,
                      meta: meta,
                      query: query,
                      path: '',
                    },
                  ];
                }
                return [];
              })()
            : (() => {
                return this.formatRoutes(children, false);
              })(),
        };
        if (!isURL(path) && isComponent) aRouter.push(oRouter);
      }
      if (first) {
        aRouter.forEach(ele => this.safe.$router.addRoute(ele));
      } else {
        return aRouter;
      }
    },
  };
};
         if (aMenu && aMenu.length === 0) return
         for (let i = 0; i < aMenu.length; i++) {
            const oMenu = aMenu[i]
            let path = oMenu[propsDefault.path],
               isComponent = true,
               component = oMenu.component,
               name = oMenu[propsDefault.label] + ',' + oMenu.id,
               icon = oMenu[propsDefault.icon],
               children = oMenu[propsDefault.children],
               query = oMenu[propsDefault.query],
               meta = oMenu[propsDefault.meta]
            if (option.keepAlive) {
               meta.keepAlive = option.keepAlive
            }
            const isChild = !!(children && children.length !== 0)
            const oRouter = {
               path: path,
               component: (() => {
                  // 判断是否为首路由
                  if (first) {
                     return modules[
                        option.store.getters.isMacOs || !website.setting.menu
                           ? '../page/index/layout.vue'
                           : '../page/index/index.vue'
                     ]
                     // 判断是否为多层路由
                  } else if (isChild && !first) {
                     return modules['../page/index/layout.vue']
                     // 判断是否为最终的页面视图
                  } else {
                     let result = modules[`../${component}.vue`]
                     if (result) result().then(mod => (mod.default.name = path))
                     else {
                        isComponent = false
                     }
                     return result
                  }
               })(),
               name,
               icon,
               meta,
               query,
               redirect: (() => {
                  if (!isChild && first) return `${path}`
                  else return ''
               })(),
               // 处理是否为一级路由
               children: !isChild
                  ? (() => {
                        if (first) {
                           oMenu[propsDefault.path] = `${path}`
                           let result = modules[`../${component}.vue`]
                           if (result) result().then(mod => (mod.default.name = path))
                           else {
                              isComponent = false
                           }
                           return [
                              {
                                 component: result,
                                 icon: icon,
                                 name: name,
                                 meta: meta,
                                 query: query,
                                 path: '',
                              },
                           ]
                        }
                        return []
                    })()
                  : (() => {
                        return this.formatRoutes(children, false)
                    })(),
            }
            if (!isURL(path) && isComponent) aRouter.push(oRouter)
         }
         if (first) {
            aRouter.forEach(ele => this.safe.$router.addRoute(ele))
         } else {
            return aRouter
         }
      },
   }
}
export const formatPath = (ele, first) => {
  const propsDefault = website.menu;
  const icon = ele[propsDefault.icon];
  ele[propsDefault.icon] = !icon ? propsDefault.iconDefault : icon;
  ele.meta = {
    keepAlive: ele.isOpen === 2,
  };
  const iframeComponent = 'components/iframe/main';
  const iframeSrc = href => {
    return href.replace(/&/g, '#');
  };
  const isChild = !!(ele[propsDefault.children] && ele[propsDefault.children].length !== 0);
  if (!isChild && first) {
    ele.component = 'views' + ele[propsDefault.path];
    if (isURL(ele[propsDefault.href])) {
      let href = ele[propsDefault.href];
      ele.component = iframeComponent;
      ele[propsDefault.query] = {
        url: iframeSrc(href),
      };
    }
  } else {
    ele[propsDefault.children] &&
      ele[propsDefault.children].forEach(child => {
        child.component = 'views' + child[propsDefault.path];
        child.meta = {
          keepAlive: child.isOpen === 2,
        };
        if (isURL(child[propsDefault.href])) {
          let href = child[propsDefault.href];
          child[propsDefault.path] = ele[propsDefault.path] + '/' + child.code;
          child.component = iframeComponent;
          child[propsDefault.query] = {
            url: iframeSrc(href),
          };
        }
        formatPath(child);
      });
  }
};
export default RouterPlugin;
   const propsDefault = website.menu
   const icon = ele[propsDefault.icon]
   ele[propsDefault.icon] = !icon ? propsDefault.iconDefault : icon
   ele.meta = {
      keepAlive: ele.isOpen === 2,
   }
   const iframeComponent = 'components/iframe/main'
   const iframeSrc = href => {
      return href.replace(/&/g, '#')
   }
   const isChild = !!(ele[propsDefault.children] && ele[propsDefault.children].length !== 0)
   if (!isChild && first) {
      ele.component = 'views' + ele[propsDefault.path]
      if (isURL(ele[propsDefault.href])) {
         let href = ele[propsDefault.href]
         ele.component = iframeComponent
         ele[propsDefault.query] = {
            url: iframeSrc(href),
         }
      }
   } else {
      ele[propsDefault.children] &&
         ele[propsDefault.children].forEach(child => {
            child.component = 'views' + child[propsDefault.path]
            child.meta = {
               keepAlive: child.isOpen === 2,
            }
            if (isURL(child[propsDefault.href])) {
               let href = child[propsDefault.href]
               child[propsDefault.path] = ele[propsDefault.path] + '/' + child.code
               child.component = iframeComponent
               child[propsDefault.query] = {
                  url: iframeSrc(href),
               }
            }
            formatPath(child)
         })
   }
}
export default RouterPlugin