| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- <script lang="ts" name="Message" setup>
- import { formatDate } from '@/utils/formatTime'
- import * as NotifyMessageApi from '@/api/system/notify/message'
- const { push } = useRouter()
- const activeName = ref('notice')
- const unreadCount = ref(0) // 未读消息数量
- const list = ref<any[]>([]) // 消息列表
- // 获得消息列表
- const getList = async () => {
- list.value = await NotifyMessageApi.getUnreadNotifyMessageList()
- // 强制设置 unreadCount 为 0,避免小红点因为轮询太慢,不消除
- unreadCount.value = 0
- }
- // 获得未读消息数
- const getUnreadCount = async () => {
- NotifyMessageApi.getUnreadNotifyMessageCount().then((data) => {
- unreadCount.value = data
- })
- }
- // 跳转我的站内信
- const goMyList = () => {
- push({
- name: 'MyNotifyMessage'
- })
- }
- // ========== 初始化 =========
- onMounted(() => {
- // 首次加载小红点
- getUnreadCount()
- // 轮询刷新小红点
- setInterval(() => {
- getUnreadCount()
- }, 1000 * 60 * 2)
- })
- </script>
- <template>
- <div class="message">
- <ElPopover :width="400" placement="bottom" trigger="click">
- <template #reference>
- <ElBadge :is-dot="unreadCount > 0" class="item">
- <Icon :size="18" class="cursor-pointer" icon="ep:bell" @click="getList" />
- </ElBadge>
- </template>
- <ElTabs v-model="activeName">
- <ElTabPane label="我的站内信" name="notice">
- <div class="message-list">
- <template v-for="item in list" :key="item.id">
- <div class="message-item">
- <img alt="" class="message-icon" src="@/assets/imgs/avatar.gif" />
- <div class="message-content">
- <span class="message-title">
- {{ item.templateNickname }}:{{ item.templateContent }}
- </span>
- <span class="message-date">
- {{ formatDate(item.createTime) }}
- </span>
- </div>
- </div>
- </template>
- </div>
- </ElTabPane>
- </ElTabs>
- <!-- 更多 -->
- <div style="text-align: right; margin-top: 10px">
- <XButton preIcon="ep:view" title="查看全部" type="primary" @click="goMyList" />
- </div>
- </ElPopover>
- </div>
- </template>
- <style lang="scss" scoped>
- .message-empty {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- height: 260px;
- line-height: 45px;
- }
- .message-list {
- display: flex;
- flex-direction: column;
- .message-item {
- display: flex;
- align-items: center;
- padding: 20px 0;
- border-bottom: 1px solid var(--el-border-color-light);
- &:last-child {
- border: none;
- }
- .message-icon {
- width: 40px;
- height: 40px;
- margin: 0 20px 0 5px;
- }
- .message-content {
- display: flex;
- flex-direction: column;
- .message-title {
- margin-bottom: 5px;
- }
- .message-date {
- font-size: 12px;
- color: var(--el-text-color-secondary);
- }
- }
- }
- }
- </style>
|