Message.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <script lang="ts" name="Message" setup>
  2. import { formatDate } from '@/utils/formatTime'
  3. import * as NotifyMessageApi from '@/api/system/notify/message'
  4. const { push } = useRouter()
  5. const activeName = ref('notice')
  6. const unreadCount = ref(0) // 未读消息数量
  7. const list = ref<any[]>([]) // 消息列表
  8. // 获得消息列表
  9. const getList = async () => {
  10. list.value = await NotifyMessageApi.getUnreadNotifyMessageList()
  11. // 强制设置 unreadCount 为 0,避免小红点因为轮询太慢,不消除
  12. unreadCount.value = 0
  13. }
  14. // 获得未读消息数
  15. const getUnreadCount = async () => {
  16. NotifyMessageApi.getUnreadNotifyMessageCount().then((data) => {
  17. unreadCount.value = data
  18. })
  19. }
  20. // 跳转我的站内信
  21. const goMyList = () => {
  22. push({
  23. name: 'MyNotifyMessage'
  24. })
  25. }
  26. // ========== 初始化 =========
  27. onMounted(() => {
  28. // 首次加载小红点
  29. getUnreadCount()
  30. // 轮询刷新小红点
  31. setInterval(() => {
  32. getUnreadCount()
  33. }, 1000 * 60 * 2)
  34. })
  35. </script>
  36. <template>
  37. <div class="message">
  38. <ElPopover :width="400" placement="bottom" trigger="click">
  39. <template #reference>
  40. <ElBadge :is-dot="unreadCount > 0" class="item">
  41. <Icon :size="18" class="cursor-pointer" icon="ep:bell" @click="getList" />
  42. </ElBadge>
  43. </template>
  44. <ElTabs v-model="activeName">
  45. <ElTabPane label="我的站内信" name="notice">
  46. <div class="message-list">
  47. <template v-for="item in list" :key="item.id">
  48. <div class="message-item">
  49. <img alt="" class="message-icon" src="@/assets/imgs/avatar.gif" />
  50. <div class="message-content">
  51. <span class="message-title">
  52. {{ item.templateNickname }}:{{ item.templateContent }}
  53. </span>
  54. <span class="message-date">
  55. {{ formatDate(item.createTime) }}
  56. </span>
  57. </div>
  58. </div>
  59. </template>
  60. </div>
  61. </ElTabPane>
  62. </ElTabs>
  63. <!-- 更多 -->
  64. <div style="text-align: right; margin-top: 10px">
  65. <XButton preIcon="ep:view" title="查看全部" type="primary" @click="goMyList" />
  66. </div>
  67. </ElPopover>
  68. </div>
  69. </template>
  70. <style lang="scss" scoped>
  71. .message-empty {
  72. display: flex;
  73. flex-direction: column;
  74. align-items: center;
  75. justify-content: center;
  76. height: 260px;
  77. line-height: 45px;
  78. }
  79. .message-list {
  80. display: flex;
  81. flex-direction: column;
  82. .message-item {
  83. display: flex;
  84. align-items: center;
  85. padding: 20px 0;
  86. border-bottom: 1px solid var(--el-border-color-light);
  87. &:last-child {
  88. border: none;
  89. }
  90. .message-icon {
  91. width: 40px;
  92. height: 40px;
  93. margin: 0 20px 0 5px;
  94. }
  95. .message-content {
  96. display: flex;
  97. flex-direction: column;
  98. .message-title {
  99. margin-bottom: 5px;
  100. }
  101. .message-date {
  102. font-size: 12px;
  103. color: var(--el-text-color-secondary);
  104. }
  105. }
  106. }
  107. }
  108. </style>