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.
292 lines
7.6 KiB
292 lines
7.6 KiB
<template>
|
|
<div class="menuCantent">
|
|
<n-menu
|
|
ref="menuInstRef"
|
|
class="menu"
|
|
:indent="0"
|
|
:options="menuOptions"
|
|
v-model:value="selectedKey"
|
|
key-field="deptId"
|
|
label-field="deptName"
|
|
:default-expand-all="false"
|
|
:watch-props="['defaultExpandedKeys']"
|
|
:render-label="renderMenuLabel"
|
|
@update:value="menuUpdateValue"
|
|
/>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { useRoute } from 'vue-router';
|
|
import type { MenuOption } from 'naive-ui';
|
|
// import { NEllipsis } from 'naive-ui';
|
|
import { getMenu } from '@/api/table/list';
|
|
import { getMenuData } from '@/api/device/index';
|
|
import { getFirstNodeLastLevel } from '@/utils/index';
|
|
import useStorage from '@/utils/useStorage';
|
|
import mitt from '@/plugins/bus';
|
|
const router = useRoute();
|
|
const menuOptions = ref([]);
|
|
const selectedKey = ref();
|
|
const sessionStorageIns = useStorage('sessionStorage');
|
|
const routerType = ref('');
|
|
const id = ref(0);
|
|
const deptId = ref(0);
|
|
const menuDeptKey = ref(0);
|
|
const menuIdKey = ref(0);
|
|
|
|
const emit = defineEmits(['tableMenuData']);
|
|
|
|
const props = defineProps({
|
|
menuType: {
|
|
type: String,
|
|
default: '1'
|
|
}
|
|
});
|
|
|
|
onMounted(() => {
|
|
routerType.value = router.query?.id === undefined ? '0' : '1';
|
|
id.value = sessionStorage.getItem('id') === null ? 0 : Number(sessionStorage.getItem('id'));
|
|
deptId.value = sessionStorage.getItem('deptId') === null ? 0 : Number(sessionStorage.getItem('deptId'));
|
|
if (props.menuType === '1') {
|
|
menuApi();
|
|
} else if (props.menuType === '2') {
|
|
comMenuApi();
|
|
}
|
|
});
|
|
|
|
function menuApi() {
|
|
//获取表格左侧菜单
|
|
getMenu().then((res: any) => {
|
|
if (res.code === 200) {
|
|
menuDeptKey.value =
|
|
routerType.value === '1'
|
|
? deptId.value
|
|
: routerType.value === '0' && deptId.value != 0
|
|
? deptId.value
|
|
: getFirstNodeLastLevel(res.data).deptId;
|
|
removeChildren(res.data);
|
|
menuOptions.value = res.data;
|
|
selectedKey.value = menuDeptKey.value;
|
|
sessionStorageIns.setUseStorage('deptId', menuDeptKey.value);
|
|
mitt.emit('menuMockKeys', menuDeptKey.value);
|
|
emit('tableMenuData', res.data);
|
|
}
|
|
});
|
|
}
|
|
function comMenuApi() {
|
|
//获取组态左侧菜单
|
|
getMenuData().then((res: any) => {
|
|
if (res.code === 200) {
|
|
menuIdKey.value =
|
|
routerType.value === '1'
|
|
? id.value
|
|
: routerType.value === '0' && id.value != 0
|
|
? id.value
|
|
: getFirstNodeLastLevel(res.data).deptId;
|
|
const parentId = routerType.value === '1' ? deptId.value : getFirstNodeLastLevel(res.data).parentId;
|
|
removeChildren(res.data);
|
|
menuOptions.value = res.data;
|
|
selectedKey.value = menuIdKey.value;
|
|
sessionStorageIns.setUseStorage('deptId', routerType.value === '1' ? deptId.value : parentId);
|
|
mitt.emit('deviceMenuKey', menuIdKey.value);
|
|
emit('tableMenuData', res.data);
|
|
}
|
|
});
|
|
}
|
|
|
|
function removeChildren(menu: any) {
|
|
//处理菜单空children
|
|
if (!Array.isArray(menu)) {
|
|
return;
|
|
}
|
|
|
|
menu.forEach(item => {
|
|
if (item.children && item.children.length === 0) {
|
|
delete item.children;
|
|
} else {
|
|
removeChildren(item.children);
|
|
}
|
|
});
|
|
}
|
|
// function renderMenuLabel(option: MenuOption) {
|
|
const renderMenuLabel = (option: MenuOption) => {
|
|
//菜单标题增加提示
|
|
// return h(NEllipsis, null, option.deptName as string);
|
|
return h(NEllipsis, null, { default: () => option.deptName });
|
|
};
|
|
|
|
function menuUpdateValue(key: string, item: MenuOption) {
|
|
//点击菜单
|
|
sessionStorageIns.setUseStorage(props.menuType === '1' ? 'deptId' : 'id', key);
|
|
sessionStorageIns.setUseStorage('currentPage', 1);
|
|
if (props.menuType === '1') {
|
|
mitt.emit('currentPageEmits', 1);
|
|
}
|
|
if (props.menuType === '2') {
|
|
sessionStorageIns.setUseStorage('deptId', item.parentId);
|
|
}
|
|
mitt.emit(props.menuType === '1' ? 'menuKey' : 'deviceMenuKey', key);
|
|
console.log(key, item);
|
|
}
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
:root {
|
|
--n-item-text-color-child-active-hover: #fff;
|
|
--n-item-text-color-active-hover: #fff;
|
|
--n-item-text-color-child-active: #fff;
|
|
}
|
|
|
|
.menuCantent {
|
|
height: -webkit-fill-available;
|
|
overflow: auto;
|
|
|
|
.menu {
|
|
text-align: center;
|
|
|
|
:deep(.n-submenu) {
|
|
--n-item-color-hover: auto;
|
|
|
|
.n-menu-item {
|
|
.n-menu-item-content {
|
|
padding: 0 !important;
|
|
|
|
.n-ellipsis {
|
|
font-family: 'AlibabaPuHuiTiBold';
|
|
padding: 0 15px;
|
|
}
|
|
|
|
// .n-menu-item-content__arrow {
|
|
// color: #b1e3ff;
|
|
// }
|
|
}
|
|
|
|
.n-menu-item-content.n-menu-item-content--child-active {
|
|
// .n-menu-item-content-header {
|
|
// color: #b1e3ff;
|
|
// }
|
|
|
|
.n-menu-item-content__arrow {
|
|
color: var(--n-arrow-color);
|
|
}
|
|
}
|
|
|
|
// .n-menu-item-content--child-active {
|
|
// .n-menu-item-content-header:hover {
|
|
// color: #fff !important;
|
|
// }
|
|
|
|
// .n-menu-item-content__arrow:hover {
|
|
// color: #fff !important;
|
|
// }
|
|
// }
|
|
// .n-menu-item-content--child-active:hover{
|
|
// color: #fff !important;
|
|
// }
|
|
|
|
.n-menu-item-content-header {
|
|
font-size: 2.2rem;
|
|
color: var(--vxe-table-header-font-color);
|
|
}
|
|
}
|
|
|
|
.n-menu-item:hover {
|
|
color: #409eff;
|
|
}
|
|
|
|
.n-submenu-children {
|
|
.n-menu-item-content-header {
|
|
font-size: 1.6rem;
|
|
}
|
|
|
|
.n-menu-item-content--selected {
|
|
.n-menu-item-content-header {
|
|
color: #409eff;
|
|
|
|
.n-ellipsis {
|
|
position: relative;
|
|
|
|
span {
|
|
padding: 0 10px;
|
|
}
|
|
|
|
span::before {
|
|
content: none;
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0.7rem;
|
|
width: 1.8rem;
|
|
height: 1.8rem;
|
|
// background: url(@/assets/images/taps.png) no-repeat;
|
|
// background-size: cover;
|
|
background-color: var(--menuActiveBg) !important;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.n-menu-item-content--selected::before {
|
|
background: -webkit-linear-gradient(left, #91d3fd 0%, #dedede 100%);
|
|
left: 0;
|
|
right: 0;
|
|
}
|
|
|
|
.n-menu-item-content--selected::after {
|
|
content: '';
|
|
position: absolute;
|
|
bottom: 0;
|
|
width: 100%;
|
|
height: 2px;
|
|
background: -webkit-linear-gradient(left, #409eff 0%, #dedede 100%);
|
|
}
|
|
}
|
|
|
|
.n-base-icon {
|
|
// color: #84e0f7;
|
|
right: 10px;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*滚动条整体部分*/
|
|
.menuCantent::-webkit-scrollbar,
|
|
.tableGrid ::-webkit-scrollbar {
|
|
width: 8px;
|
|
height: 8px;
|
|
}
|
|
|
|
/*滚动条的轨道*/
|
|
.menuCantent::-webkit-scrollbar-track,
|
|
.tableGrid ::-webkit-scrollbar-track {
|
|
background-color: transparent;
|
|
-webkit-border-radius: 8px;
|
|
-moz-border-radius: 8px;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
/*滚动条里面的小方块,能向上向下移动*/
|
|
.menuCantent::-webkit-scrollbar-thumb,
|
|
.tableGrid ::-webkit-scrollbar-thumb {
|
|
background-color: rgb(147, 147, 153, 0.5);
|
|
-webkit-border-radius: 8px;
|
|
-moz-border-radius: 8px;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
.menuCantent::-webkit-scrollbar-thumb:hover,
|
|
.tableGrid ::-webkit-scrollbar-thumb:hover {
|
|
background-color: #a8a8a8;
|
|
}
|
|
|
|
.menuCantent::-webkit-scrollbar-thumb:active,
|
|
.tableGrid :-webkit-scrollbar-thumb:active {
|
|
background-color: #787878;
|
|
}
|
|
|
|
/*边角,即两个滚动条的交汇处*/
|
|
.menuCantent::-webkit-scrollbar-corner,
|
|
.tableGrid ::-webkit-scrollbar-corner {
|
|
background-color: transparent;
|
|
}
|
|
</style>
|
|
|