go-admin-ui的菜单分割线设计思路和代码实现

在菜单管理添加分割线,类似这种:

思路:利用空间结构和数据特点来唯一区分出分割线,来划分业务区域

html 复制代码
<template>
  <div>
    <h1>Split Line Controller</h1>
    <ul>
      <li v-for="route in displayedRoutes" :key="route.path">
        {{ route.meta?.title || '' }} - {{ route.hidden ? '隐藏' : '显示' }}
        <ul v-if="filteredChildren(route).length">
          <li v-for="child in filteredChildren(route)" :key="child.path">
            ------ {{ child.meta?.title || '' }} - {{ child.hidden ? '隐藏' : '显示' }}
          </li>
        </ul>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "SplitLineController",
  data() {
    return {
      routes: [
        {
          "path": "/redirect",
          "hidden": true,
          "children": [
            {
              "path": "/redirect/:path*"
            }
          ]
        },
        {
          "path": "/login",
          "hidden": true
        },
        {
          "path": "/auth-redirect",
          "hidden": true
        },
        {
          "path": "/404",
          "hidden": true
        },
        {
          "path": "/401",
          "hidden": true
        },
        {
          "path": "/",
          "redirect": "/home-page",
          "hidden": true,
          "children": [
            {
              "path": "home-page",
              "name": "HomePage",
              "meta": {
                "title": "欢迎页",
                "icon": "home-page"
              }
            }
          ]
        },
        {
          "path": "/profile",
          "redirect": "/profile/index",
          "hidden": true,
          "children": [
            {
              "path": "index",
              "name": "Profile",
              "meta": {
                "title": "个人中心",
                "icon": "user"
              }
            }
          ]
        },
        {
          "path": "/home-page",
          "hidden": false,
          "children": [],
          "name": "HomePage",
          "meta": {
            "title": "首页",
            "icon": "home-page"
          }
        },
        {
          "path": "/permission",
          "hidden": true,
          "children": [
            {
              "path": "/permission/my-application",
              "hidden": false,
              "children": [],
              "name": "MyApplicationManage",
              "meta": {
                "title": "我的申请",
                "icon": "api-monitor"
              }
            }
          ],
          "name": "",
          "meta": {
            "title": "权限申请",
            "icon": "access"
          }
        },
        {
          "path": "",
          "hidden": false,
          "children": [],
          "name": "",
          "meta": {
            "title": "xx业务分割线1",
            "icon": ""
          }
        },
        {
          "path": "/apple",
          "hidden": false,
          "children": [
            {
              "path": "/apple/tree",
              "hidden": false,
              "children": [],
              "name": "tree",
              "meta": {
                "title": "苹果树木",
                "icon": "nested"
              }
            },
            {
              "path": "/apple/leaf",
              "hidden": false,
              "children": [],
              "name": "leaf",
              "meta": {
                "title": "苹果叶子",
                "icon": "alarm-settings"
              }
            }
          ],
          "name": "AppleContent",
          "meta": {
            "title": "苹果内容质量",
            "icon": "list"
          }
        },
        {
          "path": "/banana",
          "hidden": false,
          "children": [
            {
              "path": "/banana/tree",
              "hidden": false,
              "children": [],
              "name": "tree",
              "meta": {
                "title": "香蕉树木",
                "icon": "size"
              }
            },
            {
              "path": "/banana/leaf",
              "hidden": false,
              "children": [],
              "name": "leaf",
              "meta": {
                "title": "香蕉叶子",
                "icon": "edit"
              }
            },
          ],
          "name": "",
          "meta": {
            "title": "香蕉评级后台",
            "icon": "peoples"
          }
        },
        {
          "path": "",
          "hidden": false,
          "children": [],
          "name": "",
          "meta": {
            "title": "xx业务分割线2",
            "icon": ""
          }
        },
        {
          "path": "/cat",
          "hidden": false,
          "children": [
            {
              "path": "/cat/live",
              "hidden": false,
              "children": [],
              "name": "Live",
              "meta": {
                "title": "猫",
                "icon": "build"
              }
            },
            {
              "path": "/dog/live",
              "hidden": false,
              "children": [],
              "name": "LiveComDistributionMange",
              "meta": {
                "title": "狗",
                "icon": "api-server"
              }
            }
          ],
          "name": "",
          "meta": {
            "title": "宠物管理",
            "icon": "build"
          }
        },
        {
          "path": "",
          "hidden": false,
          "children": [],
          "name": "",
          "meta": {
            "title": "xx管理分割线3",
            "icon": ""
          }
        },
        {
          "path": "/person",
          "hidden": false,
          "children": [
            {
              "path": "/person/myself",
              "hidden": false,
              "children": [],
              "name": "SysBusinessUserManage",
              "meta": {
                "title": "我的介绍",
                "icon": "people"
              }
            }
          ],
          "name": "Admin",
          "meta": {
            "title": "系统管理",
            "icon": "api-server"
          }
        }
      ],
      displayedRoutes: []
    };
  },
  methods: {
    controlSplits(routes) {
      let displayedRoutes = JSON.parse(JSON.stringify(routes)); // 深拷贝以保持原始结构
      for (let i = 0; i < displayedRoutes.length; i++) {
        const currentRoute = displayedRoutes[i];
        if (this.isSplitLine(currentRoute)) {
          let hasVisibleSibling = false;
          for (let j = i + 1; j < displayedRoutes.length; j++) {
            const nextRoute = displayedRoutes[j];
            if (this.isSplitLine(nextRoute)) break;
            if (!nextRoute.hidden) {
              hasVisibleSibling = true;
              break;
            }
          }
          currentRoute.hidden = !hasVisibleSibling;
        }
      }
      return displayedRoutes;
    },
    isSplitLine(route) {
      return route.path === "" && !route.component && route.meta && !route.meta.icon;
    },
    filteredChildren(route) {
      if (route.children) {
        return route.children.filter(child => !child.hidden);
      }
      return [];
    }
  },
  created() {
    this.displayedRoutes = this.controlSplits(this.routes);
  }
};
</script>

<style scoped>
h1 {
  font-size: 20px;
}

ul {
  list-style-type: none;
  padding: 0;
}
</style>
相关推荐
掘金一周8 分钟前
Flutter Riverpod 3.0 发布,大规模重构下的全新状态管理框架 | 掘金一周 9.18
前端·人工智能·后端
一涯18 分钟前
页面出现空白区域
前端
spmcor43 分钟前
MinIO本地对象存储部署指南
前端
少年纪1 小时前
前端用 pdf.js 将 PDF 渲染到 Canvas 再转图片,文字消失的坑
前端
RoyLin1 小时前
TypeScript设计模式:复合模式
前端·后端·typescript
我是天龙_绍1 小时前
CSS/JS/图片全挂了,部署后页面白屏/资源加载失败?这两个配置项坑了多少人!
前端
我的小月月1 小时前
SQLFE:网页版数据库(VUE3+Node.js)
前端·后端
小高0071 小时前
🌐ES6 这 8 个隐藏外挂,知道 3 个算我输!
前端·javascript·面试
汤姆Tom1 小时前
Node.js 版本管理、NPM 命令、与 NVM 完全指南
前端·npm·node.js
Alan521591 小时前
Java 后端实现基于 JWT 的用户认证和权限校验(含代码讲解)
前端·后端