当前位置:首页 > 技术 > 正文内容

权限控制与布局组件的实现

访客 技术 2026年6月15日 1

最近在学习vue-element-admin时,重点研究了权限控制与布局组件的结合实现。

侧边栏组件(Sidebar)

项目中使用了基于Element UI的NavMenu实现侧边栏。核心组件包括:

  • index.vue:负责初始化菜单结构
  • SidebarItem.vue:处理路由的递归渲染
  • Link.vue:处理链接跳转逻辑

侧边栏初始化

在index.vue中,主要实现如下:

<template>
  <div class="sidebar-container">
    <el-scrollbar>
      <el-menu
        :default-active="activeMenu"
        :collapse="isCollapse"
        mode="vertical"
      >
        <menu-item
          v-for="route in routes"
          :key="route.path"
          :item="route"
          :base-path="route.path"
        />
      </el-menu>
    </el-scrollbar>
  </div>
</template>

<script>
import MenuItems from './SidebarItem'

export default {
  components: {
    MenuItems
  },
  computed: {
    activeMenu() {
      return this.$route.path
    },
    routes() {
      return this.$store.state.routes
    },
    isCollapse() {
      return this.$store.state.isCollapse
    }
  }
}
</script>

菜单项渲染

SidebarItem.vue通过递归方式渲染菜单结构:

<template>
  <div v-if="!item.hidden">
    <template v-if="hasOneChild(item.children) && !item.alwaysShow">
      <app-link :to="resolvePath(onlyOneChild.path)">
        <el-menu-item :index="resolvePath(onlyOneChild.path)">
          <item :icon="onlyOneChild.icon" :title="onlyOneChild.title" />
        </el-menu-item>
      </app-link>
    </template>
    <el-submenu v-else :index="resolvePath(item.path)">
      <template slot="title">
        <item :icon="item.icon" :title="item.title" />
      </template>
      <menu-item
        v-for="child in item.children"
        :key="child.path"
        :item="child"
        :base-path="resolvePath(child.path)"
      />
    </el-submenu>
  </div>
</template>

<script>
import path from 'path'
import Item from './Item'
import AppLink from './Link'

export default {
  name: 'MenuItem',
  components: { Item, AppLink },
  props: {
    item: {
      type: Object,
      required: true
    },
    basePath: {
      type: String,
      default: ''
    }
  },
  data() {
    this.onlyOneChild = null
    return {}
  },
  methods: {
    hasOneChild(children = []) {
      const showingChildren = children.filter(item => !item.hidden)
      if (showingChildren.length === 1) {
        this.onlyOneChild = showingChildren[0]
        return true
      }
      return false
    },
    resolvePath(routePath) {
      return path.resolve(this.basePath, routePath)
    }
  }
}
</script>

权限加载问题

在测试中发现首次登录后菜单未加载的问题,经过排查发现是由于权限逻辑的初始化顺序问题。通过调整登录流程中的权限处理代码,问题得以解决。

submitlogin({ commit }, payload) {
  const { username, password } = payload
  return new Promise((resolve, reject) => {
    login(username.trim(), password)
      .then(response => {
        if (response.data.token != "error") {
          commit('SET_TOKEN', response.data.token)
          commit('SET_NAME', response.data.name)
          setToken(response.data.token)
          resolve()
          router.push('/')
        } else {
          console.log(response.data.token)
          resolve()
          router.push('/404')
        }
      })
      .catch(error => {
        reject(error)
      })
  })
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。