Blame view

稻城亚丁小程序/admin-web/src/components/SideMenuItem.vue 1.58 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  <template>
    <template v-if="item.type === 1 && item.children?.length">
      <el-sub-menu :index="String(item.id)">
        <template #title>
          <el-icon class="menu-ico"><component :is="iconComp" /></el-icon>
          <span>{{ item.name }}</span>
        </template>
        <SideMenuItem v-for="ch in item.children" :key="ch.id" :item="ch" />
      </el-sub-menu>
    </template>
    <el-menu-item v-else-if="item.path && item.type === 2" :index="item.path">
      <el-icon class="menu-ico"><component :is="iconComp" /></el-icon>
      <span>{{ item.name }}</span>
    </el-menu-item>
    <el-sub-menu v-else-if="item.children?.length" :index="String(item.id)">
      <template #title>
        <span>{{ item.name }}</span>
      </template>
      <SideMenuItem v-for="ch in item.children" :key="ch.id" :item="ch" />
    </el-sub-menu>
  </template>
  
  <script setup lang="ts">
  import { computed } from "vue";
  import type { MenuNode } from "@/api/admin";
  import {
    Menu,
    User,
    Setting,
    Odometer,
    Document,
    Picture,
    UserFilled,
    PictureFilled,
    MapLocation,
    CircleCheck,
    Avatar,
  } from "@element-plus/icons-vue";
  
  const props = defineProps<{ item: MenuNode }>();
  
  const iconMap: Record<string, typeof Menu> = {
    setting: Setting,
    user: User,
    team: UserFilled,
    menu: Menu,
    picture: Picture,
    image: PictureFilled,
    audit: CircleCheck,
    map: MapLocation,
    odometer: Odometer,
    document: Document,
    avatar: Avatar,
  };
  
  const iconComp = computed(() => {
    const key = (props.item.icon || "").toLowerCase();
    return iconMap[key] || Document;
  });
  </script>
  
  <style scoped>
  .menu-ico {
    margin-right: 8px;
  }
  </style>