This commit is contained in:
Your Name
2026-03-01 14:17:59 +08:00
parent 65aa12f146
commit a07e844c47
6071 changed files with 777651 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
<template>
<ElMenu class="menu" v-bind="$props" :ellipsis="true">
<div v-for="item in menu" :key="item.path">
<slot name="item" :item="item">
<MenuItem :menu-item="item" :route-path="item.path" />
</slot>
</div>
</ElMenu>
</template>
<script lang="ts" setup>
import { ElMenu, menuProps } from 'element-plus'
import { PropType } from 'vue'
import MenuItem from './menu-item.vue'
defineProps({
menu: {
type: Array as PropType<any[]>,
default: () => []
},
...menuProps
})
</script>
<style lang="scss" scoped>
.menu {
&.el-menu--horizontal {
--el-menu-item-height: 40px;
border-bottom: none;
:deep(.el-menu-item) {
span {
border-bottom: 2px solid transparent;
}
&.is-active > span {
border-color: currentColor;
}
}
}
&.el-menu--vertical:not(.el-menu--collapse) {
width: 200px;
}
}
</style>
+65
View File
@@ -0,0 +1,65 @@
<template>
<template v-if="!menuItem?.hidden">
<NuxtLink
v-if="!hasShowChild"
:to="routePath"
class="flex items-center w-full"
:custom="menuItem.type == 'custom'"
:external="isExternal(routePath)"
:target="isExternal(routePath) ? '_blank' : ''"
>
<ElMenuItem class="w-full" :index="routePath">
<template #title>
<span>
{{ menuItem.name }}
</span>
</template>
</ElMenuItem>
</NuxtLink>
<ElSubMenu v-else :index="routePath" :popper-offset="12">
<template #title>
<!-- <Icon
v-if="menuItem.icon"
class="menu-item-icon"
:size="16"
:name="menuItem.icon"
/> -->
<span>{{ menuItem.name }}</span>
</template>
<MenuItem
v-for="item in menuItem.children"
:key="resolvePath(item.path)"
:menu-item="item"
:route-path="resolvePath(item.path)"
/>
</ElSubMenu>
</template>
</template>
<script lang="ts" setup>
import { ElMenuItem, ElSubMenu } from 'element-plus'
import { getNormalPath } from '@/utils/util'
import { isExternal } from '@/utils/validate'
const props = defineProps({
menuItem: {
type: Object,
default: () => ({})
},
routePath: {
type: String,
required: true
}
})
const hasShowChild = computed(() => {
const children = props.menuItem.children ?? []
return !!children.filter((item: any) => !item?.hidden).length
})
const resolvePath = (path: string) => {
if (isExternal(path)) {
return path
}
const newPath = getNormalPath(`${props.routePath}/${path}`)
return newPath
}
</script>
<style lang="scss" scoped></style>