55 <OneLevelMenu :menus =" oneLevelMenus" @menu-click =" handleMenuItemClickByItem" ></OneLevelMenu >
66
77 <!-- 左侧二级菜单区域 -->
8- <div class =" layout-columns__right-menu" >
9- <div class =" layout-columns__system-name gi_line_1" >{{ appStore.getTitle() }}</div >
8+ <div class =" layout-columns__right-menu" :class =" { collapse: appStore.menuCollapse }" >
9+ <!-- 系统标题 -->
10+ <div class =" layout-columns__title" >
11+ <span v-show =" !appStore.menuCollapse" class =" system-name gi_line_1" >{{ appStore.getTitle() }}</span >
12+ </div >
1013 <Menu
1114 v-if =" twoLevelMenus.length > 1 || oneLevelMenuActiveRoute?.meta?.alwaysShow === true"
12- class =" layout-columns__menu" :menus =" twoLevelMenus" :menu-style =" { width: '180px' } "
15+ class =" layout-columns__menu" :menus =" twoLevelMenus" :menu-style =" menuStyle "
1316 />
1417 </div >
1518 </div >
1619
17- <!-- 右侧内容区域 -->
1820 <section class =" layout-columns__content" >
1921 <Header />
2022 <Tabs v-if =" appStore.tab" />
2123 <Main />
24+ <GiFooter v-if =" appStore.copyrightDisplay" />
2225 </section >
26+
27+ <!-- 公告弹窗 -->
28+ <NoticePopup ref =" noticePopupRef" />
2329 </div >
2430</template >
2531
@@ -32,6 +38,8 @@ import Tabs from './components/Tabs/index.vue'
3238import { useAppStore } from ' @/stores'
3339import { useLevelMenu } from ' @/layout/hooks/useLevelMenu'
3440import { useDevice } from ' @/hooks'
41+ import NoticePopup from ' @/views/user/message/components/NoticePopup.vue'
42+ import { getToken } from ' @/utils/auth'
3543
3644defineOptions ({ name: ' LayoutColumns' })
3745
@@ -40,6 +48,29 @@ const { isDesktop } = useDevice()
4048
4149const { oneLevelMenus, twoLevelMenus, oneLevelMenuActiveRoute, getOneLevelMenus, handleMenuItemClickByItem } = useLevelMenu ()
4250getOneLevelMenus ()
51+ // 菜单样式 - 根据折叠状态动态调整宽度
52+ const menuStyle = computed (() => {
53+ return {
54+ width: appStore .menuCollapse ? ' 48px' : ' 200px' ,
55+ }
56+ })
57+ // 公告弹窗引用
58+ const noticePopupRef = ref <InstanceType <typeof NoticePopup >>()
59+
60+ // 检查并显示未读公告
61+ const checkAndShowNotices = () => {
62+ const token = getToken ()
63+
64+ // 如果有token,检查未读公告
65+ if (token ) {
66+ setTimeout (() => {
67+ noticePopupRef .value ?.open ()
68+ }, 1000 ) // 延迟1秒显示,让页面先加载完成
69+ }
70+ }
71+ onMounted (() => {
72+ checkAndShowNotices ()
73+ })
4374 </script >
4475
4576<style lang="scss" scoped>
@@ -59,12 +90,16 @@ getOneLevelMenus()
5990 & __right-menu {
6091 display : flex ;
6192 flex-direction : column ;
62- width : 180px ;
6393 overflow : hidden ;
6494 background-color : var (--color-bg-1 );
95+ width : 200px ;
96+ transition : width 0.3s ease-in-out ;
97+ & .collapse {
98+ width : 48px ;
99+ }
65100 }
66101
67- & __system-name {
102+ & __title {
68103 height : 56px ;
69104 padding : 0 12px ;
70105 color : var (--color-text-1 );
@@ -78,17 +113,35 @@ getOneLevelMenus()
78113 border-bottom : 1px solid var (--color-border );
79114 cursor : pointer ;
80115 user-select : none ;
81- transition : padding .2s ;
116+ transition : all 0.3s ease-in-out ;
117+
118+ .system-name {
119+ padding-left : 6px ;
120+ white-space : nowrap ;
121+ transition : all 0.3s ease-in-out ;
122+ line-height : 1.5 ;
123+ display : inline-flex ;
124+ align-items : center ;
125+ opacity : 1 ;
126+ transform : translateX (0 );
127+
128+ & :hover {
129+ color : $color-theme !important ;
130+ cursor : pointer ;
131+ }
82132
83- & :hover {
84- color : $color-theme !important ;
85- cursor : pointer ;
133+ .layout-columns__right-menu.collapse & {
134+ opacity : 0 ;
135+ transform : translateX (-20px );
136+ }
86137 }
87138 }
88139 & __menu {
89140 flex : 1 ;
90141 overflow : auto ;
91142 border-right : 1px solid var (--color-border-2 );
143+ transition : all 0.3s ease-in-out ;
144+ width : 100% ;
92145 }
93146
94147 & __content {
0 commit comments