mirror of
				https://github.com/continew-org/continew-admin-ui.git
				synced 2025-10-31 22:57:15 +08:00 
			
		
		
		
	chore: change tab pane style
This commit is contained in:
		| @@ -33,13 +33,13 @@ | |||||||
|     <template #toolbar-right> |     <template #toolbar-right> | ||||||
|       <a-button type="primary" status="danger" :disabled="!selectedKeys.length" :title="!selectedKeys.length ? '请选择' : ''" @click="onDelete"> |       <a-button type="primary" status="danger" :disabled="!selectedKeys.length" :title="!selectedKeys.length ? '请选择' : ''" @click="onDelete"> | ||||||
|         <template #icon><icon-delete /></template> |         <template #icon><icon-delete /></template> | ||||||
|         <template #default>删除</template> |         删除 | ||||||
|       </a-button> |       </a-button> | ||||||
|       <a-button type="primary" :disabled="!selectedKeys.length" :title="!selectedKeys.length ? '请选择' : ''" @click="onRead"> |       <a-button type="primary" :disabled="!selectedKeys.length" :title="!selectedKeys.length ? '请选择' : ''" @click="onRead"> | ||||||
|         <template #default>标记为已读</template> |         标记为已读 | ||||||
|       </a-button> |       </a-button> | ||||||
|       <a-button type="primary" :disabled="selectedKeys.length" :title="!selectedKeys.length ? '请选择' : ''" @click="onReadAll"> |       <a-button type="primary" :disabled="selectedKeys.length > 0" :title="!selectedKeys.length ? '请选择' : ''" @click="onReadAll"> | ||||||
|         <template #default>全部已读</template> |         全部已读 | ||||||
|       </a-button> |       </a-button> | ||||||
|     </template> |     </template> | ||||||
|     <template #title="{ record }"> |     <template #title="{ record }"> | ||||||
|   | |||||||
| @@ -1,29 +1,91 @@ | |||||||
| <template> | <template> | ||||||
|   <GiPageLayout :margin="true" :default-collapsed="false"> |   <GiPageLayout :margin="true" :default-collapsed="false" :header-style="isDesktop ? { borderBottomWidth: 0 } : { borderBottomWidth: '1px' } "> | ||||||
|     <template v-if="isDesktop" #left> |     <template v-if="isDesktop" #left> | ||||||
|       <a-tabs v-model:active-key="activeKey" position="left" hide-content size="large" @change="change"> |       <a-tabs v-model:active-key="activeKey" type="rounded" position="left" hide-content size="large" @change="change"> | ||||||
|         <a-tab-pane v-for="(item) in menuList" :key="item.key" :title="item.name"></a-tab-pane> |         <a-tab-pane v-for="item in tabItems" :key="item.key"> | ||||||
|  |           <template #title> | ||||||
|  |             <TabPaneTitle :title="item.title" :count="item.count" /> | ||||||
|  |           </template> | ||||||
|  |         </a-tab-pane> | ||||||
|  |       </a-tabs> | ||||||
|  |     </template> | ||||||
|  |     <template #header> | ||||||
|  |       <a-tabs v-if="!isDesktop" v-model:active-key="activeKey" type="rounded" position="top" size="large" @change="change"> | ||||||
|  |         <a-tab-pane v-for="item in tabItems" :key="item.key"> | ||||||
|  |           <template #title> | ||||||
|  |             <TabPaneTitle :title="item.title" :count="item.count" /> | ||||||
|  |           </template> | ||||||
|  |         </a-tab-pane> | ||||||
|       </a-tabs> |       </a-tabs> | ||||||
|     </template> |     </template> | ||||||
|     <a-tabs v-if="!isDesktop" v-model:active-key="activeKey" type="card-gutter" position="top" size="large" @change="change"> |  | ||||||
|       <a-tab-pane v-for="(item) in menuList" :key="item.key" :title="item.name"></a-tab-pane> |  | ||||||
|     </a-tabs> |  | ||||||
|     <transition name="fade-slide" mode="out-in" appear> |     <transition name="fade-slide" mode="out-in" appear> | ||||||
|       <component :is="menuList.find((item) => item.key === activeKey)?.value"></component> |       <component :is="menuList.find((item) => item.key === activeKey)?.value"></component> | ||||||
|     </transition> |     </transition> | ||||||
|   </GiPageLayout> |   </GiPageLayout> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script setup lang="ts"> | <script setup lang="tsx"> | ||||||
| import { useRoute, useRouter } from 'vue-router' | import { useRoute, useRouter } from 'vue-router' | ||||||
| import MyMessage from './components/MyMessage.vue' | import MyMessage from './components/MyMessage.vue' | ||||||
| import MyNotice from './components/MyNotice.vue' | import MyNotice from './components/MyNotice.vue' | ||||||
| import { useDevice } from '@/hooks' | import { useDevice } from '@/hooks' | ||||||
|  | import { type MessageResp, type NoticeResp, listMessage, listNotice } from '@/apis' | ||||||
|  |  | ||||||
| defineOptions({ name: 'UserMessage' }) | defineOptions({ name: 'UserMessage' }) | ||||||
|  |  | ||||||
|  | const TabPaneTitle = defineComponent({ | ||||||
|  |   props: { | ||||||
|  |     title: { type: String, required: true }, | ||||||
|  |     count: { type: Number, default: 0 }, | ||||||
|  |   }, | ||||||
|  |   setup(props) { | ||||||
|  |     return () => ( | ||||||
|  |       <div class="tab-pane-item"> | ||||||
|  |         <div>{props.title}</div> | ||||||
|  |         <a-badge count={props.count} max-count={99} /> | ||||||
|  |       </div> | ||||||
|  |     ) | ||||||
|  |   }, | ||||||
|  | }) | ||||||
|  |  | ||||||
| const { isDesktop } = useDevice() | const { isDesktop } = useDevice() | ||||||
|  |  | ||||||
|  | const messageList = ref<MessageResp[]>() | ||||||
|  | const noticeList = ref<NoticeResp[]>() | ||||||
|  |  | ||||||
|  | const tabItems = computed(() => [ | ||||||
|  |   { key: 'msg', title: '我的消息', count: messageList.value?.length ?? 0 }, | ||||||
|  |   { key: 'notice', title: '我的公告' }, | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  | const messageQueryParam = reactive({ | ||||||
|  |   isRead: false, | ||||||
|  |   sort: ['createTime,desc'], | ||||||
|  |   page: 1, | ||||||
|  |   size: 5, | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | const noticeQueryParam = reactive({ | ||||||
|  |   sort: ['createTime,desc'], | ||||||
|  |   page: 1, | ||||||
|  |   size: 5, | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | const getMessageData = async () => { | ||||||
|  |   const { data } = await listMessage(messageQueryParam) | ||||||
|  |   messageList.value = data.list.filter((item) => !item.isRead) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const getNoticeData = async () => { | ||||||
|  |   const { data } = await listNotice(noticeQueryParam) | ||||||
|  |   noticeList.value = data.list | ||||||
|  | } | ||||||
|  |  | ||||||
|  | onMounted(() => { | ||||||
|  |   getMessageData() | ||||||
|  |   getNoticeData() | ||||||
|  | }) | ||||||
|  |  | ||||||
| const menuList = [ | const menuList = [ | ||||||
|   { name: '我的消息', key: 'msg', value: MyMessage }, |   { name: '我的消息', key: 'msg', value: MyMessage }, | ||||||
|   { name: '我的公告', key: 'notice', value: MyNotice }, |   { name: '我的公告', key: 'notice', value: MyNotice }, | ||||||
| @@ -48,6 +110,13 @@ const change = (key: string | number) => { | |||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <style scoped lang="scss"> | <style scoped lang="scss"> | ||||||
|  | .tab-pane-item{ | ||||||
|  |   display: flex; | ||||||
|  |   justify-content: space-between; | ||||||
|  |   align-items: center; | ||||||
|  |   gap: 8px; | ||||||
|  | } | ||||||
|  |  | ||||||
| :deep(.arco-tabs-nav-vertical.arco-tabs-nav-type-line .arco-tabs-tab) { | :deep(.arco-tabs-nav-vertical.arco-tabs-nav-type-line .arco-tabs-tab) { | ||||||
|   margin: 0; |   margin: 0; | ||||||
|   padding: 8px 16px; |   padding: 8px 16px; | ||||||
| @@ -107,4 +176,12 @@ const change = (key: string | number) => { | |||||||
| :deep(.arco-tabs-nav) { | :deep(.arco-tabs-nav) { | ||||||
|   overflow: visible; |   overflow: visible; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | :deep(.arco-tabs-nav-type-rounded .arco-tabs-tab){ | ||||||
|  |   border-radius: 8px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | :deep(.arco-tabs-tab-title){ | ||||||
|  |   width: 100%; | ||||||
|  | } | ||||||
| </style> | </style> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ppxb
					ppxb