You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
4.9 KiB
184 lines
4.9 KiB
<template> |
|
<div class="menu-wrapper"> |
|
<template v-for="item in menu"> |
|
<el-menu-item v-if="validatenull(item[childrenKey]) && vaildRoles(item) && item.path.indexOf('opsVisualization') == -1" :index="item[pathKey]" |
|
@click="open(item)" :key="item[labelKey]" :class="{'is-active':vaildActive(item)}"> |
|
<!-- <i :class="item[iconKey]"></i> --> |
|
<span slot="title" :alt="item[pathKey]">{{generateTitle(item)}}</span> |
|
</el-menu-item> |
|
<!-- 单独部署监控服务时注释此代码 el-menu-item --> |
|
<el-menu-item v-if="validatenull(item[childrenKey]) && vaildRoles(item) && item.path.indexOf('opsVisualization') != -1" :index="item[pathKey]" |
|
@click="open(item)" :key="item[labelKey]" > |
|
<!-- <i :class="item[iconKey]"></i> --> |
|
<span slot="title" :alt="item[pathKey]">{{generateTitle(item)}}</span> |
|
</el-menu-item> |
|
<el-submenu v-else-if="!validatenull(item[childrenKey])&&vaildRoles(item)" :index="item[pathKey]" |
|
:key="item[labelKey]"> |
|
<template slot="title"> |
|
<!-- <i :class="item[iconKey]"></i> --> |
|
<span slot="title" :class="{'el-menu--display':collapse && first}">{{generateTitle(item)}}</span> |
|
</template> |
|
<template v-for="(child,cindex) in item[childrenKey]"> |
|
<el-menu-item :index="child[pathKey],cindex" @click="open(child)" |
|
:class="{'is-active':vaildActive(child)}" v-if="validatenull(child[childrenKey])" |
|
:key="child[labelKey]"> |
|
<i :class="child[iconKey]"></i> |
|
<span slot="title">{{generateTitle(child)}}</span> |
|
</el-menu-item> |
|
<sidebar-item v-else :menu="[child]" :key="cindex" :props="props" :screen="screen" |
|
:collapse="collapse"></sidebar-item> |
|
</template> |
|
</el-submenu> |
|
</template> |
|
</div> |
|
</template> |
|
<script> |
|
import { |
|
mapGetters |
|
} from "vuex"; |
|
import { |
|
isURL, |
|
validatenull |
|
} from "@/util/validate"; |
|
import config from "./config.js"; |
|
|
|
export default { |
|
name: "sidebarItem", |
|
data() { |
|
return { |
|
config: config |
|
}; |
|
}, |
|
props: { |
|
menu: { |
|
type: Array |
|
}, |
|
screen: { |
|
type: Number |
|
}, |
|
first: { |
|
type: Boolean, |
|
default: false |
|
}, |
|
props: { |
|
type: Object, |
|
default: () => { |
|
return {}; |
|
} |
|
}, |
|
collapse: { |
|
type: Boolean |
|
} |
|
}, |
|
created() {}, |
|
mounted() {}, |
|
computed: { |
|
...mapGetters(["roles"]), |
|
labelKey() { |
|
return this.props.label || this.config.propsDefault.label; |
|
}, |
|
pathKey() { |
|
return this.props.path || this.config.propsDefault.path; |
|
}, |
|
iconKey() { |
|
return this.props.icon || this.config.propsDefault.icon; |
|
}, |
|
childrenKey() { |
|
return this.props.children || this.config.propsDefault.children; |
|
}, |
|
isOpenKey() { |
|
return this.props.isOpen || this.config.propsDefault.isOpen; |
|
}, |
|
nowTagValue() { |
|
return this.$router.$avueRouter.getValue(this.$route); |
|
} |
|
}, |
|
methods: { |
|
generateTitle(item) { |
|
return this.$router.$avueRouter.generateTitle( |
|
item[this.labelKey], |
|
(item.meta || {}).i18n |
|
); |
|
}, |
|
vaildActive(item) { |
|
if (this.validIsOpen(item)) { |
|
return false; |
|
} |
|
const groupFlag = (item["group"] || []).some(ele => |
|
this.$route.path.includes(ele) |
|
); |
|
if(item.path == '/opsVisualization/index') return false //单独部署监控服务时注释此代码 |
|
return this.nowTagValue === item[this.pathKey] || groupFlag; |
|
}, |
|
vaildRoles(item) { |
|
item.meta = item.meta || {}; |
|
return item.meta.roles ? item.meta.roles.includes(this.roles) : true; |
|
}, |
|
validatenull(val) { |
|
return validatenull(val); |
|
}, |
|
validIsOpen(item) { |
|
if (item[this.isOpenKey] === 2 && isURL(item[this.pathKey])) { |
|
return true; |
|
} |
|
}, |
|
open(item) { |
|
if(this.menu.length == 1 && this.menu[0].name == '监控管理') return // 单独部署监控服务时注释此代码 |
|
if (this.screen <= 1) this.$store.commit("SET_COLLAPSE"); |
|
if (this.validIsOpen(item)) { |
|
window.open(item[this.pathKey]); |
|
} else { |
|
this.$router.$avueRouter.group = item.group; |
|
this.$router.$avueRouter.meta = item.meta; |
|
this.$router.push({ |
|
path: this.$router.$avueRouter.getPath({ |
|
name: item[this.labelKey], |
|
src: item[this.pathKey] |
|
}, item.meta), |
|
query: item.query |
|
}); |
|
} |
|
} |
|
} |
|
}; |
|
</script> |
|
<style lang="scss" scoped> |
|
.menu-wrapper { |
|
display: flex; |
|
} |
|
|
|
.el-submenu { |
|
width: auto; |
|
} |
|
|
|
/deep/.el-submenu__title { |
|
line-height: 55px; |
|
font-size: 20px; |
|
letter-spacing: 3px; |
|
} |
|
|
|
/deep/.el-submenu__icon-arrow { |
|
display: none; |
|
} |
|
.avue-sidebar .el-menu-item { |
|
// line-height: 55px; |
|
font-size: 20px; |
|
letter-spacing: 3px; |
|
text-align: center; |
|
} |
|
|
|
.avue-sidebar .el-menu-item.is-active { |
|
background-color: #19335D; |
|
} |
|
|
|
.avue-sidebar .el-menu-item.is-active:before { |
|
content: ''; |
|
left: 0; |
|
bottom: 0; |
|
top: auto; |
|
width: 100%; |
|
height: 3px; |
|
background: #ffffff; |
|
position: absolute; |
|
} |
|
</style>
|
|
|