Merge branch 'master' of https://github.com/zhitan-cloud/zhitan-ems
| | |
| | | #### æ¼ç¤ºå°åï¼https://demo-ems.zhitancloud.com/ |
| | | |
| | | ## 弿ºåè®® |
| | | zhitan-emsæ¯åºäº [AGPL](https://www.gnu.org/licenses/agpl-3.0.en.html) å [ZTPL](./ZTPL%20LICENSE) ååè®®ç弿ºè½¯ä»¶ã |
| | | zhitan-emsæ¯åºäº [AGPL](https://www.gnu.org/licenses/agpl-3.0.en.html) å [ZTPL](./LICENSE) ååè®®ç弿ºè½¯ä»¶ã |
| | | |
| | | ## 社åºç-åè½å表 |
| | | 1. é¦é¡µçæ¿ **已宿** |
| | |
| | | body { |
| | | height: 100%; |
| | | margin: 0; |
| | | padding: 0; |
| | | -moz-osx-font-smoothing: grayscale; |
| | | -webkit-font-smoothing: antialiased; |
| | | text-rendering: optimizeLegibility; |
| | | font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; |
| | | overflow-x: hidden; /* 鲿¢æ°´å¹³æ»å¨æ¡ */ |
| | | } |
| | | |
| | | label { |
| | |
| | | html { |
| | | height: 100%; |
| | | box-sizing: border-box; |
| | | margin: 0; |
| | | padding: 0; |
| | | overflow-x: hidden; /* 鲿¢æ°´å¹³æ»å¨æ¡ */ |
| | | } |
| | | |
| | | #app { |
| | | height: 100%; |
| | | width: 100%; |
| | | margin: 0; |
| | | padding: 0; |
| | | overflow-x: hidden; /* 鲿¢æ°´å¹³æ»å¨æ¡ */ |
| | | } |
| | | |
| | | *, |
| | |
| | | color: #999 !important; |
| | | } |
| | | } |
| | | |
| | | /* æå èåæ ·å¼è°æ´ï¼ç¡®ä¿å¨æææ
åµä¸èå项å±
ä¸ */ |
| | | .el-menu--collapse { |
| | | width: 54px !important; |
| | | |
| | | .el-sub-menu, .el-menu-item { |
| | | width: 36px !important; |
| | | min-width: 36px !important; |
| | | margin-left: 9px !important; /* å
³é®ï¼è®¾ç½®åºå®ç左边è·9px使èå项å±
ä¸ */ |
| | | margin-right: 9px !important; |
| | | } |
| | | |
| | | .el-menu-item, .el-sub-menu__title { |
| | | display: flex !important; |
| | | justify-content: center !important; |
| | | align-items: center !important; |
| | | padding: 0 !important; |
| | | |
| | | .svg-icon, .el-icon { |
| | | margin: 0 !important; /* éè¦ï¼ç§»é¤å¾æ çææè¾¹è· */ |
| | | } |
| | | |
| | | .el-sub-menu__icon-arrow { |
| | | display: none !important; |
| | | } |
| | | |
| | | > span { |
| | | display: none !important; |
| | | } |
| | | } |
| | | |
| | | /* éä¸ç¶ææ ·å¼ */ |
| | | .el-menu-item.is-active, .el-sub-menu.is-active > .el-sub-menu__title { |
| | | background-color: #3883FA !important; |
| | | color: #fff !important; |
| | | } |
| | | } |
| | |
| | | display: flex; |
| | | |
| | | .page-container-left { |
| | | width: 280px; |
| | | width: 220px; |
| | | min-height: calc(100vh - 148px); |
| | | border-right: 1px solid #fff; |
| | | border-right: 1px solid #e8e8e8; |
| | | background: #f1f4fa; |
| | | |
| | | .el-tree { |
| | |
| | | } |
| | | |
| | | .tree { |
| | | height: calc(100vh - 170px) !important; |
| | | max-height: calc(100vh - 170px) !important; |
| | | height: calc(100vh - 170px); |
| | | max-height: calc(100vh - 170px); |
| | | overflow-y: auto; |
| | | } |
| | | } |
| | |
| | | |
| | | |
| | | .main-container { |
| | | background-color: #110f2e !important; |
| | | height: 100%; |
| | | transition: margin-left 0.28s; |
| | | margin-left: $base-sidebar-width; |
| | |
| | | transition: width 0.28s; |
| | | width: $base-sidebar-width !important; |
| | | background-color: $base-menu-background; |
| | | height: 100%; |
| | | height: calc(100% - 60px) !important; |
| | | position: fixed; |
| | | top: 60px; |
| | | bottom: 0; |
| | |
| | | |
| | | .scrollbar-wrapper { |
| | | overflow-x: hidden !important; |
| | | height: calc(100% - 290px) !important; |
| | | } |
| | | |
| | | .el-scrollbar__bar.is-vertical { |
| | | right: 0px; |
| | | right: 0 !important; |
| | | } |
| | | |
| | | .el-scrollbar { |
| | |
| | | } |
| | | |
| | | .el-menu--collapse { |
| | | .el-sub-menu { |
| | | & > .el-sub-menu__title { |
| | | & > span { |
| | | height: 0; |
| | | width: 0; |
| | | overflow: hidden; |
| | | visibility: hidden; |
| | | display: inline-block; |
| | | width: 54px !important; |
| | | |
| | | /* æ¸
é¤å代鿩å¨ä¸å¹²æ°å±
ä¸çæ ·å¼ */ |
| | | .el-sub-menu, .el-menu-item { |
| | | margin: 0 !important; |
| | | padding: 0 !important; |
| | | width: 100% !important; |
| | | |
| | | /* è®©å¾æ åèå项å±
ä¸ */ |
| | | .el-menu-item, .el-sub-menu__title { |
| | | width: 36px !important; |
| | | min-width: 36px !important; |
| | | height: 38px !important; |
| | | line-height: 38px !important; |
| | | margin: 4px 9px !important; /* 精确计ç®å±
ä¸è¾¹è· */ |
| | | padding: 0 !important; |
| | | display: flex !important; |
| | | justify-content: center !important; |
| | | align-items: center !important; |
| | | border-radius: 4px !important; |
| | | } |
| | | & > i { |
| | | height: 0; |
| | | width: 0; |
| | | overflow: hidden; |
| | | visibility: hidden; |
| | | display: inline-block; |
| | | } |
| | | |
| | | /* ç¡®ä¿å¾æ å±
ä¸ */ |
| | | .svg-icon, .el-icon { |
| | | margin: 0 !important; |
| | | padding: 0 !important; |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | .main-container { |
| | | background-color: #f7f8fa; |
| | | height: 100%; |
| | | transition: margin-left 0.28s; |
| | | margin-left: $base-sidebar-width; |
| | |
| | | transition: width 0.28s; |
| | | width: $base-sidebar-width !important; |
| | | background-color: $base-menu-background; |
| | | height: 100%; |
| | | height: calc(100% - 60px) !important; |
| | | position: fixed; |
| | | top: 60px; |
| | | bottom: 0; |
| | |
| | | .menu-title { |
| | | overflow: hidden !important; |
| | | font-weight: 400 !important; |
| | | font-size: 16px !important; |
| | | font-size: 14px !important; |
| | | } |
| | | |
| | | // @media (min-width: 1440px) { |
| | |
| | | } |
| | | |
| | | .el-menu--collapse { |
| | | .el-sub-menu { |
| | | & > .el-sub-menu__title { |
| | | & > span { |
| | | height: 0; |
| | | width: 0; |
| | | overflow: hidden; |
| | | visibility: hidden; |
| | | display: inline-block; |
| | | width: 54px !important; |
| | | |
| | | /* æ¸
é¤å代鿩å¨ä¸å¹²æ°å±
ä¸çæ ·å¼ */ |
| | | .el-sub-menu, .el-menu-item { |
| | | margin: 0 !important; |
| | | padding: 0 !important; |
| | | width: 100% !important; |
| | | |
| | | /* è®©å¾æ åèå项å±
ä¸ */ |
| | | .el-menu-item, .el-sub-menu__title { |
| | | width: 36px !important; |
| | | min-width: 36px !important; |
| | | height: 38px !important; |
| | | line-height: 38px !important; |
| | | margin: 4px 9px !important; /* 精确计ç®å±
ä¸è¾¹è· */ |
| | | padding: 0 !important; |
| | | display: flex !important; |
| | | justify-content: center !important; |
| | | align-items: center !important; |
| | | border-radius: 4px !important; |
| | | } |
| | | & > i { |
| | | height: 0; |
| | | width: 0; |
| | | overflow: hidden; |
| | | visibility: hidden; |
| | | display: inline-block; |
| | | } |
| | | |
| | | /* ç¡®ä¿å¾æ å±
ä¸ */ |
| | | .svg-icon, .el-icon { |
| | | margin: 0 !important; |
| | | padding: 0 !important; |
| | | } |
| | | } |
| | | } |
| | |
| | | let matched = route.matched.filter(item => item.meta && item.meta.title); |
| | | const first = matched[0] |
| | | |
| | | // ä¸èªå¨æ·»å é¦é¡µå°é¢å
å±ä¸ |
| | | // if (!isDashboard(first)) { |
| | | // matched = [{ path: '/index', meta: { title: 'é¦é¡µ' } }].concat(matched) |
| | | // } |
| | | // æ·»å è°è¯æ¥å¿ |
| | | console.log('Current route path:', route.path); |
| | | console.log('Route matched:', route.matched); |
| | | console.log('Filtered matched routes:', matched); |
| | | |
| | | // 妿æ¯é¦é¡µçæ¿è·¯ç±ï¼ç¡®ä¿å®è¢«æ·»å å°é¢å
å±ä¸ |
| | | if (route.path === '/index' || route.path === '/index/index') { |
| | | matched = [{ path: '/index', meta: { title: 'é¦é¡µçæ¿' } }].concat(matched) |
| | | console.log('Added index route to matched:', matched); |
| | | } |
| | | |
| | | levelList.value = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false) |
| | | console.log('Final breadcrumb items:', levelList.value); |
| | | } |
| | | |
| | | function isDashboard(route) { |
| | | const name = route && route.name |
| | | if (!name) { |
| | | return false |
| | | } |
| | | return name.trim() === 'Index' |
| | | return name.trim().toLowerCase() === 'index' |
| | | } |
| | | |
| | | function handleLink(item) { |
| | | const { redirect, path } = item |
| | | if (redirect) { |
| | |
| | | .no-redirect { |
| | | color: #fff; |
| | | cursor: text; |
| | | } |
| | | |
| | | :deep(.el-breadcrumb__item) { |
| | | .el-breadcrumb__inner { |
| | | color: rgba(255, 255, 255, 0.8); |
| | | |
| | | &:hover { |
| | | color: #fff; |
| | | } |
| | | } |
| | | |
| | | .el-breadcrumb__separator { |
| | | color: rgba(255, 255, 255, 0.8); |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | </svg> --> |
| | | |
| | | <img src="/src/assets/images/nav-btn.png" width="26" v-if="settingsStore.sideTheme == 'theme-dark'"> |
| | | <img src="/src/assets/images/nav-btn2.png" width="26" v-else> |
| | | <img src="/src/assets/images/nav-btn.png" width="26" v-else> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | setTimeout(updateScrollButtons, 300); |
| | | } |
| | | |
| | | /** |
| | | * æ¥æ¾ææ·±å±çåèåï¼å¶åèç¹ï¼ |
| | | * é彿¥æ¾ç¬¬ä¸ä¸ªæ²¡æchildrençåèå |
| | | */ |
| | | function findDeepestLeafMenu(route) { |
| | | if (!route) return null; |
| | | |
| | | // å¦ææ²¡æåèåæåèå为空ï¼åè¿åå½åè·¯ç± |
| | | if (!route.children || route.children.length === 0) { |
| | | return route; |
| | | } |
| | | |
| | | // æ¾å°ç¬¬ä¸ä¸ªééèçåèå |
| | | const firstVisibleChild = route.children.find(child => !child.hidden); |
| | | if (!firstVisibleChild) { |
| | | return route; // 妿ææåèå齿¯éèçï¼è¿åå½åè·¯ç± |
| | | } |
| | | |
| | | // é彿¥æ¾è¿ä¸ªåèåçææ·±å±åèå |
| | | return findDeepestLeafMenu(firstVisibleChild); |
| | | } |
| | | |
| | | function handleSelect(key, keyPath) { |
| | | currentIndex.value = key; |
| | | const route = routers.value.find(item => item.path === key); |
| | |
| | | return; |
| | | } |
| | | |
| | | if (key === '/index' || key === '/') { |
| | | // é¦é¡µæ¶æ¾ç¤ºæå çä¾§è¾¹æ ï¼è䏿¯éè |
| | | router.push({ path: key }); |
| | | appStore.showCollapsedSidebar(); |
| | | return; |
| | | } |
| | | |
| | | |
| | | // æ£æ¥æ¯å¦æåè·¯ç± |
| | | if (route && route.children && route.children.length > 0) { |
| | | // æåè·¯ç±ï¼æ¾ç¤ºä¾§è¾¹æ |
| | | activeRoutes(key); |
| | | const firstChild = route.children[0]; |
| | | const path = firstChild.path.startsWith('/') ? firstChild.path : `${key}/${firstChild.path}`; |
| | | if (firstChild.query) { |
| | | router.push({ path, query: firstChild.query }); |
| | | |
| | | // æç
§æ£ç¡®çè·¯å¾æå»ºå±çº§ï¼è¿éæ¯ç¹æ®å¤ç |
| | | let targetPath = key; // ä»å½åç¹å»çèåè·¯å¾å¼å§ |
| | | let targetQuery = null; |
| | | let currentNode = route; |
| | | let pathSegments = []; |
| | | |
| | | // å½åè·¯å¾æ¯ç¬¬ä¸æ®µ |
| | | pathSegments.push(currentNode.path); |
| | | |
| | | // é屿·»å åè·¯å¾ |
| | | while (currentNode.children && currentNode.children.length > 0) { |
| | | const firstChild = currentNode.children.find(child => !child.hidden); |
| | | if (!firstChild) break; |
| | | |
| | | // è·³è¿ParentViewç±»åçä¸é´èç¹ï¼ç´æ¥ä½¿ç¨å
¶åèç¹çpath |
| | | if (firstChild.component === 'ParentView' || firstChild.component.name === 'ParentView') { |
| | | currentNode = firstChild; |
| | | pathSegments.push(firstChild.path); |
| | | continue; |
| | | } |
| | | |
| | | // æ®éèç¹å¤ç |
| | | currentNode = firstChild; |
| | | // å¦æè·¯å¾ä¸æ¯ä»¥/å¼å¤´ï¼åæ·»å å°è·¯å¾çæ®µä¸ |
| | | if (!firstChild.path.startsWith('/')) { |
| | | pathSegments.push(firstChild.path); |
| | | } else { |
| | | router.push({ path }); |
| | | // 妿æ¯ç»å¯¹è·¯å¾ï¼åæ¿æ¢ä¹åææè·¯å¾ |
| | | pathSegments = [firstChild.path]; |
| | | } |
| | | |
| | | targetQuery = firstChild.query; |
| | | |
| | | // 妿å°è¾¾å¶åèç¹ï¼æ²¡æåèç¹ï¼ï¼åç»ææ¥æ¾ |
| | | if (!firstChild.children || firstChild.children.length === 0) { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // æå»ºæç»è·¯å¾ |
| | | if (pathSegments.length > 0) { |
| | | // å¦æç¬¬ä¸æ®µä¸æ¯ä»¥/å¼å¤´ï¼æ·»å / |
| | | if (!pathSegments[0].startsWith('/')) { |
| | | pathSegments[0] = '/' + pathSegments[0]; |
| | | } |
| | | |
| | | // ç»åè·¯å¾ - ææ°ç»ä¸ææè·¯å¾æ¼æ¥èµ·æ¥ï¼å¦æææ®µå
å«å®æ´è·¯å¾ï¼ä»¥/å¼å¤´ï¼åä»è¯¥æ®µéæ°å¼å§ |
| | | targetPath = pathSegments.reduce((fullPath, segment, index) => { |
| | | if (segment.startsWith('/')) { |
| | | return segment; |
| | | } else if (index === 0) { |
| | | return segment; |
| | | } else { |
| | | return `${fullPath}/${segment}`; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // 导èªå°ç®æ è·¯ç± |
| | | if (targetQuery) { |
| | | router.push({ path: targetPath, query: targetQuery }); |
| | | } else { |
| | | router.push({ path: targetPath }); |
| | | } |
| | | } else { |
| | | // 没æåè·¯ç±ï¼éèä¾§è¾¹æ |
| | |
| | | |
| | | function activeRoutes(key) { |
| | | let routes = []; |
| | | if (key === '/index' || key === '/') { |
| | | // é¦é¡µæ¶æ¾ç¤ºæå çä¾§è¾¹æ ï¼è䏿¯éè |
| | | appStore.showCollapsedSidebar(); |
| | | return []; |
| | | } |
| | | |
| | | |
| | | // æ¥æ¾å¹é
çè·¯ç± |
| | | if (childrenMenus.value && childrenMenus.value.length > 0) { |
| | |
| | | background: #110f2e; |
| | | padding: 14px; |
| | | box-sizing: border-box; |
| | | padding-top: 8px; |
| | | } |
| | | |
| | | .fixed-header + .app-main { |
| | |
| | | } |
| | | |
| | | .fixed-header + .app-main { |
| | | padding-top: 130px; |
| | | padding-top: 108px; /* 60px(navbar) + 34px(tagsview) + 14px(å
è¾¹è·) */ |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | .fixed-header + .app-main { |
| | | padding-top: 130px; |
| | | padding-top: 108px; /* 60px(navbar) + 34px(tagsview) + 14px(å
è¾¹è·) */ |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* ç¨æ·ä¸ªäººèµæé¡µç¹æ®é«åº¦å¤ç */ |
| | | .user-profile-container { |
| | | min-height: calc(100vh - 50px) !important; |
| | | } |
| | | </style> |
| | | |
| | | <style lang="scss"> |
| | |
| | | import Hamburger from "@/components/Hamburger" |
| | | import useAppStore from "@/store/modules/app" |
| | | import useSettingsStore from "@/store/modules/settings" |
| | | import { useRouter } from "vue-router" |
| | | |
| | | const appStore = useAppStore() |
| | | const settingsStore = useSettingsStore() |
| | | const router = useRouter() |
| | | |
| | | function toggleSideBar() { |
| | | appStore.toggleSideBar() |
| | | } |
| | | |
| | | function handleAlarm() { |
| | | // å¤çæ¥è¦æé®ç¹å»äºä»¶ |
| | | console.log('æ¥è¦æé®è¢«ç¹å»') |
| | | // è·³è½¬å°æ¥è¦ç®¡çé¡µé¢ |
| | | router.push('/alarmmanage/measuremen?modelCode=BJGL') |
| | | } |
| | | |
| | | function handleRobot() { |
| | | // å¤ç大模åæé®ç¹å»äºä»¶ |
| | | console.log('大模åæé®è¢«ç¹å»') |
| | | // è·³è½¬å°æºè½å©æé¡µé¢ |
| | | window.open('https://deepseek.tan-zhonghe.com/chat', '_blank') |
| | | } |
| | | </script> |
| | | |
| | |
| | | </app-link> |
| | | </template> |
| | | |
| | | <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported> |
| | | <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported @click="handleSubMenuClick"> |
| | | <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> |
| | |
| | | import { isExternal } from '@/utils/validate' |
| | | import AppLink from './Link' |
| | | import { getNormalPath } from '@/utils/ruoyi' |
| | | import { useRouter } from 'vue-router' |
| | | |
| | | const router = useRouter(); |
| | | |
| | | const props = defineProps({ |
| | | // route object |
| | |
| | | |
| | | const onlyOneChild = ref({}); |
| | | |
| | | /** |
| | | * æ¥æ¾ææ·±å±çåèåï¼å¶åèç¹ï¼ |
| | | * é彿¥æ¾ç¬¬ä¸ä¸ªæ²¡æchildrençåèå |
| | | */ |
| | | function findDeepestLeafMenu(route) { |
| | | if (!route) return null; |
| | | |
| | | // å¦ææ²¡æåèåæåèå为空ï¼åè¿åå½åè·¯ç± |
| | | if (!route.children || route.children.length === 0) { |
| | | return route; |
| | | } |
| | | |
| | | // æ¾å°ç¬¬ä¸ä¸ªééèçåèå |
| | | const firstVisibleChild = route.children.find(child => !child.hidden); |
| | | if (!firstVisibleChild) { |
| | | return route; // 妿ææåèå齿¯éèçï¼è¿åå½åè·¯ç± |
| | | } |
| | | |
| | | // é彿¥æ¾è¿ä¸ªåèåçææ·±å±åèå |
| | | return findDeepestLeafMenu(firstVisibleChild); |
| | | } |
| | | |
| | | // å¤çåèåç¹å» |
| | | function handleSubMenuClick(e) { |
| | | // 黿¢äºä»¶å泡 |
| | | e.stopPropagation(); |
| | | |
| | | // 妿ç¹å»çæ¯åèåæ é¢ï¼åèªå¨å¯¼èªå°ææ·±å±çåèå |
| | | if (e.target.closest('.el-sub-menu__title')) { |
| | | // æç
§æ£ç¡®çè·¯å¾æå»ºå±çº§ |
| | | let currentNode = props.item; |
| | | |
| | | console.log('å½åç¹å»çèå项:', JSON.stringify(currentNode, null, 2)); |
| | | console.log('basePath:', props.basePath); |
| | | |
| | | // è·å第ä¸ä¸ªå¯è§åèåï¼å¦ææ²¡æå¯è§åèåï¼ä¸è¿è¡è·³è½¬ |
| | | if (!currentNode.children || currentNode.children.length === 0) { |
| | | return; |
| | | } |
| | | |
| | | const firstVisibleChild = currentNode.children.find(child => !child.hidden); |
| | | if (!firstVisibleChild) { |
| | | return; |
| | | } |
| | | |
| | | console.log('第ä¸ä¸ªå¯è§åèå:', JSON.stringify(firstVisibleChild, null, 2)); |
| | | |
| | | // æ¥å¿ç®¡ççä¸çº§èåç¹æ®å¤ç |
| | | // æ£æ¥æ¯å¦æé¢å
åå
¥ç宿´è·¯å¾ï¼å¦ææåç´æ¥ä½¿ç¨ |
| | | if (firstVisibleChild.fullPath) { |
| | | console.log('使ç¨é¢å
设置ç宿´è·¯å¾:', firstVisibleChild.fullPath); |
| | | router.push({ path: firstVisibleChild.fullPath }); |
| | | return; |
| | | } |
| | | |
| | | // 夿æ¯å¦æ¯ç³»ç»/æ¥å¿ç®¡çç±»åçä¸çº§èåï¼ä¾å¦ï¼/system/log/operlogï¼ |
| | | // è¿ç§æ
åµä¸ï¼ç´æ¥è·³è½¬å°ç¬¬ä¸ä¸ªåèåç宿´è·¯å¾ |
| | | if (firstVisibleChild.component === 'ParentView' || |
| | | (typeof firstVisibleChild.component === 'object' && |
| | | firstVisibleChild.component.name === 'ParentView')) { |
| | | console.log('æ£æµå°ParentViewç»ä»¶ï¼å¤çä¸çº§èå'); |
| | | |
| | | // æ¯æä¸çº§èåçæ
åµ |
| | | if (firstVisibleChild.children && firstVisibleChild.children.length > 0) { |
| | | const grandChild = firstVisibleChild.children.find(child => !child.hidden); |
| | | if (grandChild) { |
| | | console.log('æ¾å°ç¬¬ä¸çº§èå:', JSON.stringify(grandChild, null, 2)); |
| | | |
| | | // 夿æ¯å¦åºè¯¥ä½¿ç¨parentPath |
| | | if (firstVisibleChild.parentPath && grandChild.path.startsWith('/')) { |
| | | console.log('使ç¨parentPath屿§:', firstVisibleChild.parentPath); |
| | | // 妿åè忝ç»å¯¹è·¯å¾ï¼ä½æparentPathï¼ååºè¯¥ä½¿ç¨parentPathä½ä¸ºåºç¡ |
| | | let fullPath = firstVisibleChild.parentPath; |
| | | if (!fullPath.startsWith('/')) { |
| | | fullPath = '/' + fullPath; |
| | | } |
| | | |
| | | // 第äºçº§è·¯å¾åºäºæ ¹è·¯å¾ |
| | | if (firstVisibleChild.path.startsWith('/')) { |
| | | // 第äºçº§å·²ç»æ¯ç»å¯¹è·¯å¾ï¼æªåæåé¨å |
| | | const pathParts = firstVisibleChild.path.split('/'); |
| | | const lastPart = pathParts[pathParts.length - 1]; |
| | | fullPath = fullPath + '/' + lastPart; |
| | | } else { |
| | | fullPath = buildFullPath(fullPath, firstVisibleChild.path); |
| | | } |
| | | console.log('äºçº§è·¯å¾:', fullPath); |
| | | |
| | | // 第ä¸çº§è·¯å¾åºäºäºçº§è·¯å¾ |
| | | if (grandChild.path.startsWith('/')) { |
| | | // 第ä¸çº§æ¯ç»å¯¹è·¯å¾ï¼æªåæåé¨å |
| | | const pathParts = grandChild.path.split('/'); |
| | | const lastPart = pathParts[pathParts.length - 1]; |
| | | fullPath = fullPath + '/' + lastPart; |
| | | } else { |
| | | fullPath = buildFullPath(fullPath, grandChild.path); |
| | | } |
| | | console.log('ä¸çº§è·¯å¾ (æç»):', fullPath); |
| | | |
| | | // 导èªå°ç¬¬ä¸çº§èå |
| | | if (grandChild.query) { |
| | | router.push({ path: fullPath, query: grandChild.query }); |
| | | } else { |
| | | router.push({ path: fullPath }); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | // 常è§è·¯å¾æå»º |
| | | let fullPath; |
| | | |
| | | // 第ä¸çº§è·¯å¾å¿
é¡»æ¯å®æ´çï¼ä¾å¦/systemï¼ |
| | | if (currentNode.path.startsWith('/')) { |
| | | fullPath = currentNode.path; |
| | | } else { |
| | | fullPath = '/' + currentNode.path; |
| | | } |
| | | console.log('ä¸çº§è·¯å¾:', fullPath); |
| | | |
| | | // 第äºçº§è·¯å¾å¿
é¡»åºäºç¬¬ä¸çº§è·¯å¾ï¼ä¾å¦/system/logï¼ |
| | | fullPath = buildFullPath(fullPath, firstVisibleChild.path); |
| | | console.log('äºçº§è·¯å¾:', fullPath); |
| | | |
| | | // 第ä¸çº§è·¯å¾å¿
é¡»åºäºäºçº§è·¯å¾ï¼ä¾å¦/system/log/operlogï¼ |
| | | fullPath = buildFullPath(fullPath, grandChild.path); |
| | | console.log('ä¸çº§è·¯å¾ (æç»):', fullPath); |
| | | |
| | | // 导èªå°ç¬¬ä¸çº§èå |
| | | if (grandChild.query) { |
| | | console.log('跳转å°:', fullPath, '另忰:', grandChild.query); |
| | | router.push({ path: fullPath, query: grandChild.query }); |
| | | } else { |
| | | console.log('跳转å°:', fullPath); |
| | | router.push({ path: fullPath }); |
| | | } |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | |
| | | console.log('å¤çæ åäºçº§èå'); |
| | | |
| | | // æ£æ¥æ¯å¦éè¦ä½¿ç¨parentPath |
| | | if (firstVisibleChild.parentPath && firstVisibleChild.path.startsWith('/')) { |
| | | console.log('使ç¨parentPath屿§:', firstVisibleChild.parentPath); |
| | | // 妿åè忝ç»å¯¹è·¯å¾ï¼ä½æparentPathï¼ååºè¯¥ä½¿ç¨parentPathä½ä¸ºåºç¡ |
| | | let fullPath = firstVisibleChild.parentPath; |
| | | if (!fullPath.startsWith('/')) { |
| | | fullPath = '/' + fullPath; |
| | | } |
| | | |
| | | // æå»ºå®æ´è·¯å¾ |
| | | if (firstVisibleChild.path.startsWith('/')) { |
| | | // æªååè·¯å¾çæåé¨å |
| | | const pathParts = firstVisibleChild.path.split('/'); |
| | | const lastPart = pathParts[pathParts.length - 1]; |
| | | fullPath = fullPath + '/' + lastPart; |
| | | } else { |
| | | fullPath = buildFullPath(fullPath, firstVisibleChild.path); |
| | | } |
| | | console.log('æå»ºçæç»è·¯å¾:', fullPath); |
| | | |
| | | // 导èªå°ç®æ è·¯ç± |
| | | if (firstVisibleChild.query) { |
| | | router.push({ path: fullPath, query: firstVisibleChild.query }); |
| | | } else { |
| | | router.push({ path: fullPath }); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | // æ åçäºçº§èåå¤ç |
| | | // æå»ºæ£ç¡®çè·¯å¾ |
| | | let fullPath; |
| | | |
| | | // å¤ç第ä¸çº§è·¯å¾ï¼ä¾å¦/systemï¼- å¿
é¡»æ¯å®æ´çè·¯å¾ |
| | | if (currentNode.path.startsWith('/')) { |
| | | fullPath = currentNode.path; |
| | | } else { |
| | | fullPath = '/' + currentNode.path; |
| | | } |
| | | console.log('ä¸çº§è·¯å¾:', fullPath); |
| | | |
| | | // å¤ç第äºçº§è·¯å¾ï¼ä¾å¦/system/userï¼- å¿
é¡»åºäºç¬¬ä¸çº§è·¯å¾ |
| | | fullPath = buildFullPath(fullPath, firstVisibleChild.path); |
| | | console.log('äºçº§è·¯å¾ (æç»):', fullPath); |
| | | |
| | | // 导èªå°ç®æ è·¯ç± |
| | | if (firstVisibleChild.query) { |
| | | console.log('跳转å°:', fullPath, '另忰:', firstVisibleChild.query); |
| | | router.push({ path: fullPath, query: firstVisibleChild.query }); |
| | | } else { |
| | | console.log('跳转å°:', fullPath); |
| | | router.push({ path: fullPath }); |
| | | } |
| | | } |
| | | } |
| | | |
| | | function hasOneShowingChild(children = [], parent) { |
| | | if (!children) { |
| | | children = []; |
| | |
| | | }) |
| | | |
| | | // When there is only one child router, the child router is displayed by default |
| | | if (showingChildren.length === 1) { |
| | | if (showingChildren.length === 1 && !showingChildren[0].children) { |
| | | return true |
| | | } |
| | | |
| | | // If the single child also has children, don't treat it as a single showing child |
| | | if (showingChildren.length === 1 && showingChildren[0].children && showingChildren[0].children.length > 0) { |
| | | return false |
| | | } |
| | | |
| | | // Show parent if there are no child router to display |
| | |
| | | return getNormalPath(props.basePath + '/' + routePath) |
| | | } |
| | | |
| | | // æ£ç¡®æå»ºè·¯å¾ |
| | | function buildFullPath(base, segment) { |
| | | // 妿segmentæ¯ç»å¯¹è·¯å¾ï¼ç´æ¥è¿å |
| | | if (segment.startsWith('/')) { |
| | | return segment; |
| | | } |
| | | |
| | | // ç¡®ä¿baseææ£ç¡®çå¼å¤´ææ |
| | | const normalizedBase = base.startsWith('/') ? base : '/' + base; |
| | | |
| | | // æ¼æ¥è·¯å¾ï¼é¿å
åææ |
| | | return normalizedBase.endsWith('/') ? normalizedBase + segment : normalizedBase + '/' + segment; |
| | | } |
| | | |
| | | function hasTitle(title){ |
| | | if (title.length > 5) { |
| | | return title; |
| | |
| | | <div |
| | | :class="{ 'has-logo': showLogo }" |
| | | :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }" |
| | | class="sidebar-container-wrapper" |
| | | > |
| | | <el-scrollbar :class="sideTheme" wrap-class="scrollbar-wrapper"> |
| | | <!-- é¦é¡µæ¶ä¸æ¾ç¤ºä»»ä½èå项 --> |
| | | <el-scrollbar :class="sideTheme" wrap-class="scrollbar-wrapper" view-class="scrollbar-view"> |
| | | <!-- å§ç»æ¾ç¤ºèå项ï¼ä¸åæ ¹æ®è·¯å¾å¤æ --> |
| | | <el-menu |
| | | v-if="!isHomePage" |
| | | :default-active="activeMenu" |
| | | :collapse="isCollapse" |
| | | :background-color="'transparent'" |
| | |
| | | mode="vertical" |
| | | class="custom-menu" |
| | | > |
| | | <!-- å½åæ¯é¦é¡µçæ¿åè·¯ç±æ¶ï¼æ¸²æä¸ç¨è·¯ç± --> |
| | | <template v-if="isIndexSubRoute"> |
| | | <sidebar-item |
| | | v-for="(route, index) in indexPageRouters" |
| | | :key="route.path + index" |
| | | :item="route" |
| | | :base-path="route.path" |
| | | /> |
| | | </template> |
| | | <template v-else> |
| | | <sidebar-item |
| | | v-for="(route, index) in sidebarRouters" |
| | | :key="route.path + index" |
| | | :item="route" |
| | | :base-path="route.path" |
| | | /> |
| | | </template> |
| | | </el-menu> |
| | | <!-- é¦é¡µæ¶ç空ç½åºå --> |
| | | <div v-else class="home-empty-menu"></div> |
| | | </el-scrollbar> |
| | | |
| | | <!-- åºé¨ç¨æ·åºå --> |
| | |
| | | |
| | | const sidebarRouters = computed(() => permissionStore.sidebarRouters) |
| | | |
| | | // 夿å½åæ¯å¦ä¸ºé¦é¡µ |
| | | const isHomePage = computed(() => { |
| | | return route.path === '/index' || route.path === '/' || route.fullPath.startsWith('/index') |
| | | // 夿å½åæ¯å¦ä¸ºé¦é¡µåè·¯ç±(/index/index) |
| | | const isIndexSubRoute = computed(() => { |
| | | return route.path === '/index/index' |
| | | }) |
| | | |
| | | // é¦é¡µä¸ç¨è·¯ç±ï¼åªæé¦é¡µä¸ä¸ªèå项 |
| | | const homePageRouters = computed(() => { |
| | | // ä»åå§è·¯ç±ä¸çéåºé¦é¡µè·¯ç± |
| | | const homeRoute = sidebarRouters.value.find(route => { |
| | | return route.children && route.children.find(child => child.path === '/index') |
| | | // 夿å½åæ¯å¦ä¸ºä¸»é¦é¡µè·¯ç±(/indexæ/) |
| | | const isMainIndexRoute = computed(() => { |
| | | return route.path === '/index' || route.path === '/' |
| | | }) |
| | | |
| | | return homeRoute ? [homeRoute] : [] |
| | | // é¦é¡µä¸ç¨è·¯ç±ï¼é¦é¡µçæ¿ç¸å
³èå |
| | | const indexPageRouters = computed(() => { |
| | | // æ¥æ¾name为Indexçè·¯ç± |
| | | const indexRoute = sidebarRouters.value.find(route => route.name === 'Index') |
| | | return indexRoute ? [indexRoute] : [] |
| | | }) |
| | | |
| | | const showLogo = computed(() => settingsStore.sidebarLogo) |
| | |
| | | } |
| | | </script> |
| | | <style lang="scss" scoped> |
| | | :deep(.custom-menu) { |
| | | .sidebar-container-wrapper { |
| | | position: relative; |
| | | height: 100%; |
| | | overflow: hidden; |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | :deep(.scrollbar-wrapper) { |
| | | height: calc(100% - 220px) !important; |
| | | overflow-x: hidden !important; |
| | | } |
| | | |
| | | :deep(.scrollbar-view) { |
| | | height: 100%; |
| | | padding-bottom: 20px; |
| | | } |
| | | |
| | | :deep(.el-scrollbar__bar.is-vertical) { |
| | | right: 0; |
| | | width: 6px; |
| | | } |
| | | |
| | | :deep(.el-scrollbar__thumb) { |
| | | background-color: rgba(144, 147, 153, 0.3); |
| | | &:hover { |
| | | background-color: rgba(144, 147, 153, 0.5); |
| | | } |
| | | } |
| | | |
| | | .custom-menu { |
| | | width: 100%; |
| | | padding: 6px 0; |
| | | height: calc(100% - 150px); // çåºåºé¨ç¨æ·åºåçç©ºé´ |
| | | height: auto !important; // æ¹ä¸ºèªéåºé«åº¦ï¼é¿å
åºå®é«åº¦å¯¼è´å
å®¹æº¢åº |
| | | transition: all 0.3s ease; |
| | | |
| | | // Override Element Plus default menu styles |
| | | .el-menu-item { |
| | |
| | | border-radius: 4px; |
| | | margin: 4px 10px; |
| | | width: calc(100% - 20px); |
| | | transition: all 0.2s ease; |
| | | |
| | | &.is-active { |
| | | background-color: #3883FA !important; |
| | | color: #fff !important; |
| | | font-weight: bold; |
| | | position: relative; |
| | | box-shadow: 0 2px 8px rgba(56, 131, 250, 0.5); |
| | | |
| | | // 左侧æç¤ºæ¡ |
| | | |
| | | } |
| | | |
| | | &:hover { |
| | |
| | | border-radius: 4px; |
| | | margin: 4px 10px; |
| | | width: calc(100% - 20px); |
| | | transition: all 0.2s ease; |
| | | |
| | | &:hover { |
| | | background-color: rgba(56, 131, 250, 0.1) !important; |
| | | } |
| | | } |
| | | |
| | | &.is-active { |
| | | > .el-sub-menu__title { |
| | | color: #3883FA !important; |
| | | font-weight: bold; |
| | | } |
| | | } |
| | | |
| | |
| | | height: 38px !important; |
| | | line-height: 38px !important; |
| | | } |
| | | |
| | | // Add styling for deeply nested submenus (level 3+) |
| | | .el-sub-menu { |
| | | .el-menu-item { |
| | | padding-left: 65px !important; |
| | | |
| | | &.is-active { |
| | | padding-left: 65px !important; |
| | | } |
| | | } |
| | | |
| | | // Level 4 |
| | | .el-menu { |
| | | .el-menu-item { |
| | | padding-left: 85px !important; |
| | | |
| | | &.is-active { |
| | | padding-left: 85px !important; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // é¦é¡µç©ºç½èååºåæ ·å¼ |
| | | .home-empty-menu { |
| | | height: calc(100% - 150px); |
| | | height: auto; |
| | | min-height: 100px; |
| | | } |
| | | |
| | | // åºé¨ç¨æ·åºåæ ·å¼ |
| | | .sidebar-footer { |
| | | position: absolute; |
| | | bottom: 72px; |
| | | bottom: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | border-top: 1px solid rgba(255, 255, 255, 0.1); |
| | |
| | | } |
| | | } |
| | | |
| | | // æ·»å æ·±è²æ¨¡å¼ä¸ç¨æ ·å¼ |
| | | .theme-dark { |
| | | :deep(.custom-menu) { |
| | | // Override Element Plus menu styles for dark theme |
| | | .el-menu-item { |
| | | &.is-active { |
| | | background-color: #4e77f8 !important; |
| | | color: #ffffff !important; |
| | | font-weight: bold; |
| | | box-shadow: 0 2px 10px rgba(78, 119, 248, 0.6); |
| | | position: relative; |
| | | |
| | | // 左侧æç¤ºæ¡ |
| | | |
| | | } |
| | | |
| | | &:hover { |
| | | background-color: rgba(78, 119, 248, 0.2) !important; |
| | | } |
| | | } |
| | | |
| | | .el-sub-menu { |
| | | &.is-active { |
| | | > .el-sub-menu__title { |
| | | color: #4e77f8 !important; |
| | | font-weight: bold; |
| | | } |
| | | } |
| | | |
| | | .el-sub-menu__title { |
| | | &:hover { |
| | | background-color: rgba(78, 119, 248, 0.2) !important; |
| | | } |
| | | } |
| | | |
| | | // åµå¥åèåæ ·å¼ |
| | | .el-menu { |
| | | .el-menu-item { |
| | | &.is-active { |
| | | background-color: #4e77f8 !important; |
| | | color: #ffffff !important; |
| | | } |
| | | } |
| | | |
| | | .el-sub-menu { |
| | | &.is-active { |
| | | > .el-sub-menu__title { |
| | | color: #4e77f8 !important; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // Add global style to override Element Plus defaults |
| | | :global(.el-menu--vertical .el-menu-item), |
| | | :global(.el-menu--vertical .el-sub-menu__title) { |
| | | height: 38px !important; |
| | | line-height: 38px !important; |
| | | } |
| | | |
| | | // Add styles for collapsed menu items |
| | | :deep(.custom-menu.el-menu--collapse) { |
| | | width: 54px !important; |
| | | |
| | | .el-menu-item, .el-sub-menu__title { |
| | | width: 36px !important; |
| | | min-width: 36px !important; |
| | | margin: 4px 9px !important; /* 9pxæ¯ä¸ºäºç¡®ä¿å±
ä¸ï¼(54px宽 - 36pxèå项) / 2 = 9px */ |
| | | padding: 0 !important; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | border-radius: 4px; |
| | | |
| | | &.is-active { |
| | | background-color: #3883FA !important; |
| | | color: #fff !important; |
| | | box-shadow: 0 2px 6px rgba(56, 131, 250, 0.4); |
| | | transform: scale(0.95); |
| | | transition: all 0.2s ease; |
| | | } |
| | | |
| | | .el-icon, .svg-icon { |
| | | margin: 0 !important; |
| | | font-size: 18px !important; |
| | | |
| | | svg { |
| | | width: 1.2em; |
| | | height: 1.2em; |
| | | } |
| | | } |
| | | |
| | | // ç¡®ä¿æå æ¶åèåçæ é¢ä¹å±
ä¸å¯¹é½ |
| | | .el-sub-menu__icon-arrow { |
| | | display: none; |
| | | } |
| | | } |
| | | |
| | | // ç¡®ä¿æå æ¶å¼¹åºçåèåææ£ç¡®æ ·å¼ |
| | | .el-tooltip__trigger:focus:not(.focusing) { |
| | | outline: none; |
| | | } |
| | | } |
| | | |
| | | // æ·±è²æ¨¡å¼ä¸æå èåçæ ·å¼ |
| | | .theme-dark { |
| | | :deep(.custom-menu.el-menu--collapse) { |
| | | .el-menu-item, .el-sub-menu__title { |
| | | &.is-active { |
| | | background-color: #4e77f8 !important; |
| | | color: #ffffff !important; |
| | | box-shadow: 0 2px 8px rgba(78, 119, 248, 0.6); |
| | | } |
| | | |
| | | &:hover { |
| | | background-color: rgba(78, 119, 248, 0.2) !important; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | bottom: 0px; |
| | | } |
| | | :deep(.el-scrollbar__wrap) { |
| | | height: 39px; |
| | | height: 34px !important; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div id="tags-view-container" class="tags-view-container"> |
| | | <div id="tags-view-container" class="tags-view-container" :class="{'theme-dark': sideTheme === 'theme-dark', 'theme-light': sideTheme === 'theme-light'}"> |
| | | <scroll-pane ref="scrollPaneRef" class="tags-view-wrapper" @scroll="handleScroll"> |
| | | <router-link |
| | | v-for="tag in visitedViews" |
| | |
| | | const visitedViews = computed(() => useTagsViewStore().visitedViews) |
| | | const routes = computed(() => usePermissionStore().routes) |
| | | const theme = computed(() => useSettingsStore().theme) |
| | | const sideTheme = computed(() => useSettingsStore().sideTheme) |
| | | |
| | | watch(route, () => { |
| | | addTags() |
| | |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .themeDark { |
| | | .tags-view-container { |
| | | height: 52px; |
| | | width: 100%; |
| | | background: #1a235d; |
| | | // border-bottom: 1px solid #d8dce5; |
| | | box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04); |
| | | .tags-view-wrapper { |
| | | .tags-view-item { |
| | | display: inline-block; |
| | | position: relative; |
| | | cursor: pointer; |
| | | height: 32px; |
| | | line-height: 30px; |
| | | border: 1px solid #5278f5; |
| | | color: #fff; |
| | | // background: #3271eb; |
| | | padding: 0 12px; |
| | | font-size: 14px; |
| | | margin-left: 6px; |
| | | height: 34px; |
| | | width: calc(100% - 42px); |
| | | margin-top: 10px; |
| | | border-radius: 4px; |
| | | font-family: OPPOSans, OPPOSans; |
| | | &:first-of-type { |
| | | margin-left: 16px; |
| | | } |
| | | &:last-of-type { |
| | | margin-right: 15px; |
| | | } |
| | | &.active { |
| | | background-color: #4e77f8 !important; |
| | | margin-left: 14px; |
| | | box-sizing: border-box; |
| | | box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04); |
| | | |
| | | &.theme-dark { |
| | | background: #0A3465; |
| | | .tags-view-item { |
| | | color: #fff; |
| | | border-color: #4e77f8 !important; |
| | | &::before { |
| | | content: ""; |
| | | background: #fff; |
| | | display: inline-block; |
| | | width: 8px; |
| | | height: 8px; |
| | | border-radius: 50%; |
| | | position: relative; |
| | | margin-right: 5px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .contextmenu { |
| | | margin: 0; |
| | | background: #fff; |
| | | z-index: 3000; |
| | | position: absolute; |
| | | list-style-type: none; |
| | | padding: 5px 0; |
| | | border-radius: 4px; |
| | | font-size: 12px; |
| | | font-weight: 400; |
| | | color: #333; |
| | | box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3); |
| | | li { |
| | | margin: 0; |
| | | padding: 7px 16px; |
| | | cursor: pointer; |
| | | &:hover { |
| | | background: #eee; |
| | | } |
| | | } |
| | | border: 1px solid #0c4685; |
| | | background: rgba(10, 52, 101, .48); |
| | | border-radius: 5px; |
| | | |
| | | &.active { |
| | | background-color: var(--el-color-primary) !important; |
| | | color: #fff !important; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .themeLight { |
| | | .tags-view-container { |
| | | height: 52px; |
| | | width: 100%; |
| | | &.theme-light { |
| | | background: #fff; |
| | | // border-bottom: 1px solid #d8dce5; |
| | | box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04); |
| | | .tags-view-item { |
| | | color: #495060; |
| | | background: #fff; |
| | | border: 1px solid #d8dce5; |
| | | |
| | | &.active { |
| | | background-color: var(--el-color-primary) !important; |
| | | color: #fff !important; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .tags-view-wrapper { |
| | | .tags-view-item { |
| | | display: inline-block; |
| | | position: relative; |
| | | cursor: pointer; |
| | | height: 32px; |
| | | line-height: 30px; |
| | | border: 1px solid #d8dce5; |
| | | color: #495060; |
| | | background: #fff; |
| | | padding: 0 12px; |
| | | font-size: 14px; |
| | | margin-left: 6px; |
| | | margin-top: 10px; |
| | | border-radius: 4px; |
| | | font-family: OPPOSans, OPPOSans; |
| | | height: 26px; |
| | | line-height: 26px; |
| | | border-radius: 3px; |
| | | padding: 0 10px; |
| | | font-size: 12px; |
| | | margin-left: 5px; |
| | | margin-top: 4px; |
| | | &:first-of-type { |
| | | margin-left: 16px; |
| | | margin-left: 5px; |
| | | } |
| | | &:last-of-type { |
| | | margin-right: 15px; |
| | | margin-right: 5px; |
| | | } |
| | | &.active { |
| | | background-color: #42b983; |
| | |
| | | height: 8px; |
| | | border-radius: 50%; |
| | | position: relative; |
| | | margin-right: 5px; |
| | | margin-right: 2px; |
| | | } |
| | | } |
| | | } |
| | |
| | | cursor: pointer; |
| | | &:hover { |
| | | background: #eee; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | .scroll-container .el-scrollbar__wrap { |
| | | height: 50px !important; |
| | | height: 34px !important; |
| | | } |
| | | </style> |
| | |
| | | <img v-if="sideTheme === 'theme-dark'" :src="systemInfo.leftLogo" class="sidebar-logo" /> |
| | | <img v-else :src="systemInfo.leftLogo" class="sidebar-logo" /> |
| | | </div> |
| | | <div class="name" v-if="sidebar.opened" :style="{ color: '#fff' }"> |
| | | <div class="name" v-if="sidebar.opened" :style="{ color: sideTheme === 'theme-dark' ? '#fff' : '#333' }"> |
| | | {{ title }} |
| | | </div> |
| | | </div> |
| | |
| | | |
| | | // è·³è½¬å°æ¥è¦é¡µé¢ |
| | | function goToAlarm() { |
| | | router.push('/alarm/list') |
| | | router.push('/alarmmanage/measuremen?modelCode=BJGL') |
| | | } |
| | | |
| | | // æå¼AI大模åå¯¹è¯æ¡ |
| | | function openAIModel() { |
| | | // è¿éå¯ä»¥å®ç°æå¼AIå¯¹è¯æ¡çé»è¾ |
| | | console.log('æå¼AI大模åå¯¹è¯æ¡') |
| | | // è·³è½¬å°æå®çURL |
| | | window.open('https://deepseek.tan-zhonghe.com/chat', '_blank') |
| | | } |
| | | |
| | | const classObj = computed(() => ({ |
| | |
| | | |
| | | // çå¬è·¯ç±ååï¼å¤çé¦é¡µçä¾§è¾¹æ æ¾ç¤º |
| | | watchEffect(() => { |
| | | // æ£æ¥æ¯å¦æ¯é¦é¡µè·¯ç± |
| | | if (route.path === '/index' || route.path === '/') { |
| | | // æ£æ¥æ¯å¦æ¯é¦é¡µè·¯ç±ï¼ä½æé¤/index/indexåè·¯ç± |
| | | if ((route.path === '/index' || route.path === '/') && route.path !== '/index/index') { |
| | | // é¦é¡µè·¯ç±ï¼ç¡®ä¿ä¾§è¾¹æ ä¸éèï¼ä½ç¶ææ¯æå ç |
| | | appStore.showCollapsedSidebar() |
| | | appStore.toggleSideBarHide(false) // æ¹ä¸ºä¸éèä¾§è¾¹æ |
| | | } else if (route.meta && route.meta.showSidebar === false) { |
| | | // å¦æè·¯ç±æç¡®æå®éèä¾§è¾¹æ |
| | | appStore.toggleSideBarHide(true) |
| | | } else { |
| | | // å
¶ä»è·¯ç±ï¼ç¡®ä¿ä¾§è¾¹æ å¯è§ |
| | | appStore.toggleSideBarHide(false) |
| | | } |
| | | }) |
| | | |
| | | // ç»ä»¶æè½½æ¶ï¼ç¡®ä¿é¦é¡µä¾§è¾¹æ ç¶ææ£ç¡® |
| | | onMounted(() => { |
| | | // 妿å½åæ¯é¦é¡µï¼ç¡®ä¿ä¾§è¾¹æ æ¯æå çè䏿¯éèç |
| | | if (route.path === '/index' || route.path === '/') { |
| | | appStore.showCollapsedSidebar() |
| | | // 妿å½åæ¯é¦é¡µå页é¢ï¼åªç¡®ä¿ä¾§è¾¹æ ä¸è¢«éèï¼ä½ä¿ææå /å±å¼ç¶æä¸å |
| | | if (route.path === '/index/index') { |
| | | // åªè®¾ç½®ä¸éèä¾§è¾¹æ ï¼ä½ä¸æ¹åå
¶å±å¼/æå ç¶æ |
| | | appStore.toggleSideBarHide(false) |
| | | // ä¸å强å¶è®¾ç½®opened为trueï¼ä¿æç¨æ·ä¹åç设置 |
| | | } |
| | | }) |
| | | |
| | |
| | | top: 60px; |
| | | right: 0; |
| | | z-index: 9; |
| | | width: 100%; |
| | | width: calc(100% - #{$base-sidebar-width}); |
| | | transition: width 0.28s; |
| | | display: flex; |
| | | flex-direction: column; |
| | | box-sizing: border-box; |
| | | padding: 0; |
| | | } |
| | | |
| | | .hideSidebar .fixed-header { |
| | | width: calc(100% - 54px); |
| | | } |
| | | |
| | | .sidebarHide .fixed-header { |
| | | width: 100%; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | .themeDark { |
| | | .navbar-container { |
| | | background: #1a235d; |
| | | border-bottom: 2px solid #110f2e; |
| | | } |
| | | |
| | | .navbar { |
| | | background: transparent !important; |
| | | background: #002866 !important; |
| | | } |
| | | |
| | | .sidebar-container { |
| | | background-color: #002866 !important; |
| | | } |
| | | } |
| | | |
| | | .themeLight { |
| | | .navbar-container { |
| | | background: #3883FA; |
| | | } |
| | | |
| | | .navbar { |
| | | background: transparent !important; |
| | | |
| | | .left { |
| | | .sidebar-logo-container { |
| | | .name { |
| | | color: #fff !important; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .right { |
| | | .right-menu { |
| | | .right-menu-item { |
| | | color: #fff; |
| | | |
| | | .right-menu-icon { |
| | | color: #fff; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | |
| | | const whiteList = ['/login', '/register', '/energy'] |
| | | |
| | | /** |
| | | * æ¥æ¾ææ·±å±çåèåå¹¶æå»ºå®æ´è·¯å¾ |
| | | */ |
| | | function findDeepestPath(route) { |
| | | if (!route) return { path: null, query: null }; |
| | | |
| | | // é¦å
æ·»å å½åèç¹çè·¯å¾ |
| | | let currentNode = route; |
| | | let pathSegments = []; |
| | | |
| | | if (currentNode.path) { |
| | | pathSegments.push(currentNode.path); |
| | | } |
| | | |
| | | // é屿·»å åè·¯å¾ |
| | | while (currentNode.children && currentNode.children.length > 0) { |
| | | const firstChild = currentNode.children.find(child => !child.hidden); |
| | | if (!firstChild) break; |
| | | |
| | | // è·³è¿ParentViewç±»åçä¸é´èç¹ |
| | | if (firstChild.component === 'ParentView' || |
| | | (typeof firstChild.component === 'object' && |
| | | firstChild.component.name === 'ParentView')) { |
| | | currentNode = firstChild; |
| | | // å¦æè·¯å¾ä¸æ¯ä»¥/å¼å¤´ï¼åæ·»å å°è·¯å¾çæ®µä¸ |
| | | if (!firstChild.path.startsWith('/')) { |
| | | pathSegments.push(firstChild.path); |
| | | } else { |
| | | // 妿æ¯ç»å¯¹è·¯å¾ï¼åæ¿æ¢ä¹åææè·¯å¾ |
| | | pathSegments = [firstChild.path]; |
| | | } |
| | | continue; |
| | | } |
| | | |
| | | // æ®éèç¹å¤ç |
| | | currentNode = firstChild; |
| | | // å¦æè·¯å¾ä¸æ¯ä»¥/å¼å¤´ï¼åæ·»å å°è·¯å¾çæ®µä¸ |
| | | if (!firstChild.path.startsWith('/')) { |
| | | pathSegments.push(firstChild.path); |
| | | } else { |
| | | // 妿æ¯ç»å¯¹è·¯å¾ï¼åæ¿æ¢ä¹åææè·¯å¾ |
| | | pathSegments = [firstChild.path]; |
| | | } |
| | | |
| | | // 妿å°è¾¾å¶åèç¹ï¼åç»ææ¥æ¾ |
| | | if (!firstChild.children || firstChild.children.length === 0) { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // æå»ºæç»è·¯å¾ |
| | | let targetPath = ''; |
| | | if (pathSegments.length > 0) { |
| | | // å¦æç¬¬ä¸æ®µä¸æ¯ä»¥/å¼å¤´ï¼æ·»å / |
| | | if (!pathSegments[0].startsWith('/')) { |
| | | pathSegments[0] = '/' + pathSegments[0]; |
| | | } |
| | | |
| | | // ç»åè·¯å¾ |
| | | targetPath = pathSegments.reduce((fullPath, segment, index) => { |
| | | if (segment.startsWith('/')) { |
| | | return segment; |
| | | } else if (index === 0) { |
| | | return segment; |
| | | } else { |
| | | // ç¡®ä¿è·¯å¾ä¹é´ä¸ä¼åºç°éå¤çææ |
| | | const base = fullPath.endsWith('/') ? fullPath.slice(0, -1) : fullPath; |
| | | const part = segment.startsWith('/') ? segment : '/' + segment; |
| | | return `${base}${part}`; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | return { |
| | | path: targetPath, |
| | | query: currentNode.query |
| | | }; |
| | | } |
| | | |
| | | router.beforeEach((to, from, next) => { |
| | | NProgress.start() |
| | | if (getToken()) { |
| | |
| | | if (topMenus.length > 0) { |
| | | // 跳转å°ç¬¬ä¸ä¸ªèå |
| | | const firstMenu = topMenus[0] |
| | | if (firstMenu.children && firstMenu.children.length > 0) { |
| | | // æåèåï¼è·³è½¬å°ç¬¬ä¸ä¸ªåèå |
| | | |
| | | // æ¥æ¾ææ·±å±çåèåå¹¶æå»ºè·¯å¾ |
| | | const { path, query } = findDeepestPath(firstMenu); |
| | | |
| | | if (path) { |
| | | // æææ·±å±åèåï¼è·³è½¬å°è¯¥èå |
| | | if (query) { |
| | | next({ path, query, replace: true }); |
| | | } else { |
| | | next({ path, replace: true }); |
| | | } |
| | | return; |
| | | } else if (firstMenu.children && firstMenu.children.length > 0) { |
| | | // 使ç¨åæé»è¾ |
| | | const firstChild = firstMenu.children[0] |
| | | const path = firstMenu.path.endsWith('/') ? firstMenu.path + firstChild.path : `${firstMenu.path}/${firstChild.path}` |
| | | next({ path: path, replace: true }) |
| | | const childPath = firstMenu.path.endsWith('/') ? firstMenu.path + firstChild.path : `${firstMenu.path}/${firstChild.path}` |
| | | next({ path: childPath, replace: true }) |
| | | return |
| | | } else { |
| | | // 没æåèåï¼ç´æ¥è·³è½¬ |
| | |
| | | if (topMenus.length > 0) { |
| | | // 跳转å°ç¬¬ä¸ä¸ªèå |
| | | const firstMenu = topMenus[0] |
| | | if (firstMenu.children && firstMenu.children.length > 0) { |
| | | // æåèåï¼è·³è½¬å°ç¬¬ä¸ä¸ªåèå |
| | | |
| | | // æ¥æ¾ææ·±å±çåèåå¹¶æå»ºè·¯å¾ |
| | | const { path, query } = findDeepestPath(firstMenu); |
| | | |
| | | if (path) { |
| | | // æææ·±å±åèåï¼è·³è½¬å°è¯¥èå |
| | | if (query) { |
| | | next({ path, query, replace: true }); |
| | | } else { |
| | | next({ path, replace: true }); |
| | | } |
| | | return; |
| | | } else if (firstMenu.children && firstMenu.children.length > 0) { |
| | | // 使ç¨åæé»è¾ |
| | | const firstChild = firstMenu.children[0] |
| | | const path = firstMenu.path.endsWith('/') ? firstMenu.path + firstChild.path : `${firstMenu.path}/${firstChild.path}` |
| | | next({ path: path, replace: true }) |
| | | const childPath = firstMenu.path.endsWith('/') ? firstMenu.path + firstChild.path : `${firstMenu.path}/${firstChild.path}` |
| | | next({ path: childPath, replace: true }) |
| | | return |
| | | } else { |
| | | // 没æåèåï¼ç´æ¥è·³è½¬ |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | // èªå¨å¤ç带æéå®åçè·¯ç± |
| | | if (to.matched.length > 0 && to.matched[0].path === to.path) { |
| | | const currentRouteConfig = router.getRoutes().find(r => r.path === to.path); |
| | | |
| | | if (currentRouteConfig && currentRouteConfig.children && currentRouteConfig.children.length > 0) { |
| | | // æåè·¯ç±ï¼èªå¨å¯¼èªå°ææ·±å±åèå |
| | | const { path, query } = findDeepestPath(currentRouteConfig); |
| | | |
| | | if (path && path !== to.path) { |
| | | if (query) { |
| | | next({ path, query, replace: true }); |
| | | } else { |
| | | next({ path, replace: true }); |
| | | } |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | |
| | | next() |
| | | } |
| | | } |
| | |
| | | path: '/index', |
| | | component: () => import('@/views/index'), |
| | | name: 'Index', |
| | | meta: { title: 'é¦é¡µ', icon: 'dashboard', affix: true, showSidebar: true, breadcrumb: false }, |
| | | beforeEnter: (to, from, next) => { |
| | | // è·åapp store并设置侧边æ 为æå ç¶æ |
| | | const appStore = useAppStore() |
| | | appStore.showCollapsedSidebar() |
| | | next() |
| | | } |
| | | meta: { title: 'é¦é¡µ', icon: 'dashboard', affix: true, showSidebar: true, breadcrumb: false } |
| | | } |
| | | ] |
| | | }, |
| | |
| | | }) |
| | | |
| | | // éååå°ä¼ æ¥çè·¯ç±å符串ï¼è½¬æ¢ä¸ºç»ä»¶å¯¹è±¡ |
| | | function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { |
| | | function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false, parentRoute = null) { |
| | | return asyncRouterMap.filter(route => { |
| | | // ä¸åè¿æ»¤æé¦é¡µçæ¿ç¸å
³è·¯ç± |
| | | /* |
| | | // è¿æ»¤æé¦é¡µçæ¿ç¸å
³è·¯ç± |
| | | if (route.name === 'Index' && route.meta && route.meta.title === 'é¦é¡µçæ¿') { |
| | | return false; |
| | | } |
| | | |
| | | // 妿æ¯é¦é¡µçæ¿çåèåï¼ä¹è¿æ»¤æ |
| | | if (route.path === '/index' || route.path === 'index' || |
| | | (route.meta && route.meta.title === 'é¦é¡µçæ¿')) { |
| | | return false; |
| | | } |
| | | */ |
| | | |
| | | // 设置ç¶è·¯ç±å¼ç¨ |
| | | if (parentRoute) { |
| | | route.parent = parentRoute; |
| | | } |
| | | |
| | | if (type && route.children) { |
| | | route.children = filterChildren(route.children) |
| | | } |
| | |
| | | } |
| | | } |
| | | if (route.children != null && route.children && route.children.length) { |
| | | route.children = filterAsyncRouter(route.children, route, type) |
| | | // å°å½åè·¯ç±ä½ä¸ºç¶è·¯ç±ä¼ éç»åè·¯ç± |
| | | route.children = filterAsyncRouter(route.children, route, type, route) |
| | | } else { |
| | | delete route['children'] |
| | | delete route['redirect'] |
| | |
| | | if (el.children && el.children.length) { |
| | | if (el.component === 'ParentView' && !lastRouter) { |
| | | el.children.forEach(c => { |
| | | c.path = el.path + '/' + c.path |
| | | // 设置ç¶è·¯ç±å¼ç¨ |
| | | c.parent = el; |
| | | |
| | | // ç¡®ä¿è·¯å¾æ ¼å¼æ£ç¡®æ¼æ¥ |
| | | if (el.path) { |
| | | if (c.path.startsWith('/')) { |
| | | // ç»å¯¹è·¯å¾ä¿æä¸å |
| | | // ä½ä¹è®¾ç½®åå§ç¶è·¯å¾ç¨äºèåå¯¼èª |
| | | c.parentPath = el.path; |
| | | } else { |
| | | // ç¸å¯¹è·¯å¾éè¦æ¼æ¥ |
| | | c.path = el.path.endsWith('/') ? el.path + c.path : el.path + '/' + c.path; |
| | | } |
| | | } |
| | | |
| | | if (c.children && c.children.length) { |
| | | children = children.concat(filterChildren(c.children, c)) |
| | | return |
| | |
| | | } |
| | | } |
| | | if (lastRouter) { |
| | | el.path = lastRouter.path + '/' + el.path |
| | | // 设置ç¶è·¯ç±å¼ç¨ |
| | | el.parent = lastRouter; |
| | | |
| | | // ç¡®ä¿è·¯å¾æ ¼å¼æ£ç¡®æ¼æ¥ |
| | | if (lastRouter.path) { |
| | | if (el.path.startsWith('/')) { |
| | | // ç»å¯¹è·¯å¾ä¿æä¸å |
| | | // ä½ä¹è®¾ç½®åå§ç¶è·¯å¾ç¨äºèåå¯¼èª |
| | | el.parentPath = lastRouter.path; |
| | | } else { |
| | | // ç¸å¯¹è·¯å¾éè¦æ¼æ¥ |
| | | el.path = lastRouter.path.endsWith('/') ? lastRouter.path + el.path : lastRouter.path + '/' + el.path; |
| | | } |
| | | } |
| | | |
| | | if (el.children && el.children.length) { |
| | | children = children.concat(filterChildren(el.children, el)) |
| | | return |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æ¶é´éæ©" prop="dataTime"> |
| | | <el-date-picker v-if="form.timeType == 'YEAR'" v-model="form.dataTime" type="year" /> |
| | | <el-date-picker v-if="form.timeType == 'YEAR'" v-model="form.dataTime" type="year" :clearable="false" /> |
| | | <el-date-picker |
| | | v-else-if="form.timeType == 'MONTH'" |
| | | v-model="form.dataTime" |
| | | type="month" |
| | | format="YYYY-MM" |
| | | value-format="YYYY-MM" |
| | | :clearable="false" |
| | | /> |
| | | <el-date-picker v-else v-model="form.dataTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" /> |
| | | <el-date-picker |
| | | v-else |
| | | v-model="form.dataTime" |
| | | :clearable="false" |
| | | type="date" |
| | | format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery">æç´¢</el-button> |
| | |
| | | getFlowCharts({ |
| | | energyType: form.value.energyType, |
| | | nodeId: "", |
| | | queryTime: form.value.dataTime, |
| | | queryTime: proxy.dayjs(new Date(form.value.dataTime)).format("YYYY-MM-DD"), |
| | | dataTime: proxy.dayjs(new Date(form.value.dataTime)).format("YYYY-MM-DD"), |
| | | timeType: form.value.timeType, |
| | | modelCode: proxy.$route.query.modelCode, |
| | | }).then((res) => { |
| | |
| | | display: flex; |
| | | justify-content: space-between; |
| | | padding-top: 12px; |
| | | padding: 12px 14px 0; |
| | | |
| | | .card-list-item { |
| | | width: 24%; |
| | |
| | | display: flex; |
| | | justify-content: space-between; |
| | | padding-top: 12px; |
| | | padding: 12px 14px 0; |
| | | |
| | | .card-list-item { |
| | | width: 24%; |
| | |
| | | margin-top: 14px; |
| | | display: flex; |
| | | width: 100%; |
| | | flex-wrap: wrap; |
| | | flex-wrap: nowrap; |
| | | justify-content: space-between; |
| | | gap: 15px; |
| | | |
| | | &:after { |
| | | content: ""; |
| | | flex: auto; |
| | | flex: 0 0 0; |
| | | } |
| | | |
| | | .card-list-item { |
| | | width: 320px; |
| | | height: 127px; |
| | | width: 0; |
| | | flex: 1 1 320px; |
| | | max-width: 320px; |
| | | height: 135px; |
| | | background: rgba(242, 246, 250, 0.1); |
| | | box-sizing: border-box; |
| | | padding: 16px; |
| | |
| | | } |
| | | |
| | | .item-left { |
| | | margin-right: 16px; |
| | | margin-right: 20px; |
| | | |
| | | .top-icon { |
| | | width: 73px; |
| | |
| | | font-size: 14px; |
| | | font-family: OPPOSans-Regular; |
| | | color: rgba(255, 255, 255, 0.65); |
| | | letter-spacing: 0.5px; |
| | | margin-bottom: 4px; |
| | | |
| | | .unit { |
| | | color: rgba(255, 255, 255, 0.65); |
| | | margin-left: 2px; |
| | | margin-left: 4px; |
| | | font-size: 12px; |
| | | font-weight: normal; |
| | | } |
| | |
| | | .right-value { |
| | | font-weight: 500; |
| | | font-size: 26px; |
| | | margin-top: 4px; |
| | | margin-top: 6px; |
| | | font-family: OPPOSans-Medium; |
| | | color: #fff; |
| | | line-height: 1; |
| | | line-height: 1.2; |
| | | letter-spacing: 0.5px; |
| | | } |
| | | } |
| | | |
| | | .item-bottom { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-top: 14px; |
| | | margin-top: 18px; |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: normal; |
| | | font-size: 12px; |
| | | color: rgba(255, 255, 255, 0.5); |
| | | line-height: 1; |
| | | line-height: 1.2; |
| | | |
| | | .bottom-left, .bottom-right { |
| | | display: flex; |
| | | align-items: center; |
| | | letter-spacing: 0.3px; |
| | | |
| | | :deep(.el-icon) { |
| | | margin-left: 4px; |
| | | margin-left: 6px; |
| | | font-size: 12px; |
| | | } |
| | | } |
| | |
| | | .themeLight { |
| | | .page { |
| | | padding: 20px; |
| | | background: #f7f8fa; |
| | | background: #fff; |
| | | |
| | | .card-title { |
| | | width: 132px; |
| | |
| | | margin-top: 14px; |
| | | display: flex; |
| | | width: 100%; |
| | | flex-wrap: wrap; |
| | | flex-wrap: nowrap; |
| | | justify-content: space-between; |
| | | gap: 15px; |
| | | |
| | | &:after { |
| | | content: ""; |
| | | flex: auto; |
| | | flex: 0 0 0; |
| | | } |
| | | |
| | | .card-list-item { |
| | | width: 320px; |
| | | height: 127px; |
| | | width: 0; |
| | | flex: 1 1 320px; |
| | | max-width: 320px; |
| | | height: 135px; |
| | | background: #fff; |
| | | box-sizing: border-box; |
| | | padding: 16px; |
| | |
| | | align-items: center; |
| | | |
| | | .item-left { |
| | | margin-right: 16px; |
| | | margin-right: 20px; |
| | | |
| | | .top-icon { |
| | | width: 73px; |
| | |
| | | font-size: 14px; |
| | | font-family: OPPOSans-Regular; |
| | | color: rgba(0, 0, 0, 0.65); |
| | | letter-spacing: 0.5px; |
| | | margin-bottom: 4px; |
| | | |
| | | .unit { |
| | | color: rgba(0, 0, 0, 0.65); |
| | | margin-left: 2px; |
| | | margin-left: 4px; |
| | | font-size: 12px; |
| | | font-weight: normal; |
| | | } |
| | |
| | | .right-value { |
| | | font-weight: 500; |
| | | font-size: 26px; |
| | | margin-top: 4px; |
| | | margin-top: 6px; |
| | | font-family: OPPOSans-Medium; |
| | | color: #333; |
| | | line-height: 1; |
| | | line-height: 1.2; |
| | | letter-spacing: 0.5px; |
| | | } |
| | | } |
| | | |
| | | .item-bottom { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-top: 14px; |
| | | margin-top: 18px; |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: normal; |
| | | font-size: 12px; |
| | | color: rgba(0, 0, 0, 0.5); |
| | | line-height: 1; |
| | | line-height: 1.2; |
| | | |
| | | .bottom-left, .bottom-right { |
| | | display: flex; |
| | | align-items: center; |
| | | letter-spacing: 0.3px; |
| | | |
| | | :deep(.el-icon) { |
| | | margin-left: 4px; |
| | | margin-left: 6px; |
| | | font-size: 12px; |
| | | } |
| | | } |
| | |
| | | .login { |
| | | display: flex; |
| | | align-items: center; |
| | | height: 100%; |
| | | height: 100vh; |
| | | background-image: url("@/assets/images/login-background.png"); |
| | | background-repeat: no-repeat; |
| | | background-size: cover; |
| | |
| | | position: relative; |
| | | min-width: 700px; |
| | | min-height: 700px; |
| | | background-color:#001146 |
| | | } |
| | | |
| | | .middle-view { |
| | |
| | | <template> |
| | | <div class="app-container page"> |
| | | <div class="form-card"> |
| | | <el-form :model="form" label-width="80px"> |
| | | <el-row class="mb20 mt20"> |
| | | <el-col :offset="1" :span="18"> |
| | | <div class="app-container page name-settings-page"> |
| | | <div class="name-settings-card"> |
| | | <el-form :model="form" label-width="120px"> |
| | | <el-row class="form-row"> |
| | | <el-col :span="18"> |
| | | <el-form-item label="ç³»ç»åç§°" prop="systemName"> |
| | | <el-input v-model="form.systemName" placeholder="请è¾å
¥ç³»ç»åç§°" maxlength="64" show-word-limit /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row class="mb20 mt20"> |
| | | <el-col :offset="1" :span="18"> |
| | | <el-row class="form-row"> |
| | | <el-col :span="18"> |
| | | <el-form-item label="ç»å½logo" prop="homeLogo"> |
| | | <ImageUpload v-model="form.homeLogo" :fileType="['png']" :limit="1" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row class="mb20 mt20"> |
| | | <el-col :offset="1" :span="18"> |
| | | <el-row class="form-row"> |
| | | <el-col :span="18"> |
| | | <el-form-item label="åå°logo" prop="leftLogo"> |
| | | <ImageUpload v-model="form.leftLogo" :fileType="['png']" :limit="1" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row class="mb20 mt20"> |
| | | <el-col :offset="1" :span="18"> |
| | | <el-row class="form-row"> |
| | | <el-col :span="18"> |
| | | <el-form-item label="copyRight" prop="copyRight"> |
| | | <el-input |
| | | v-model="form.copyRight" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row class="mb20 mt20" style="padding-bottom: 20px"> |
| | | <el-col :offset="2" :span="18"> |
| | | <el-row class="form-row form-footer"> |
| | | <el-col :span="18"> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleSave">ä¿å</el-button> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | |
| | | } |
| | | getSystemName() |
| | | function handleSave() { |
| | | if (!form.value.leftLogo || !form.value.homeLogo) { |
| | | proxy.$modal.msgError("请ä¸ä¼ logo") |
| | | return |
| | | } |
| | | |
| | | if (!form.value.leftLogo.includes(baseUrl)) { |
| | | form.value.leftLogo = baseUrl + form.value.leftLogo |
| | | } |
| | |
| | | |
| | | <style lang="scss" scoped> |
| | | @import "@/assets/styles/page.scss"; |
| | | :deep .avatar-uploader .el-upload { |
| | | |
| | | .name-settings-page { |
| | | height: 100%; |
| | | min-height: calc(100vh - 60px); |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .name-settings-card { |
| | | |
| | | border-radius: 4px; |
| | | margin: 16px; |
| | | padding: 24px; |
| | | flex: 1; |
| | | height: calc(100vh - 100px); |
| | | overflow-y: auto; |
| | | |
| | | .el-form { |
| | | width: 100%; |
| | | |
| | | .form-row { |
| | | margin-bottom: 24px; |
| | | |
| | | &.form-footer { |
| | | margin-top: 40px; |
| | | } |
| | | } |
| | | |
| | | .el-form-item { |
| | | margin-bottom: 0; |
| | | |
| | | .el-form-item__label { |
| | | color: var(--el-text-color-primary, #fff); |
| | | } |
| | | |
| | | .el-form-item__content { |
| | | .el-button { |
| | | padding: 10px 24px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | :deep(.avatar-uploader .el-upload) { |
| | | border: 1px dashed var(--el-border-color); |
| | | border-radius: 6px; |
| | | cursor: pointer; |
| | |
| | | transition: var(--el-transition-duration-fast); |
| | | } |
| | | |
| | | :deep .avatar-uploader .el-upload:hover { |
| | | :deep(.avatar-uploader .el-upload:hover) { |
| | | border-color: var(--el-color-primary); |
| | | } |
| | | |
| | | :deep .el-icon.avatar-uploader-icon { |
| | | :deep(.el-icon.avatar-uploader-icon) { |
| | | font-size: 28px; |
| | | color: #8c939d; |
| | | width: 178px; |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <div class="app-container user-profile-container"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6" :xs="24"> |
| | | <el-card class="box-card"> |
| | |
| | | target: "https://demo-ems.zhitancloud.com", |
| | | changeOrigin: true, |
| | | secure: true, |
| | | } |
| | | }, |
| | | }, |
| | | }, |
| | | //fix:error:stdin>:7356:1: warning: "@charset" must be the first rule in the file |