diff --git a/src/views/MainPage.vue b/src/views/MainPage.vue index 47b9769..e998578 100644 --- a/src/views/MainPage.vue +++ b/src/views/MainPage.vue @@ -79,6 +79,7 @@ :show-close="true" :close-on-click-modal="true" :close-on-press-escape="true" + @close="closeWelcomeDialog" center class="welcome-dialog" > @@ -86,10 +87,10 @@
🎉

融汇通更新

-
+
@@ -104,13 +105,13 @@
- 暂无更新信息 + 暂无未读更新信息
@@ -197,6 +198,16 @@ export default { } }; + // 计算未读公告 + const unreadAnnouncements = computed(() => { + return announcements.value.filter(announcement => !announcement.is_read); + }); + + // 计算是否应该显示弹窗 + const shouldShowDialog = computed(() => { + return unreadAnnouncements.value.length > 0; + }); + const getUpdateNotice = async () => { try { const response = await api.get('/announcements'); @@ -217,17 +228,19 @@ export default { // 定时刷新积分 let refreshInterval; - onMounted(() => { + onMounted(async () => { getUserPoints(); - getUpdateNotice(); + await getUpdateNotice(); // 每5分钟刷新一次积分(可根据需求调整时间) refreshInterval = setInterval(getUserPoints, 5 * 60 * 1000); - // 显示欢迎弹窗 + // 根据是否有未读公告决定是否显示欢迎弹窗 setTimeout(() => { - showWelcomeDialog.value = true; + if (shouldShowDialog.value) { + showWelcomeDialog.value = true; + } }, 500); // 延迟500ms显示,让页面先加载完成 }); @@ -247,6 +260,28 @@ export default { }); }; + // 标记公告为已读 + const markAnnouncementAsRead = async (announcementId) => { + try { + await api.post(`/announcements/${announcementId}/read`); + console.log(`公告 ${announcementId} 已标记为已读`); + } catch (error) { + console.error('标记公告已读失败:', error); + ElMessage.error('标记公告已读失败,请稍后重试'); + } + }; + + // 关闭欢迎弹窗并标记所有未读公告为已读 + const closeWelcomeDialog = async () => { + await markAllAnnouncementsAsRead(); + showWelcomeDialog.value = false; + }; + + // 点击已读按钮 + const handleReadClick = () => { + showWelcomeDialog.value = false; + }; + return { modules: [Autoplay, Pagination], userPoints, @@ -257,8 +292,12 @@ export default { showWelcomeDialog, updateNotice, announcements, + unreadAnnouncements, + shouldShowDialog, formatDate, getUserPoints, // 如果需要外部调用可以暴露 + closeWelcomeDialog, + handleReadClick, }; }, };