diff --git a/internal/constant/constant.go b/internal/constant/constant.go index 58771c8..d26c54f 100644 --- a/internal/constant/constant.go +++ b/internal/constant/constant.go @@ -105,6 +105,7 @@ const ( // 其他事件类型 EventSystemNotice = "system_notice" EventNotifySent = "notify_sent" + EventAppLogAdded = "app_log_added" // WebSocket 消息类型 WSTypeHeartbeat = "heartbeat" diff --git a/internal/services/app_log_service.go b/internal/services/app_log_service.go index ca70b1d..9295a24 100644 --- a/internal/services/app_log_service.go +++ b/internal/services/app_log_service.go @@ -32,7 +32,14 @@ func (s *AppLogService) Add(log *models.AppLog) error { if log.ID == "" { log.ID = utils.GenerateID() } - return database.DB.Create(log).Error + err := database.DB.Create(log).Error + if err == nil { + eventbus.DefaultBus.Publish(eventbus.Event{ + Type: constant.EventAppLogAdded, + Payload: log, + }) + } + return err } func (s *AppLogService) List(category string, status string, level string, page, pageSize int, keyword string) ([]models.AppLog, int64, error) { diff --git a/internal/services/login_log_service.go b/internal/services/login_log_service.go index 34e165d..d932da7 100644 --- a/internal/services/login_log_service.go +++ b/internal/services/login_log_service.go @@ -33,7 +33,14 @@ func (s *LoginLogService) Create(username, ip, userAgent, status, message string RefID: ip, ErrorMsg: models.BigText(message), } - return database.DB.Create(log).Error + err := database.DB.Create(log).Error + if err == nil { + eventbus.DefaultBus.Publish(eventbus.Event{ + Type: constant.EventAppLogAdded, + Payload: log, + }) + } + return err } // SubscribeEvents 注册订阅事件 diff --git a/web/src/constants/index.ts b/web/src/constants/index.ts index 0649416..97728fc 100644 --- a/web/src/constants/index.ts +++ b/web/src/constants/index.ts @@ -72,3 +72,8 @@ export const TASK_EVENTS = { RUNNING: 'task_running', QUEUED: 'task_queued', } as const + +// 日志事件类型 +export const LOG_EVENTS = { + ADDED: 'app_log_added', +} as const diff --git a/web/src/views/loginlogs/tabs/LoginLogTab.vue b/web/src/views/loginlogs/tabs/LoginLogTab.vue index 34daeb0..b03dd8e 100644 --- a/web/src/views/loginlogs/tabs/LoginLogTab.vue +++ b/web/src/views/loginlogs/tabs/LoginLogTab.vue @@ -3,9 +3,11 @@ import { ref, onMounted } from 'vue' import Pagination from '@/components/Pagination.vue' import { Loader2 } from 'lucide-vue-next' import TextOverflow from '@/components/TextOverflow.vue' -import { api } from '@/api' +import { api, LOG_CATEGORY } from '@/api' import { toast } from 'vue-sonner' import { useSiteSettings } from '@/composables/useSiteSettings' +import { useEventBus } from '@/composables/useEventBus' +import { LOG_EVENTS } from '@/constants' import BaihuDialog from '@/components/ui/BaihuDialog.vue' const props = defineProps<{ @@ -91,6 +93,15 @@ function handlePageChange(page: number) { onMounted(loadLogs) +// 实时更新:当有新登录产生且用户在第一页时刷新 +useEventBus([LOG_EVENTS.ADDED], (payload) => { + if (payload && payload.category === LOG_CATEGORY.LOGIN_LOG) { + if (currentPage.value === 1) { + loadLogs() + } + } +}) + defineExpose({ loadLogs }) diff --git a/web/src/views/loginlogs/tabs/SystemEventTab.vue b/web/src/views/loginlogs/tabs/SystemEventTab.vue index 5f8b1f1..0693626 100644 --- a/web/src/views/loginlogs/tabs/SystemEventTab.vue +++ b/web/src/views/loginlogs/tabs/SystemEventTab.vue @@ -11,6 +11,8 @@ import BaihuDialog from '@/components/ui/BaihuDialog.vue' import { toast } from 'vue-sonner' import { format } from 'date-fns' import { useSiteSettings } from '@/composables/useSiteSettings' +import { useEventBus } from '@/composables/useEventBus' +import { LOG_EVENTS } from '@/constants' const props = defineProps<{ filters: { @@ -85,6 +87,15 @@ onMounted(() => { fetchLogs() }) +// 实时更新:当有新系统事件产生且用户在第一页时刷新 +useEventBus([LOG_EVENTS.ADDED], (payload) => { + if (payload && payload.category === LOG_CATEGORY.SYSTEM_NOTICE) { + if (currentPage.value === 1) { + fetchLogs() + } + } +}) + const selectedLog = computed(() => logs.value.find((l: AppLog) => l.id === selectedLogId.value)) defineExpose({ diff --git a/web/src/views/notify/components/PushLog.vue b/web/src/views/notify/components/PushLog.vue index 37e12ba..e8b5fe3 100644 --- a/web/src/views/notify/components/PushLog.vue +++ b/web/src/views/notify/components/PushLog.vue @@ -19,6 +19,8 @@ import { AlertDialogTitle, } from '@/components/ui/alert-dialog' import { useSiteSettings } from '@/composables/useSiteSettings' +import { useEventBus } from '@/composables/useEventBus' +import { LOG_EVENTS } from '@/constants' import BaihuDialog from '@/components/ui/BaihuDialog.vue' const props = defineProps<{ @@ -94,6 +96,15 @@ onMounted(() => { fetchLogs() }) +// 实时更新:当有新推送产生且用户在第一页时刷新 +useEventBus([LOG_EVENTS.ADDED], (payload) => { + if (payload && payload.category === LOG_CATEGORY.PUSH_LOG) { + if (currentPage.value === 1) { + fetchLogs() + } + } +}) + const selectedLog = computed(() => logs.value.find((l: AppLog) => l.id === selectedLogId.value)) defineExpose({