11<template >
2- <GiPageLayout :margin =" true" :default-collapsed =" false" >
2+ <GiPageLayout :margin =" true" :default-collapsed =" false" :header-style = " isDesktop ? { borderBottomWidth: 0 } : { borderBottomWidth: '1px' } " >
33 <template v-if =" isDesktop " #left >
4- <a-tabs v-model:active-key =" activeKey" position =" left" hide-content size =" large" @change =" change" >
5- <a-tab-pane v-for =" (item) in menuList" :key =" item.key" :title =" item.name" ></a-tab-pane >
4+ <a-tabs v-model:active-key =" activeKey" type =" rounded" position =" left" hide-content size =" large" @change =" change" >
5+ <a-tab-pane v-for =" item in tabItems" :key =" item.key" >
6+ <template #title >
7+ <TabPaneTitle :title =" item.title" :count =" item.count" />
8+ </template >
9+ </a-tab-pane >
10+ </a-tabs >
11+ </template >
12+ <template #header >
13+ <a-tabs v-if =" !isDesktop" v-model:active-key =" activeKey" type =" rounded" position =" top" size =" large" @change =" change" >
14+ <a-tab-pane v-for =" item in tabItems" :key =" item.key" >
15+ <template #title >
16+ <TabPaneTitle :title =" item.title" :count =" item.count" />
17+ </template >
18+ </a-tab-pane >
619 </a-tabs >
720 </template >
8- <a-tabs v-if =" !isDesktop" v-model:active-key =" activeKey" type =" card-gutter" position =" top" size =" large" @change =" change" >
9- <a-tab-pane v-for =" (item) in menuList" :key =" item.key" :title =" item.name" ></a-tab-pane >
10- </a-tabs >
1121 <transition name =" fade-slide" mode =" out-in" appear >
1222 <component :is =" menuList.find((item) => item.key === activeKey)?.value" ></component >
1323 </transition >
1424 </GiPageLayout >
1525</template >
1626
17- <script setup lang="ts ">
27+ <script setup lang="tsx ">
1828import { useRoute , useRouter } from ' vue-router'
1929import MyMessage from ' ./components/MyMessage.vue'
2030import MyNotice from ' ./components/MyNotice.vue'
2131import { useDevice } from ' @/hooks'
32+ import { type MessageResp , type NoticeResp , listMessage , listNotice } from ' @/apis'
2233
2334defineOptions ({ name: ' UserMessage' })
2435
36+ const TabPaneTitle = defineComponent ({
37+ props: {
38+ title: { type: String , required: true },
39+ count: { type: Number , default: 0 },
40+ },
41+ setup(props ) {
42+ return () => (
43+ <div class = " tab-pane-item" >
44+ <div >{ props .title } </div >
45+ <a-badge count = { props .count } max-count = { 99 } />
46+ </div >
47+ )
48+ },
49+ })
50+
2551const { isDesktop } = useDevice ()
2652
53+ const messageList = ref <MessageResp []>()
54+ const noticeList = ref <NoticeResp []>()
55+
56+ const tabItems = computed (() => [
57+ { key: ' msg' , title: ' 我的消息' , count: messageList .value ?.length ?? 0 },
58+ { key: ' notice' , title: ' 我的公告' },
59+ ])
60+
61+ const messageQueryParam = reactive ({
62+ isRead: false ,
63+ sort: [' createTime,desc' ],
64+ page: 1 ,
65+ size: 5 ,
66+ })
67+
68+ const noticeQueryParam = reactive ({
69+ sort: [' createTime,desc' ],
70+ page: 1 ,
71+ size: 5 ,
72+ })
73+
74+ const getMessageData = async () => {
75+ const { data } = await listMessage (messageQueryParam )
76+ messageList .value = data .list .filter ((item ) => ! item .isRead )
77+ }
78+
79+ const getNoticeData = async () => {
80+ const { data } = await listNotice (noticeQueryParam )
81+ noticeList .value = data .list
82+ }
83+
84+ onMounted (() => {
85+ getMessageData ()
86+ getNoticeData ()
87+ })
88+
2789const menuList = [
2890 { name: ' 我的消息' , key: ' msg' , value: MyMessage },
2991 { name: ' 我的公告' , key: ' notice' , value: MyNotice },
@@ -48,6 +110,13 @@ const change = (key: string | number) => {
48110 </script >
49111
50112<style scoped lang="scss">
113+ .tab-pane-item {
114+ display : flex ;
115+ justify-content : space-between ;
116+ align-items : center ;
117+ gap : 8px ;
118+ }
119+
51120:deep(.arco-tabs-nav-vertical.arco-tabs-nav-type-line .arco-tabs-tab ) {
52121 margin : 0 ;
53122 padding : 8px 16px ;
@@ -107,4 +176,12 @@ const change = (key: string | number) => {
107176:deep(.arco-tabs-nav ) {
108177 overflow : visible ;
109178}
179+
180+ :deep(.arco-tabs-nav-type-rounded .arco-tabs-tab ){
181+ border-radius : 8px ;
182+ }
183+
184+ :deep(.arco-tabs-tab-title ){
185+ width : 100% ;
186+ }
110187 </style >
0 commit comments