尾部导航

This commit is contained in:
cxc
2022-11-17 17:30:20 +08:00
parent d2163317fe
commit 51e6e7c5cc
22 changed files with 644 additions and 442 deletions

View File

@ -1,98 +1,156 @@
<template>
<div v-if="!item.hidden">
<template v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow">
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)">
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
<svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"/>
<template #title><span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span></template>
</el-menu-item>
</app-link>
</template>
<el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
<template v-if="item.meta" #title>
<svg-icon :icon-class="item.meta && item.meta.icon" />
<span class="menu-title" :title="hasTitle(item.meta.title)">{{ item.meta.title }}</span>
<el-badge
v-if="!item.hidden"
:hidden="
![`/approval/list`, `/approval/dataList/approval`].includes(basePath)
"
:value="getCount(basePath)"
class="count-badge"
>
<!-- <template #default>
<div>231</div>
</template> -->
<div>
<template
v-if="
hasOneShowingChild(item.children, item) &&
(!onlyOneChild.children || onlyOneChild.noShowingChildren) &&
!item.alwaysShow
"
>
<app-link
v-if="onlyOneChild.meta"
:to="resolvePath(onlyOneChild.path, onlyOneChild.query)"
>
<el-menu-item
:index="resolvePath(onlyOneChild.path)"
:class="{ 'submenu-title-noDropdown': !isNest }"
>
<svg-icon
:icon-class="
onlyOneChild.meta.icon || (item.meta && item.meta.icon)
"
/>
<template #title
><span
class="menu-title"
:title="hasTitle(onlyOneChild.meta.title)"
>{{ onlyOneChild.meta.title }}</span
></template
>
</el-menu-item>
</app-link>
</template>
<sidebar-item
v-for="child in item.children"
:key="child.path"
:is-nest="true"
:item="child"
:base-path="resolvePath(child.path)"
class="nest-menu"
/>
</el-sub-menu>
</div>
<el-sub-menu
v-else
ref="subMenu"
:index="resolvePath(item.path)"
popper-append-to-body
>
<template v-if="item.meta" #title>
<svg-icon :icon-class="item.meta && item.meta.icon" />
<span class="menu-title" :title="hasTitle(item.meta.title)">{{
item.meta.title
}}</span>
</template>
<sidebar-item
v-for="child in item.children"
:key="child.path"
:is-nest="true"
:item="child"
:base-path="resolvePath(child.path)"
class="nest-menu"
/>
</el-sub-menu>
</div>
</el-badge>
</template>
<script setup>
import { isExternal } from '@/utils/validate'
import AppLink from './Link'
import { getNormalPath } from '@/utils/ruoyi'
import { isExternal } from "@/utils/validate";
import AppLink from "./Link";
import { getNormalPath } from "@/utils/ruoyi";
import useUserStore from "@/store/modules/user";
const props = defineProps({
// route object
item: {
type: Object,
required: true
required: true,
},
isNest: {
type: Boolean,
default: false
default: false,
},
basePath: {
type: String,
default: ''
}
})
default: "",
},
});
// console.log(props.basePath);
// const userStore = useUserStore();
const onlyOneChild = ref({});
const userStore = useUserStore();
const getCount = (basePath) => {
console.log(basePath);
if (basePath == "/approval/list") {
return userStore.unApprovedBusiness;
} else if (props.basePath == "/approval/dataList/approval") {
return userStore.unApprovedExpert;
} else {
return 0;
}
};
function hasOneShowingChild(children = [], parent) {
if (!children) {
children = [];
}
const showingChildren = children.filter(item => {
const showingChildren = children.filter((item) => {
if (item.hidden) {
return false
return false;
} else {
// Temp set(will be used if only has one showing child)
onlyOneChild.value = item
return true
onlyOneChild.value = item;
return true;
}
})
});
// When there is only one child router, the child router is displayed by default
if (showingChildren.length === 1) {
return true
return true;
}
// Show parent if there are no child router to display
if (showingChildren.length === 0) {
onlyOneChild.value = { ...parent, path: '', noShowingChildren: true }
return true
onlyOneChild.value = { ...parent, path: "", noShowingChildren: true };
return true;
}
return false
};
return false;
}
function resolvePath(routePath, routeQuery) {
if (isExternal(routePath)) {
return routePath
return routePath;
}
if (isExternal(props.basePath)) {
return props.basePath
return props.basePath;
}
if (routeQuery) {
let query = JSON.parse(routeQuery);
return { path: getNormalPath(props.basePath + '/' + routePath), query: query }
return {
path: getNormalPath(props.basePath + "/" + routePath),
query: query,
};
}
return getNormalPath(props.basePath + '/' + routePath)
return getNormalPath(props.basePath + "/" + routePath);
}
function hasTitle(title){
function hasTitle(title) {
if (title.length > 5) {
return title;
} else {
@ -100,3 +158,13 @@ function hasTitle(title){
}
}
</script>
<style lang="scss">
.count-badge {
width: 100%;
.el-badge__content {
// margin-right: 20px;
top: 8px !important;
right: 36px !important;
}
}
</style>