parent
af3024964a
commit
f50a85b49b
3 changed files with 128 additions and 7 deletions
@ -0,0 +1,108 @@ |
|||||||
|
<template> |
||||||
|
<template v-for="item in menu"> |
||||||
|
<el-menu-item v-if="validatenull(item[childrenKey]) && validRoles(item)" :index="getPath(item)" @click="open(item)" |
||||||
|
:key="item[labelKey]"> |
||||||
|
<i>{{ getTitle(item) }}</i> |
||||||
|
<template #title> |
||||||
|
<span :alt="item[pathKey]">{{ getTitle(item) }}</span> |
||||||
|
</template> |
||||||
|
</el-menu-item> |
||||||
|
<el-sub-menu v-else-if="!validatenull(item[childrenKey]) && validRoles(item)" :index="getPath(item)" |
||||||
|
:key="item[labelKey]"> |
||||||
|
<template #title> |
||||||
|
<i>{{ getTitle(item) }}</i> |
||||||
|
</template> |
||||||
|
<template v-for="(child, cindex) in item[childrenKey]" :key="child[labelKey]"> |
||||||
|
<el-menu-item :index="getPath(child)" @click="open(child)" v-if="validatenull(child[childrenKey])"> |
||||||
|
<i>{{ getTitle(child) }}</i> |
||||||
|
<template #title> |
||||||
|
<span>{{ getTitle(child) }}</span> |
||||||
|
</template> |
||||||
|
</el-menu-item> |
||||||
|
<sidebar-item v-else :menu="[child]" :key="cindex"></sidebar-item> |
||||||
|
</template> |
||||||
|
</el-sub-menu> |
||||||
|
</template> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
import { mapGetters } from 'vuex'; |
||||||
|
import { validatenull } from 'utils/validate'; |
||||||
|
import website from '@/config/website'; |
||||||
|
|
||||||
|
export default { |
||||||
|
name: 'sidebarItem', |
||||||
|
data() { |
||||||
|
return { |
||||||
|
props: website.menu, |
||||||
|
}; |
||||||
|
}, |
||||||
|
props: { |
||||||
|
menu: Array, |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
...mapGetters(['roles']), |
||||||
|
labelKey() { |
||||||
|
return this.props.label; |
||||||
|
}, |
||||||
|
pathKey() { |
||||||
|
return this.props.path; |
||||||
|
}, |
||||||
|
queryKey() { |
||||||
|
return this.props.query; |
||||||
|
}, |
||||||
|
iconKey() { |
||||||
|
return this.props.icon; |
||||||
|
}, |
||||||
|
childrenKey() { |
||||||
|
return this.props.children; |
||||||
|
}, |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
validatenull, |
||||||
|
getPath(item) { |
||||||
|
return item[this.pathKey]; |
||||||
|
}, |
||||||
|
getTitle(item) { |
||||||
|
return this.$router.$avueRouter.generateTitle(item, this.props); |
||||||
|
}, |
||||||
|
validRoles(item) { |
||||||
|
item.meta = item.meta || {}; |
||||||
|
return item.meta.roles ? item.meta.roles.includes(this.roles) : true; |
||||||
|
}, |
||||||
|
open(item) { |
||||||
|
this.$router.push({ |
||||||
|
path: item[this.pathKey], |
||||||
|
query: item[this.queryKey], |
||||||
|
}); |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
i { |
||||||
|
font-style: normal; |
||||||
|
} |
||||||
|
|
||||||
|
.el-menu--collapse>.el-menu-item-group>ul>.el-sub-menu>.el-sub-menu__title>span, |
||||||
|
.el-menu--collapse>.el-menu-item>span, |
||||||
|
.el-menu--collapse>.el-sub-menu>.el-sub-menu__title>span { |
||||||
|
overflow: visible; |
||||||
|
; |
||||||
|
visibility: visible; |
||||||
|
display: block; |
||||||
|
} |
||||||
|
.el-menu-item{ |
||||||
|
line-height:50px; |
||||||
|
height: 50px; |
||||||
|
} |
||||||
|
.el-menu-item .el-menu-tooltip__trigger{ |
||||||
|
line-height:50px; |
||||||
|
height: 50px; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
</style> |
||||||
|
<style> |
||||||
|
|
||||||
|
</style> |
||||||
Loading…
Reference in new issue