From e181f04c642204e79749af93fa921875ff6c21ba Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期二, 20 五月 2025 10:46:35 +0800 Subject: [PATCH] refactor(qms): 重构趋势图展示逻辑 --- src/components/TopNav/index.vue | 158 ++++++++++++++++++++++++++++------------------------ 1 files changed, 86 insertions(+), 72 deletions(-) diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue index ac1d2e5..cfe2cd7 100644 --- a/src/components/TopNav/index.vue +++ b/src/components/TopNav/index.vue @@ -1,162 +1,163 @@ <template> - <el-menu - :default-active="activeMenu" - mode="horizontal" - @select="handleSelect" - :ellipsis="false" - > + <el-menu :default-active="activeMenu" mode="horizontal" :ellipsis="false" @select="handleSelect"> <template v-for="(item, index) in topMenus"> - <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber" - ><svg-icon :icon-class="item.meta.icon" /> - {{ item.meta.title }}</el-menu-item + <el-menu-item v-if="index < visibleNumber" :key="index" :style="{ '--theme': theme }" :index="item.path" + ><svg-icon v-if="item.meta && item.meta.icon && item.meta.icon !== '#'" :icon-class="item.meta ? item.meta.icon : ''" /> + {{ item.meta?.title }}</el-menu-item > </template> <!-- 椤堕儴鑿滃崟瓒呭嚭鏁伴噺鎶樺彔 --> - <el-sub-menu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber"> + <el-sub-menu v-if="topMenus.length > visibleNumber" :style="{ '--theme': theme }" index="more"> <template #title>鏇村鑿滃崟</template> <template v-for="(item, index) in topMenus"> - <el-menu-item - :index="item.path" - :key="index" - v-if="index >= visibleNumber" - ><svg-icon :icon-class="item.meta.icon" /> - {{ item.meta.title }}</el-menu-item + <el-menu-item v-if="index >= visibleNumber" :key="index" :index="item.path" + ><svg-icon :icon-class="item.meta ? item.meta.icon : ''" /> {{ item.meta?.title }}</el-menu-item > </template> </el-sub-menu> </el-menu> </template> -<script setup> -import { constantRoutes } from "@/router" -import { isHttp } from '@/utils/validate' -import useAppStore from '@/store/modules/app' -import useSettingsStore from '@/store/modules/settings' -import usePermissionStore from '@/store/modules/permission' +<script setup lang="ts"> +import { constantRoutes } from '@/router'; +import { isHttp } from '@/utils/validate'; +import useAppStore from '@/store/modules/app'; +import useSettingsStore from '@/store/modules/settings'; +import usePermissionStore from '@/store/modules/permission'; +import { RouteRecordRaw } from 'vue-router'; // 椤堕儴鏍忓垵濮嬫暟 -const visibleNumber = ref(null); +const visibleNumber = ref<number>(-1); // 褰撳墠婵�娲昏彍鍗曠殑 index -const currentIndex = ref(null); +const currentIndex = ref<string>(); // 闅愯棌渚ц竟鏍忚矾鐢� const hideList = ['/index', '/user/profile']; -const appStore = useAppStore() -const settingsStore = useSettingsStore() -const permissionStore = usePermissionStore() +const appStore = useAppStore(); +const settingsStore = useSettingsStore(); +const permissionStore = usePermissionStore(); const route = useRoute(); const router = useRouter(); // 涓婚棰滆壊 const theme = computed(() => settingsStore.theme); // 鎵�鏈夌殑璺敱淇℃伅 -const routers = computed(() => permissionStore.topbarRouters); +const routers = computed(() => permissionStore.getTopbarRoutes()); // 椤堕儴鏄剧ず鑿滃崟 const topMenus = computed(() => { - let topMenus = []; + let topMenus: RouteRecordRaw[] = []; routers.value.map((menu) => { if (menu.hidden !== true) { // 鍏煎椤堕儴鏍忎竴绾ц彍鍗曞唴閮ㄨ烦杞� - if (menu.path === "/") { - topMenus.push(menu.children[0]); + if (menu.path === '/') { + topMenus.push(menu.children ? menu.children[0] : menu); } else { - topMenus.push(menu); + topMenus.push(menu); } } - }) + }); return topMenus; -}) +}); // 璁剧疆瀛愯矾鐢� const childrenMenus = computed(() => { - let childrenMenus = []; + let childrenMenus: RouteRecordRaw[] = []; routers.value.map((router) => { - for (let item in router.children) { - if (router.children[item].parentPath === undefined) { - if(router.path === "/") { - router.children[item].path = "/" + router.children[item].path; + router.children?.forEach((item) => { + if (item.parentPath === undefined) { + if (router.path === '/') { + item.path = '/' + item.path; } else { - if(!isHttp(router.children[item].path)) { - router.children[item].path = router.path + "/" + router.children[item].path; + if (!isHttp(item.path)) { + item.path = router.path + '/' + item.path; } } - router.children[item].parentPath = router.path; + item.parentPath = router.path; } - childrenMenus.push(router.children[item]); - } - }) + childrenMenus.push(item); + }); + }); return constantRoutes.concat(childrenMenus); -}) +}); // 榛樿婵�娲荤殑鑿滃崟 const activeMenu = computed(() => { - const path = route.path; + let path = route.path; + if (path === '/index') { + path = '/system/user'; + } let activePath = path; - if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) { + if (path !== undefined && path.lastIndexOf('/') > 0 && hideList.indexOf(path) === -1) { const tmpPath = path.substring(1, path.length); - activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/")); if (!route.meta.link) { - appStore.toggleSideBarHide(false); + activePath = '/' + tmpPath.substring(0, tmpPath.indexOf('/')); + appStore.toggleSideBarHide(false); } - } else if(!route.children) { + } else if (!route.children) { activePath = path; appStore.toggleSideBarHide(true); } activeRoutes(activePath); return activePath; -}) +}); -function setVisibleNumber() { +const setVisibleNumber = () => { const width = document.body.getBoundingClientRect().width / 3; - visibleNumber.value = parseInt(width / 85); -} + visibleNumber.value = parseInt(String(width / 85)); +}; -function handleSelect(key, keyPath) { +const handleSelect = (key: string) => { currentIndex.value = key; - const route = routers.value.find(item => item.path === key); + const route = routers.value.find((item) => item.path === key); if (isHttp(key)) { // http(s):// 璺緞鏂扮獥鍙f墦寮� - window.open(key, "_blank"); + window.open(key, '_blank'); } else if (!route || !route.children) { // 娌℃湁瀛愯矾鐢辫矾寰勫唴閮ㄦ墦寮� - router.push({ path: key }); + const routeMenu = childrenMenus.value.find((item) => item.path === key); + if (routeMenu && routeMenu.query) { + let query = JSON.parse(routeMenu.query); + router.push({ path: key, query: query }); + } else { + router.push({ path: key }); + } appStore.toggleSideBarHide(true); } else { // 鏄剧ず宸︿晶鑱斿姩鑿滃崟 activeRoutes(key); appStore.toggleSideBarHide(false); } -} +}; -function activeRoutes(key) { - let routes = []; +const activeRoutes = (key: string) => { + let routes: RouteRecordRaw[] = []; if (childrenMenus.value && childrenMenus.value.length > 0) { childrenMenus.value.map((item) => { - if (key == item.parentPath || (key == "index" && "" == item.path)) { + if (key == item.parentPath || (key == 'index' && '' == item.path)) { routes.push(item); } }); } - if(routes.length > 0) { + if (routes.length > 0) { permissionStore.setSidebarRouters(routes); } else { appStore.toggleSideBarHide(true); } return routes; -} +}; onMounted(() => { - window.addEventListener('resize', setVisibleNumber) -}) + window.addEventListener('resize', setVisibleNumber); +}); onBeforeUnmount(() => { - window.removeEventListener('resize', setVisibleNumber) -}) + window.removeEventListener('resize', setVisibleNumber); +}); onMounted(() => { - setVisibleNumber() -}) + setVisibleNumber(); +}); </script> <style lang="scss"> @@ -169,7 +170,8 @@ margin: 0 10px !important; } -.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-sub-menu.is-active .el-submenu__title { +.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, +.el-menu--horizontal > .el-sub-menu.is-active .el-submenu__title { border-bottom: 2px solid #{'var(--theme)'} !important; color: #303133; } @@ -183,4 +185,16 @@ padding: 0 5px !important; margin: 0 10px !important; } + +/* 鑳屾櫙鑹查殣钘� */ +.topmenu-container.el-menu--horizontal > .el-menu-item:not(.is-disabled):focus, +.topmenu-container.el-menu--horizontal > .el-menu-item:not(.is-disabled):hover, +.topmenu-container.el-menu--horizontal > .el-submenu .el-submenu__title:hover { + background-color: #ffffff !important; +} + +/* 鍥炬爣鍙抽棿璺� */ +.topmenu-container .svg-icon { + margin-right: 4px; +} </style> -- Gitblit v1.9.3