From 64d172717748c383a5c88348037354bffd60f966 Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期二, 27 五月 2025 17:52:03 +0800 Subject: [PATCH] 页面样式修改 --- src/components/TopNav/index.vue | 217 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 217 insertions(+), 0 deletions(-) diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue new file mode 100644 index 0000000..62028af --- /dev/null +++ b/src/components/TopNav/index.vue @@ -0,0 +1,217 @@ +<template> + <el-menu + :default-active="activeMenu" + mode="horizontal" + @select="handleSelect" + :ellipsis="false" + > + <template v-for="(item, index) in topMenus"> + <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber"> + <svg-icon + v-if="item.meta && item.meta.icon && item.meta.icon !== '#'" + :icon-class="item.meta.icon"/> + {{ item.meta.title }} + </el-menu-item> + </template> + + <!-- 椤堕儴鑿滃崟瓒呭嚭鏁伴噺鎶樺彔 --> + <el-sub-menu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber"> + <template #title>鏇村鑿滃崟</template> + <template v-for="(item, index) in topMenus"> + <el-menu-item + :index="item.path" + :key="index" + v-if="index >= visibleNumber"> + <svg-icon + v-if="item.meta && item.meta.icon && item.meta.icon !== '#'" + :icon-class="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' + +// 椤堕儴鏍忓垵濮嬫暟 +const visibleNumber = ref(null) +// 褰撳墠婵�娲昏彍鍗曠殑 index +const currentIndex = ref(null) +// 闅愯棌渚ц竟鏍忚矾鐢� +const hideList = ['/index', '/user/profile'] + +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 topMenus = computed(() => { + let topMenus = [] + routers.value.map((menu) => { + if (menu.hidden !== true) { + // 鍏煎椤堕儴鏍忎竴绾ц彍鍗曞唴閮ㄨ烦杞� + if (menu.path === '/' && menu.children) { + topMenus.push(menu.children[0]) + } else { + topMenus.push(menu) + } + } + }) + return topMenus +}) + +// 璁剧疆瀛愯矾鐢� +const childrenMenus = computed(() => { + let childrenMenus = [] + 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 + } else { + if(!isHttp(router.children[item].path)) { + router.children[item].path = router.path + "/" + router.children[item].path + } + } + router.children[item].parentPath = router.path + } + childrenMenus.push(router.children[item]) + } + }) + return constantRoutes.concat(childrenMenus) +}) + +// 榛樿婵�娲荤殑鑿滃崟 +const activeMenu = computed(() => { + const path = route.path + let activePath = path + if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) { + const tmpPath = path.substring(1, path.length) + if (!route.meta.link) { + activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/")) + appStore.toggleSideBarHide(false) + } + } else if(!route.children) { + activePath = path + appStore.toggleSideBarHide(true) + } + activeRoutes(activePath) + return activePath +}) + +function setVisibleNumber() { + const width = document.body.getBoundingClientRect().width / 3 + visibleNumber.value = parseInt(width / 85) +} + +function handleSelect(key, keyPath) { + currentIndex.value = key + const route = routers.value.find(item => item.path === key) + if (isHttp(key)) { + // http(s):// 璺緞鏂扮獥鍙f墦寮� + window.open(key, "_blank") + } else if (!route || !route.children) { + // 娌℃湁瀛愯矾鐢辫矾寰勫唴閮ㄦ墦寮� + 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 = [] + if (childrenMenus.value && childrenMenus.value.length > 0) { + childrenMenus.value.map((item) => { + if (key == item.parentPath || (key == "index" && "" == item.path)) { + routes.push(item) + } + }) + } + if(routes.length > 0) { + permissionStore.setSidebarRouters(routes) + } else { + appStore.toggleSideBarHide(true) + } + return routes +} + +onMounted(() => { + window.addEventListener('resize', setVisibleNumber) +}) + +onBeforeUnmount(() => { + window.removeEventListener('resize', setVisibleNumber) +}) + +onMounted(() => { + setVisibleNumber() +}) +</script> + +<style lang="scss"> +.topmenu-container.el-menu--horizontal > .el-menu-item { + float: left; + height: 50px !important; + line-height: 50px !important; + color: #999093 !important; + padding: 0 5px !important; + 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 { + border-bottom: 2px solid #{'var(--theme)'} !important; + color: #303133; +} + +/* sub-menu item */ +.topmenu-container.el-menu--horizontal > .el-sub-menu .el-sub-menu__title { + float: left; + height: 50px !important; + line-height: 50px !important; + color: #999093 !important; + 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; +} + +/* 鍥炬爣鍙抽棿璺� */ +.topmenu-container .svg-icon { + margin-right: 4px; +} + +/* topmenu more arrow */ +.topmenu-container .el-sub-menu .el-sub-menu__icon-arrow { + position: static; + vertical-align: middle; + margin-left: 8px; + margin-top: 0px; +} + + +</style> -- Gitblit v1.9.3