2025-11-12 23:08:52 +08:00
|
|
|
|
import type { AnnouncementLogDto } from '@/api';
|
|
|
|
|
|
import { defineStore } from 'pinia';
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
2025-11-12 23:08:52 +08:00
|
|
|
|
export type CloseType = 'today' | 'permanent';
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
|
|
|
|
|
export const useAnnouncementStore = defineStore(
|
|
|
|
|
|
'announcement',
|
|
|
|
|
|
() => {
|
|
|
|
|
|
// 弹窗显示状态
|
2025-11-12 23:08:52 +08:00
|
|
|
|
const isDialogVisible = ref(false);
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
2025-11-12 23:08:52 +08:00
|
|
|
|
// 公告数据(统一存储所有公告)
|
|
|
|
|
|
const announcements = ref<AnnouncementLogDto[]>([]);
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
|
|
|
|
|
// 关闭记录
|
2025-11-12 23:08:52 +08:00
|
|
|
|
const closeType = ref<CloseType | null>(null);
|
|
|
|
|
|
const closedAt = ref<number | null>(null);
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
|
|
|
|
|
// 打开弹窗
|
|
|
|
|
|
const openDialog = () => {
|
2025-11-12 23:08:52 +08:00
|
|
|
|
isDialogVisible.value = true;
|
|
|
|
|
|
};
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
|
|
|
|
|
// 关闭弹窗
|
|
|
|
|
|
const closeDialog = (type: CloseType) => {
|
2025-11-12 23:08:52 +08:00
|
|
|
|
isDialogVisible.value = false;
|
|
|
|
|
|
closeType.value = type;
|
|
|
|
|
|
closedAt.value = Date.now();
|
|
|
|
|
|
};
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
|
|
|
|
|
// 检查是否应该显示弹窗
|
|
|
|
|
|
const shouldShowDialog = computed(() => {
|
|
|
|
|
|
if (!closedAt.value || !closeType.value)
|
2025-11-12 23:08:52 +08:00
|
|
|
|
return true;
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
2025-11-12 23:08:52 +08:00
|
|
|
|
const now = Date.now();
|
|
|
|
|
|
const elapsed = now - closedAt.value;
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
|
|
|
|
|
if (closeType.value === 'permanent')
|
2025-11-16 22:39:42 +08:00
|
|
|
|
return true;
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
|
|
|
|
|
if (closeType.value === 'today') {
|
2025-11-16 22:39:42 +08:00
|
|
|
|
// 检查是否已过去一周(7天)
|
|
|
|
|
|
return elapsed > 7 * 24 * 60 * 60 * 1000;
|
2025-11-05 23:12:23 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-12 23:08:52 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
});
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
|
|
|
|
|
// 设置公告数据
|
2025-11-12 23:08:52 +08:00
|
|
|
|
const setAnnouncementData = (data: AnnouncementLogDto[]) => {
|
|
|
|
|
|
announcements.value = data;
|
|
|
|
|
|
};
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
|
|
|
|
|
// 重置关闭状态(用于测试或管理员重置)
|
|
|
|
|
|
const resetCloseStatus = () => {
|
2025-11-12 23:08:52 +08:00
|
|
|
|
closeType.value = null;
|
|
|
|
|
|
closedAt.value = null;
|
|
|
|
|
|
};
|
2025-11-05 23:12:23 +08:00
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
isDialogVisible,
|
|
|
|
|
|
announcements,
|
|
|
|
|
|
closeType,
|
|
|
|
|
|
closedAt,
|
|
|
|
|
|
shouldShowDialog,
|
|
|
|
|
|
openDialog,
|
|
|
|
|
|
closeDialog,
|
|
|
|
|
|
setAnnouncementData,
|
|
|
|
|
|
resetCloseStatus,
|
2025-11-12 23:08:52 +08:00
|
|
|
|
};
|
2025-11-05 23:12:23 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
persist: {
|
2025-11-16 22:39:42 +08:00
|
|
|
|
// 只持久化关闭状态相关的数据,公告数据不缓存
|
2025-11-05 23:12:23 +08:00
|
|
|
|
paths: ['closeType', 'closedAt'],
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
2025-11-12 23:08:52 +08:00
|
|
|
|
);
|