-
-
-
-
消息日志
-
- {{ activeTab === 'system' ? '查看系统重要运行事件' :
- activeTab === 'push' ? '查看消息推送历史记录' : '查看系统用户登录记录' }}
-
-
-
- 系统事件
- 推送日志
- 登录日志
-
+
+
+
+
消息日志
+
+ {{ activeTab === 'system' ? '查看系统重要运行事件' :
+ activeTab === 'push' ? '查看消息推送历史记录' : '查看系统用户登录记录' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 系统事件
+
+
+ 推送日志
+
+
+ 登录日志
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/src/views/loginlogs/tabs/LoginLogTab.vue b/web/src/views/loginlogs/tabs/LoginLogTab.vue
index 18ac0c2..42b0a56 100644
--- a/web/src/views/loginlogs/tabs/LoginLogTab.vue
+++ b/web/src/views/loginlogs/tabs/LoginLogTab.vue
@@ -10,6 +10,10 @@ import { toast } from 'vue-sonner'
import { useSiteSettings } from '@/composables/useSiteSettings'
import BaihuDialog from '@/components/ui/BaihuDialog.vue'
+const props = defineProps<{
+ username: string
+}>()
+
const { pageSize } = useSiteSettings()
interface LoginLog {
@@ -38,11 +42,9 @@ interface IpGeoInfo {
}
const logs = ref
([])
-const filterUsername = ref('')
const currentPage = ref(1)
const total = ref(0)
const loading = ref(false)
-let searchTimer: ReturnType | null = null
// IP 地理位置弹窗
const ipDialogOpen = ref(false)
@@ -73,7 +75,7 @@ async function loadLogs() {
const res = await api.settings.getLoginLogs({
page: currentPage.value,
page_size: pageSize.value,
- username: filterUsername.value || undefined
+ username: props.username || undefined
})
logs.value = res.data
total.value = res.total
@@ -84,37 +86,20 @@ async function loadLogs() {
}
}
-function handleSearch() {
- if (searchTimer) clearTimeout(searchTimer)
- searchTimer = setTimeout(() => {
- currentPage.value = 1
- loadLogs()
- }, 300)
-}
-
function handlePageChange(page: number) {
currentPage.value = page
loadLogs()
}
onMounted(loadLogs)
+
+defineExpose({
+ loadLogs
+})
-
diff --git a/web/src/views/loginlogs/tabs/SystemEventTab.vue b/web/src/views/loginlogs/tabs/SystemEventTab.vue
index 4effe60..d8a8450 100644
--- a/web/src/views/loginlogs/tabs/SystemEventTab.vue
+++ b/web/src/views/loginlogs/tabs/SystemEventTab.vue
@@ -20,6 +20,13 @@ import {
} from 'lucide-vue-next'
import { useSiteSettings } from '@/composables/useSiteSettings'
+const props = defineProps<{
+ filters: {
+ level: string
+ keyword: string
+ }
+}>()
+
const { pageSize } = useSiteSettings()
const logs = ref
([])
@@ -27,14 +34,7 @@ const selectedLogId = ref(null)
const total = ref(0)
const loading = ref(false)
const showClearConfirm = ref(false)
-
-const filters = ref({
- level: 'all',
- keyword: '',
- page: 1
-})
-
-let searchTimer: ReturnType | null = null
+const currentPage = ref(1)
const detailDialogProps = ref({
open: false,
@@ -48,9 +48,9 @@ async function fetchLogs() {
try {
const res = await api.appLogs.list({
category: LOG_CATEGORY.SYSTEM_NOTICE,
- level: filters.value.level === 'all' ? undefined : filters.value.level,
- keyword: filters.value.keyword || undefined,
- page: filters.value.page,
+ level: props.filters.level === 'all' ? undefined : props.filters.level,
+ keyword: props.filters.keyword || undefined,
+ page: currentPage.value,
page_size: pageSize.value
})
logs.value = res.data || []
@@ -62,23 +62,8 @@ async function fetchLogs() {
}
}
-function handleSearch() {
- if (searchTimer) clearTimeout(searchTimer)
- searchTimer = setTimeout(() => {
- filters.value.page = 1
- fetchLogs()
- }, 300)
-}
-
-function handlePageChange(page: number) {
- filters.value.page = page
- fetchLogs()
-}
-
-function handleLevelChange(val: any) {
- if (val === null || val === undefined) return
- filters.value.level = String(val)
- filters.value.page = 1
+function handlePageChange(index: number) {
+ currentPage.value = index
fetchLogs()
}
@@ -96,11 +81,12 @@ async function handleClear() {
try {
await api.appLogs.clear(LOG_CATEGORY.SYSTEM_NOTICE)
toast.success('清空成功')
- filters.value.page = 1
+ currentPage.value = 1
fetchLogs()
} catch (e: any) {
toast.error('清空失败: ' + (e.message || ''))
}
+ showClearConfirm.value = false
}
onMounted(() => {
@@ -109,6 +95,11 @@ onMounted(() => {
const selectedLog = computed(() => logs.value.find((l: AppLog) => l.id === selectedLogId.value))
+defineExpose({
+ fetchLogs,
+ showClearConfirm
+})
+
function getLevelBadgeClass(level: string) {
switch (level) {
case LOG_LEVEL.INFO:
@@ -153,41 +144,15 @@ function onDialogClose(open: boolean) {
-
-
-
-
-
-
-
-
-
-
+
+
+ 此操作将永久清空当前分类下的所有系统事件记录,操作后无法恢复。确认要继续吗?
-
-
- 此操作将永久清空当前分类下的所有系统事件记录,操作后无法恢复。确认要继续吗?
-
-
-
-
-
-
-
+
+
+
+
+
@@ -217,7 +182,7 @@ function onDialogClose(open: boolean) {
:class="[selectedLogId === log.id && 'bg-accent/50']" @click="showDetail(log)">
- #{{ total - (filters.page - 1) * pageSize - index }}
+ #{{ total - (currentPage - 1) * pageSize - index }}
{{ log.title }}
- #{{ total - (filters.page - 1) * pageSize - index }}
+ #{{ total - (currentPage - 1) * pageSize - index }}
diff --git a/web/src/views/notify/components/PushLog.vue b/web/src/views/notify/components/PushLog.vue
index 531f396..de457be 100644
--- a/web/src/views/notify/components/PushLog.vue
+++ b/web/src/views/notify/components/PushLog.vue
@@ -35,6 +35,12 @@ import {
} from '@/components/ui/alert-dialog'
import { useSiteSettings } from '@/composables/useSiteSettings'
+const props = defineProps<{
+ filters: {
+ status: string
+ keyword: string
+ }
+}>()
const { pageSize } = useSiteSettings()
@@ -43,15 +49,7 @@ const selectedLogId = ref(null)
const total = ref(0)
const loading = ref(false)
const showClearConfirm = ref(false)
-
-const filters = ref({
- status: 'all',
- keyword: '',
- page: 1
-})
-
-let searchTimer: ReturnType | null = null
-
+const currentPage = ref(1)
const detailDialogProps = ref({
open: false,
@@ -65,9 +63,9 @@ async function fetchLogs() {
try {
const res = await api.appLogs.list({
category: LOG_CATEGORY.PUSH_LOG,
- status: filters.value.status === 'all' ? undefined : filters.value.status,
- keyword: filters.value.keyword || undefined,
- page: filters.value.page,
+ status: props.filters.status === 'all' ? undefined : props.filters.status,
+ keyword: props.filters.keyword || undefined,
+ page: currentPage.value,
page_size: pageSize.value
})
logs.value = res.data || []
@@ -79,23 +77,8 @@ async function fetchLogs() {
}
}
-function handleSearch() {
- if (searchTimer) clearTimeout(searchTimer)
- searchTimer = setTimeout(() => {
- filters.value.page = 1
- fetchLogs()
- }, 300)
-}
-
-function handlePageChange(page: number) {
- filters.value.page = page
- fetchLogs()
-}
-
-function handleStatusChange(val: any) {
- if (val === null || val === undefined) return
- filters.value.status = String(val)
- filters.value.page = 1
+function handlePageChange(index: number) {
+ currentPage.value = index
fetchLogs()
}
@@ -113,11 +96,12 @@ async function handleClear() {
try {
await api.appLogs.clear(LOG_CATEGORY.PUSH_LOG)
toast.success('清空成功')
- filters.value.page = 1
+ currentPage.value = 1
fetchLogs()
} catch (e: any) {
toast.error('清空失败: ' + (e.message || ''))
}
+ showClearConfirm.value = false
}
onMounted(() => {
@@ -126,6 +110,11 @@ onMounted(() => {
const selectedLog = computed(() => logs.value.find((l: AppLog) => l.id === selectedLogId.value))
+defineExpose({
+ fetchLogs,
+ showClearConfirm
+})
+
function getStatusBadgeClass(status: string) {
switch (status) {
case LOG_STATUS.SUCCESS:
@@ -138,7 +127,7 @@ function getStatusBadgeClass(status: string) {
}
function getLogIndex(index: number) {
- return total.value - (filters.value.page - 1) * pageSize.value - index
+ return total.value - (currentPage.value - 1) * pageSize.value - index
}
function formatDate(dateStr: string) {
@@ -165,52 +154,22 @@ function onDialogClose(open: boolean) {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 确认清空所有推送日志?
-
- 此操作将永久清空当前分类下的所有消息推送历史记录,操作后无法恢复。确认要继续吗?
-
-
-
- 取消
-
- 确认清空
-
-
-
-
-
+
+
+
+ 确认清空所有推送日志?
+
+ 此操作将永久清空当前分类下的所有消息推送历史记录,操作后无法恢复。确认要继续吗?
+
+
+
+ 取消
+
+ 确认清空
+
+
+
+
@@ -306,7 +265,7 @@ function onDialogClose(open: boolean) {
-
+