wangting
2024-05-14 51636e9cd814bddba7a9b4ff21b5bc94e95fb6cb
Source/ProjectWeb/src/router/avue-router.js
@@ -1,3 +1,5 @@
import {validatenull} from "@/util/validate";
let RouterPlugin = function () {
  this.$router = null;
  this.$store = null;
@@ -6,7 +8,7 @@
RouterPlugin.install = function (vue, option = {}) {
  this.$router = option.router;
  this.$store = option.store;
  this.$vue = new vue({ i18n: option.i18n });
  this.$vue = new vue({i18n: option.i18n});
  // 这个的作用是 为了检查出网页链接,因为本项目用到了 iframe
  function isURL(s) {
@@ -85,20 +87,20 @@
    },
    //动态路由
    // 路由是专门的一个接口获取
      /**
       * aMenu: 接受到的动态路由数据 menu的结构外层有父级path 里面有一个childen 记录页面的路由
       * first: 为了区分外界 调用formatRoutes 和 当前文件调用 formatRoutes
      */
    /**
     * aMenu: 接受到的动态路由数据 menu的结构外层有父级path 里面有一个childen 记录页面的路由
     * first: 为了区分外界 调用formatRoutes 和 当前文件调用 formatRoutes
     */
    formatRoutes: function (aMenu = [], first) {
      // window.console.log('aMenu')
      // window.console.log(aMenu)
      const aRouter = []
      // 获取到全局配置中的 props
      const propsConfig = this.$website.menu.props;
      // 设置 props默认值 作用就是将字段设置成配置的
      const propsDefault = {
        label: propsConfig.label || 'name',
        path: propsConfig.path || 'path',
        path: 'code',
        code: 'code',
        pathValue: 'pathValue',
        icon: propsConfig.icon || 'icon',
        children: propsConfig.children || 'children',
        meta: propsConfig.meta || 'meta',
@@ -111,20 +113,44 @@
        const oMenu = aMenu[i];
        // 这一块的赋值 也就是取到返回的值
        let path = (() => {
            if (first) {
              // 将 '/index' 替换为 ''
              return oMenu[propsDefault.path].replace('/index', '')
            } else {
              return oMenu[propsDefault.path]
            }
          })(),
          //特殊处理组件 执行完这个 component 也就是精确到具体的文件了  views文件夹下面就是具体的页面代码
          component = 'views' + oMenu.path,
          name = oMenu[propsDefault.label],
          if (first) {
            // 将 '/index' 替换为 ''
            return oMenu[propsDefault.pathValue].replace('/index', '')
          } else {
            return oMenu[propsDefault.pathValue]
          }
        })();
        let code = (() => {
          return oMenu[propsDefault.code]
        })();
        let component = '';
        let parts = '';
        // 如果路径中存在 '?',则取问号前面部分给 parts
        if (path.includes('?')) {
          parts = path.split("?")[0];
        } else {
          parts = path; // 不存在 '?' 整条路径就是 parts
        }
        if(validatenull(parts)){
          parts='UI';
        }
        // 如果问号前面部分不在 ['ui', 'UI', 'base'] 中,则是自定义组件
        if (!['ui', 'UI', 'base','bs'].includes(parts) && parts.indexOf('views/')==-1) {
          component = `views/custom-ui/${parts}`;
        }else if (['UI', 'ui', 'base','bs'].includes(parts)) {
          // 如果问号前面等于 UI、ui 则为UI引擎
          component = 'views/base/UIContentViewer';
        }else{
          component = `${parts}`;
        }
        let name = oMenu[propsDefault.label],
          icon = oMenu[propsDefault.icon],
          children = oMenu[propsDefault.children],
          meta = oMenu[propsDefault.meta] || {};
          // meta中 keepalive 的处理
        // meta中 keepalive 的处理
        meta = Object.assign(meta, (function () {
          if (option.keepAlive === true) {
            return {
@@ -135,7 +161,7 @@
        //是否有子路由
        const isChild = children.length !== 0;
        const oRouter = {
          path: path,
          path: '/' + code,
          component(resolve) {
            // 判断是否为首路由
            if (first) {
@@ -163,7 +189,7 @@
          children: !isChild ? (() => {
            if (first) {
              // 这里的isURL判断,因为这个网站有使用 iframe。所以需要判断是否为网页链接
              if (!isURL(path)) oMenu[propsDefault.path] = `${path}/index`;
              if (!isURL(path)) oMenu[propsDefault.pathValue] = `${path}/index`;
              return [{
                component(resolve) {
                  require([`../${component}.vue`], resolve)
@@ -179,7 +205,7 @@
            /**
             * 这里是重点,当有子路由的时候 会再去执行 formatRoutes 方法,然后又会有一个新的 aMenu for循环。
             * 最后返回的是一个数组 aRouter 这个数组就会作为 childen的值被 return
            */
             */
            return this.formatRoutes(children, false)
          })()
        }